输出的第一个值

时间:2018-04-12 16:02:24

标签: python neural-network keras artificial-intelligence conv-neural-network

我的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很奇怪,而输出和输入具有相同的形状。

有没有办法解决它或解决方法?

感谢您的帮助。

1 个答案:

答案 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)