【问题标题】:DIfferent loss functions for first value of output第一个输出值的不同损失函数
【发布时间】:2018-04-12 16:02:23
【问题描述】:

我有带有输出的 CNN

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

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

感谢您的帮助。

【问题讨论】:

  • 你的输出形状是(samples, 5)还是(samples, boxes 5)
  • (samples,boxes,5) ,至少我认为是,我在 keras 中仍然没有很好地定位,形状打印 (?,15,4)
  • model.summary() 中的最后一个形状是什么?
  • 它的 (none,15,4)
  • 对不起,错字,它的 (none,15,5) ,我只有一个输出

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


【解决方案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

如果由于crossmse 的形状不同而导致您仍然不兼容,您可能应该进一步使用K.mean(),直到它们都保持类似(samples, boxes) 或只是(samples,) 的形状。

如果您不打算使用任何类型的样本加权,您可以从平均值中删除 axis=-1

尺寸错误

不要忘记张量的第一个维度是样本,所以你需要从最后一个维度取a(因为第二个维度是“boxes”):

  • y_true[:,:,:1] 有形状 (samples, boxes, 1)
  • y_true[:,:,1:] 有形状 (samples, boxes, 4)

我使用:1 保留最后一个维度,如果您只使用0,则形状将为(samples, boxes)

【讨论】:

  • 我有一个问题,使用这个第一个输出在 0 和 1 之间没有标准化,为什么会这样?损失函数不应该这样做吗?
  • keras 中的任何地方都没有“自动”规范化。如果您想要标准化值,您需要显式调用激活、标准化和自定义层。
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2019-09-05
  • 2019-06-23
  • 2018-07-13
相关资源
最近更新 更多