不理解TensorFlow MNIST指南中使用的代码

我在阅读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)

现在我试图分解最后一行来弄清楚发生了什么。

他们提供了以下图表:

enter image description here

忽略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的向量包含每个类别的得分。每个得分都考虑了每个像素,更准确地说,它是所有像素值的加权和。然后这个得分进入损失函数,与真实值进行比较,以便在下一次迭代中我们可以调整那些权重朝正确的方向调整。

尽管它非常简单,但仍然是一种合理的做法。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注