我的CNN有ouput
[[a,b,c,d,e],[a1,b1,c1,d1,e1]...]
然而,“a”代表其他人所代表的框中存在的某些分数。
我希望用例如二元交叉萎缩和其他MSE来计算“a”
在标签中,a为1(其他值为非零)或0(其他值均为零)
所以我希望a在输出中介于0到1之间。
我试图创建自己的损失函数:
def custom_loss(y_true,y_pred):
return K.mean(K.binary_crossentropy(y_true[0], y_pred[0]), axis=-1) + K.mean(K.square(y_pred[1:] - y_true[1:]), axis=-1)
然而,它会引发非常强大的错误,下面的部分是提供大多数信息的部分(我认为)
InvalidArgumentError (see above for traceback): Incompatible shapes: [4] vs. [5]
[[Node: loss/predictions_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](loss/predictions_loss/Mean_2, _arg_predictions_sample_weights_0_2/_1191)]]
[[Node: loss/mul/_1305 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_12439_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
是什么导致这个?形状4 v 5很奇怪,而输出和输入具有相同的形状。
有没有办法解决它或解决方法?
感谢您的帮助。
答案 0 :(得分:1)
我假设您的输出形状为(samples, boxes, 5)
。
<强>解决方案强>
def custom_loss(y_true,y_pred):
cross = K.mean(K.binary_crossentropy(y_true[:,:,:1], y_pred[:,:,:1]), axis=-1)
mse = K.mean(K.square(y_pred[:,:,1:] - y_true[:,:,1:]), axis=-1)
return cross + mse
如果由于cross
形状与mse
不同而仍然存在不兼容性,您可能需要进一步K.mean()
,直到它们都保持形状(samples, boxes)
或只是(samples,)
。
如果您不打算使用任何类型的样本加权,只需从中删除axis=-1
即可。
错误维度
不要忘记张量的第一个维度是样本,所以你需要从最后一个维度取a
(因为第二维是“盒子”):
y_true[:,:,:1]
的形状为(samples, boxes, 1)
y_true[:,:,1:]
的形状为(samples, boxes, 4)
我正在使用:1
来保留最后一个维度,如果仅使用0
,则形状将为(samples, boxes)
。