我正在尝试实现一个自定义损失函数
def lossFunction(self,y_true,y_pred): maxi=K.argmax(y_true) return K.mean((K.max(y_true) -(K.gather(y_pred,maxi)))**2)
训练时出现以下错误
InvalidArgumentError(参见上面的回溯):indices[5] = 51 不在 [0, 32) 范围内 [[Node: loss/dense_3_loss/Gather = Gather[Tindices=DT_INT64, Tparams=DT_FLOAT, validate_indices=true, _device=”/job:localhost/replica:0/task:0/device:CPU:0″](dense_3/BiasAdd, metrics/acc/ArgMax)]]
模型摘要
_________________________________________________________________________________________层(类型) 输出形状 参数数 连接到 ====================================================================================================input_1(输入层) (None, 64, 50, 1) 0 ____________________________________________________________________________________________________input_2(输入层) (None, 64, 50, 1) 0 ____________________________________________________________________________________________________conv2d_1(Conv2D) (None, 32, 25, 16) 272 input_1[0][0] ____________________________________________________________________________________________________conv2d_2(Conv2D) (None, 32, 25, 16) 272 input_2[0][0] ____________________________________________________________________________________________________max_pooling2d_1(MaxPooling2D) (None, 16, 12, 16) 0 conv2d_1[0][0] ____________________________________________________________________________________________________max_pooling2d_2(MaxPooling2D) (None, 16, 12, 16) 0 conv2d_2[0][0] ____________________________________________________________________________________________________conv2d_3(Conv2D) (None, 15, 11, 32) 2080 max_pooling2d_1[0][0] ____________________________________________________________________________________________________conv2d_4(Conv2D) (None, 15, 11, 32) 2080 max_pooling2d_2[0][0] ____________________________________________________________________________________________________max_pooling2d_3(MaxPooling2D) (None, 8, 6, 32) 0 conv2d_3[0][0] ____________________________________________________________________________________________________max_pooling2d_4(MaxPooling2D) (None, 8, 6, 32) 0 conv2d_4[0][0] ____________________________________________________________________________________________________flatten_1(Flatten) (None, 1536) 0 max_pooling2d_3[0][0] ____________________________________________________________________________________________________flatten_2(Flatten) (None, 1536) 0 max_pooling2d_4[0][0] ____________________________________________________________________________________________________concatenate_1(Concatenate) (None, 3072) 0 flatten_1[0][0] flatten_2[0][0] ____________________________________________________________________________________________________input_3(输入层) (None, 256) 0 ____________________________________________________________________________________________________concatenate_2(Concatenate) (None, 3328) 0 concatenate_1[0][0] input_3[0][0] ____________________________________________________________________________________________________dense_1(Dense) (None, 512) 1704448 concatenate_2[0][0] ____________________________________________________________________________________________________dense_2(Dense) (None, 256) 131328 dense_1[0][0] ____________________________________________________________________________________________________dense_3(Dense) (None, 256) 65792 dense_2[0][0] ====================================================================================================总参数:1,906,272可训练参数:1,906,272不可训练参数:0
回答:
Argmax是从最后一个轴取值,而gather是从第一个轴取值。两个轴的元素数量不同,因此这是预期的结果。
如果只处理类别,请使用最后一个轴,因此我们需要对gather方法进行一些调整:
def lossFunction(self,y_true,y_pred): maxi=K.argmax(y_true) #ok #反转轴 y_pred = K.permute_dimensions(y_pred,(1,0)) return K.mean((K.max(y_true,axis=-1) -(K.gather(y_pred,maxi)))**2)