我在阅读MNIST TensorFlow指南,并试图深入理解其中的内容。
第一组步骤,添加了注释后如下所示:
from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf# 下载数据集。
# 包含数千张图像,每张图像都有一个标签。
# 我们的图像是28x28,所以总共有784个像素。
# one_hot表示我们的标签被视为一个长度为10的向量。例如,对于数字4,它将是
# [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)# x不是一个具体的值。它是一个占位符,是我们在请求TensorFlow运行计算时输入的值。
# 我们希望输入任意数量的MNIST图像,每张图像被展平成一个784维的向量(例如,一个由每个像素的双精度数组成的数组,表示像素亮度)。
# 形式为[图像, 像素]。
x = tf.placeholder(tf.float32, [None, 784])# 变量是可修改的张量,它们存在于TensorFlow的交互操作图中。它可以被计算使用和修改。模型参数通常设置为变量。
# 权重
# 形式为[像素, 数字]
W = tf.Variable(tf.zeros([784, 10]))# 偏置
# 形式为[数字]
b = tf.Variable(tf.zeros([10]))y = tf.nn.softmax(tf.matmul(x, W) + b)
现在我试图分解最后一行来弄清楚发生了什么。
他们提供了以下图表:
忽略softmax
步骤,忽略偏置的添加,只看顶部的那一行:
(W1,1 * x1) + (W1,2 * x2) + (W1,3 * x3)
。
由于x现在是一维的,我假设它特定于某张图像,因此x值是该图像中的每个像素。因此我们有:
(第1个数字第1个像素的权重 * 第1个像素的值) + (第2个数字第1个像素的权重 * 第2个像素的值) + (第3个数字第1个像素的权重 * 第3个像素的值)
这似乎不对。权重张量的第一维表示像素,而x
张量的第二维表示像素,这意味着我们正在乘以不同像素的值…这对我来说没有任何意义。
我是不是误解了什么?
回答:
这个模型非常简单,可能不值得深入讨论,但你的结论是不正确的。像素值从不相乘。这是一个线性模型:
tf.matmul(x, W) + b
… 它简单地假设图像是一堆独立的像素。每个像素被乘以对应于10个类别的不同权重。换句话说,这个线性层为每个(像素, 类别)
对分配了一个权重。这直接对应于其形状:[784, 10]
(为了简化,我忽略了偏置项)。
由于这种乘法,最终得到的长度为10的向量包含每个类别的得分。每个得分都考虑了每个像素,更准确地说,它是所有像素值的加权和。然后这个得分进入损失函数,与真实值进行比较,以便在下一次迭代中我们可以调整那些权重朝正确的方向调整。
尽管它非常简单,但仍然是一种合理的做法。