Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 为什么拟合/评估和手动检查之间的二进制交叉熵损失不匹配?_Tensorflow_Keras - Fatal编程技术网

Tensorflow 为什么拟合/评估和手动检查之间的二进制交叉熵损失不匹配?

Tensorflow 为什么拟合/评估和手动检查之间的二进制交叉熵损失不匹配?,tensorflow,keras,Tensorflow,Keras,当我使用二进制交叉熵进行训练或评估时,我得到了巨大的值,但当我手动输入结果时,结果看起来很正常。我做错了什么?我认为在任何情况下,二进制交叉熵都不能超过15.5左右 test_in, test_out1 = makeTestData() test_out2 = np.zeros((1000,1)) model.compile(..., loss=['mean_squared_error', 'binary_crossentropy'], loss_weights=[1.0, 0.001]) m

当我使用
二进制交叉熵进行训练或评估时,我得到了巨大的值,但当我手动输入结果时,结果看起来很正常。我做错了什么?我认为在任何情况下,二进制交叉熵都不能超过15.5左右

test_in, test_out1 = makeTestData()
test_out2 = np.zeros((1000,1))
model.compile(..., loss=['mean_squared_error', 'binary_crossentropy'], loss_weights=[1.0, 0.001])

model.evaluate(test_in,[test_out1, test_out2])
# Result: [0.3238, 0.106, 217.815]

pred = model.predict(test_in)
# np.max(pred[1]) = 1.0, np.min(pred[1]) = 0.0019
K.mean(tf.losses.binary_crossentropy(test_out2, pred[1]))
# Result: 13.31

217.8评估中的损失(和培训,未显示),但手动运行时仅为13.3。

很难确定在这样一个最小的示例中会出现什么问题。我有两个理论:

  • 手动运行与非手动运行时,您的数据不同。这里有点不对劲,正是因为这个才爆炸的

  • “手动”与“非手动”运行时,您的评估模式不同,您陷入了以下困境:


  • 如果后者看起来是真的,那么尝试直接传递logit而不做sigmoid,看看是否可以得到一致的值。此外,您可以尝试传入What's
    makeTestData()
    ?您的网络架构是什么?你有多个输出吗?我实际的事情有很多复杂性,我认为这与我无关。它也在一个与互联网隔离的系统上,所以我不能把它粘贴进去。makeTestData()是虚构的,只是为了设置问题。真正的问题是,总的来说,在这些情况下,我如何能得到截然不同的损失?是的,它有多个输出。请举一个可重复的例子。我真的只是想知道在什么情况下,通过损失函数运行预测会产生与评估截然不同的结果。我在连接互联网的机器上没有我能提供的代码。我想你在使用#2。我并没有为了移除sigmoid而破坏我的模型,但我越想,如果eval在引擎盖下使用logits,我认为在某些情况下,它可能会有更大的损失,因为logit的大小可能相当大,例如,仍然映射到1.0。不使用logit的代码依赖于一个epsilon因子来保护日志,该因子将损失限制在15-16左右,而我认为基于logit的损失几乎是无限的。我需要在这里做更多的实验。你也可以在你的模型末尾加入一个标识操作来标准化行为。这个当前的条件是超脆的,一个快速的实验显示了这里会发生什么。比较tf.loss.binary_交叉熵([0.],[tf.sigmoid(x)])和tf.loss.binary_交叉熵([0.],[x],from_logits=True)。对于小x,答案非常接近。对于大x,前者的上限约为15.5,而后者继续增长。例如,对于225的x,损失为225。
      if (not isinstance(output, (ops.EagerTensor, variables_module.Variable)) and
          output.op.type == 'Sigmoid') and not hasattr(output, '_keras_history'):
        # When sigmoid activation function is used for output operation, we
        # use logits from the sigmoid function directly to compute loss in order
        # to prevent collapsing zero when training.
        # ... computes using logits
    
      # ... computes manually with clipping