【发布时间】:2020-01-12 08:47:30
【问题描述】:
我正在实现一个与多实例学习层耦合的 CNN。简而言之,我得到了这个,C 是类别的数量:
[1 batch of images, 1 label] > CNN > Custom final layer -> [1 vector of size C]
我的最后一层只是暂时总结了上一层。需要明确的是,1 批输入仅给出 1 个单一输出。因此,批次对应于在与 1 个标签关联的 1 个单袋中提取的多个实例。
当我训练我的模型并使用相同的集合对其进行验证时:
history = model.fit_generator(
generator=training_generator,
steps_per_epoch=training_set.batch_count,
epochs=max_epoch,
validation_data=training_generator
validation_steps=training_set.batch_count)
尽管训练集和验证集相同,但我得到了 2 个不同的结果:
35/35 [==============================] - 30s 843ms/step - loss: 1.9647 - acc: 0.2857 - val_loss: 1.9403 - val_acc: 0.3714
损失函数只是在 Keras 中实现的分类交叉熵(我有 3 个类别)。我已经实现了自己的损失函数,以了解发生了什么。不幸的是,我在常规损失和我的自定义损失函数之间发现了另一个不一致:
35/35 [==============================] - 30s 843ms/step - loss: 1.9647 - acc: 0.2857 - bag_loss: 1.1035 - val_loss: 1.9403 - val_acc: 0.3714 - val_bag_loss: 1.0874
我的损失函数:
def bag_loss(y_true, y_predicted):
y_true_mean = keras.backend.mean(y_true, axis=0, keepdims=False)
y_predicted_mean = keras.backend.mean(y_predicted, axis=0, keepdims=False)
loss = keras.losses.categorical_crossentropy(y_true_mean, y_predicted_mean)
return loss
我的模型的最后一层(为了简洁,我只展示了调用部分):
def call(self, x):
x = kb.sum(x, axis=0, keepdims=True)
x = kb.dot(x, self.kernel)
x = kb.bias_add(x, self.bias)
out = kb.sigmoid(x)
return out
在使用 TensorBoard 和 TensorFlow 调试器检查代码后,我发现我的 beg loss 和常规 loss 在某些时候返回相同的值。但是随后,Keras 对常规 sigmoid 损失执行了 6 次补充添加(我的模型中的每一层都有 1 次)。有人可以帮我解决这个令人惊讶的结果吗?我希望常规损失、验证损失和我的包损失是相同的。
【问题讨论】:
-
我意识到我的网络的馈送在某些时候涉及一个随机过程(我正在使用数据生成器)。尽管我使用相同的数据集进行训练和验证,但随机状态并不相同。当我为每个集合(实际上是每个生成器)提供相同的状态时,我在 bag_loss 和 val_bag_loss 之间检索到一致的结果。但是,我仍然没有解释loss和bag_loss的区别。
标签: keras loss cross-entropy