gpt4 book ai didi

python - 为什么对激活值 (Softmax) 的预测会给出错误的结果?

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:56 26 4
gpt4 key购买 nike

我使用 Tensorflow 从头开始​​实现了一个基本的神经网络,并在 MNIST 时尚数据集上对其进行了训练。它经过正确训练,并在 10 个类别中输出大约 ~88-90% 的测试准确度。

现在我已经编写了 predict() 函数,它使用经过训练的权重预测给定图像的类别。这是代码:

def predict(images, trained_parameters):

Ws, bs = [], []
parameters = {}

for param in trained_parameters.keys():
parameters[param] = tf.convert_to_tensor(trained_parameters[param])

X = tf.placeholder(tf.float32, [images.shape[0], None], name = 'X')
Z_L = forward_propagation(X, trained_parameters)

p = tf.argmax(Z_L) # Working fine
# p = tf.argmax(tf.nn.softmax(Z_L)) # not working if softmax is applied

with tf.Session() as session:
prediction = session.run(p, feed_dict={X: images})

return prediction

这使用 forward_propagation() 函数返回最后一层 (Z) 的加权和而不是事件 (A) 因为TensorFlows tf.nn.softmax_cross_entropy_with_logits() 需要 Z 而不是 A 因为它将通过应用 softmax 计算 A引用this link for details.

现在在 predict() 函数中,当我使用 Z 而不是 A (激活)进行预测时,它工作正常。如果我在 Z(这是最后一层的激活 A)上计算 softmax,它会给出不正确的预测。

为什么它对加权和 Z 给出正确的预测?我们不应该首先应用 softmax 激活(并计算 A)然后进行预测?

如果有人想查看我的整个代码,这里是我的 colab notebook 的链接:Link to Notebook Gist

那么我在这里缺少什么?

最佳答案

大多数 TF 函数,例如 tf.nn.softmax ,默认情况下假设批量维度是第一个 - 这是一种常见的做法。现在,我在您的代码中注意到您的批量维度是第二个,即您的输出形状是 (output_dim=10, batch_size=?),结果是 tf.nn.softmax 正在计算批量维度上的 softmax 激活。

不遵守约定并没有什么错 - 只是需要了解它们。沿第一个轴计算 softmax 的 argmax 应该会产生所需的结果(它相当于采用 logits 的 argmax):

p = tf.argmax(tf.nn.softmax(Z_L, axis=0))

此外,我还建议沿第一个轴计算 argmax,以防将多个图像输入网络。

关于python - 为什么对激活值 (Softmax) 的预测会给出错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57346868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com