这里的代码:
https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py
具体而言,第53行:
xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
为什么交叉熵乘以original_dim?另外,这个函数是否只计算批处理维度的交叉熵(我注意到没有axis输入)?很难从文件中看出..。
发布于 2018-04-24 02:05:40
Keras metrics.binary_crossentropy计算所有输入的交叉熵平均值(伪码):
original_dim = 3
x = [1,1,0]
x_decoded = [0.2393,0.7484,-1.1399]
average_BCE = binary_crossentropy(x, x_decoded)
print(average_BCE)
>>>0.1186对于自动编码器丢失的这一部分,我们需要和,而不是输入和输出像素之间所有平方差的平均值,这相当于average_crossentropy_of_pixels * num_pixels (original_dim)。
print(original_dim * average_BCE)
>>>0.3559另一种编写这一部分的方法是(我认为这更能说明正在发生的事情,但在Keras land中可能没有那么好的表现):
xent_loss = K.sum(K.square(x - sigmoid(x_decoded)))
print(xent_loss)
>>>0.3559关于第二部分,因为第一个操作是减法,这意味着输入和输出的张量是相同的。如果您检查实现代码(这比本例中的文档更好),可以找到这一点,请转到第3056行:https://github.com/keras-team/keras/blob/master/keras/backend/tensorflow_backend.py。
发布于 2018-04-24 16:20:27
# Do Keras' binary cross entropy
x = Input(shape=(3,))
x_decoded = Input(shape=(3,))
bce = metrics.binary_crossentropy(x,x_decoded)
sess = K.get_session()
with sess.as_default():
print(bce.eval(feed_dict={x: np.array([[1,1,0]]),
x_decoded: np.array([[0.2393,0.7484,-1.1399]])}))
# Do the same thing in numpy directly
epsilon = 1e-7
x = np.array([1,1,0])
x_decoded = np.array([0.2393,0.7484,-1.1399])
output = np.clip(x_decoded, epsilon, 1-epsilon)
output = -x * np.log(output) - (1 - x) * np.log(1 - output)
print(np.mean(output, axis=-1))输出:
[0.57328504]
0.5732850228833389所以问题是mean。应该是sum。此外,我猜他们用epsilon做了一些事情,以防止奇怪的边缘情况,可能会使它爆炸。
https://datascience.stackexchange.com/questions/30716
复制相似问题