损失函数结果与Keras的不一致性

损失函数结果与Keras的不一致性,keras,loss,cross-entropy,Keras,Loss,Cross Entropy,我正在实现一个耦合到多实例学习层的CNN。简言之,我得到了这个,用C表示类别数: [1 batch of images, 1 label] > CNN > Custom final layer -> [1 vector of size C] 我的最后一层只是总结了目前的前一层。需要说明的是,一批输入只提供一个输出。因此,该批次对应于在与一个标签关联的一个袋子中提取的多个实例 当我训练我的模型并用同一组进行验证时: history = model.fit_generat

我正在实现一个耦合到多实例学习层的CNN。简言之,我得到了这个,用C表示类别数:

    [1 batch of images, 1 label] > CNN > Custom final layer -> [1 vector of size C]
我的最后一层只是总结了目前的前一层。需要说明的是,一批输入只提供一个输出。因此,该批次对应于在与一个标签关联的一个袋子中提取的多个实例

当我训练我的模型并用同一组进行验证时:

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)
我在培训和验证集之间得到了两个不同的结果,尽管它们是相同的:

  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
我的损失函数:

  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
我的模型的最后一层(为了简洁起见,我只显示了调用部分):


在使用TensorBoard和TensorFlow调试器检查代码之后,我发现,实际上,我的beg损失和常规损失在somme点返回相同的值。但是,kera在常规的sigmoid损失上进行了6次补充添加(在我的模型中,每层1次)。有人能帮我把这个意外的结果纠结在一起吗?我希望常规丢失、验证丢失和我的包丢失是一样的。

好的,我终于找到了罪魁祸首:L2正则化,它被打开了,而我认为它被关闭了。为了计算有效损耗,交叉熵中明显增加了调节项。
大多数情况下,睡个好觉和仔细检查代码就足以回答您的问题

我意识到我的网络的馈送在某一点上涉及到一个随机过程(我正在使用一个数据生成器)。虽然我使用相同的数据集进行训练和验证,但随机状态并不相同。当我为每个机组(事实上是每个发电机)提供相同的状态时,我检索到bag_loss和val_bag_loss之间的一致结果。然而,我仍然没有解释损失和行李损失之间的区别。