不理解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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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