不理解 TensorFlow MNIST 指南中使用的代码
Not understanding code used in TensorFlow MNIST guide
我正在阅读 MNIST TensorFlow guide,并试图更好地理解正在发生的事情。
添加了注释的第一组步骤如下所示:
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# Download the data set.
# Comprises thousands of images, each with a label.
# Our images are 28x28, so we have 784 pixels in total.
# one_hot means our labels are treated as a vector with a
# length of 10. e.g. for the number 4, it'd be
# [0, 0, 0, 0, 1, 0, 0, 0, 0, 0].
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# x isn't a specific value. It's a placeholder, a value that
# we'll input when we ask TensorFlow to run a computation.
# We want to input any number of MNIST images, each flattened
# into a 784-dimensional vector (e.g. an array made up of a
# double for each pixel, representing pixel brightness).
# Takes the form of [Image, Pixel].
x = tf.placeholder(tf.float32, [None, 784])
# Variables are modifiable tensors, which live in TensorFlow's
# graph of interacting operations. It can be used and modified
# by the computation. Model parameters are usually set as Variables.
# Weights
# Takes the form of [Pixel, Digit]
W = tf.Variable(tf.zeros([784, 10]))
# Biases
# Takes the form of [Digit]
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 值是该图像中的每个像素。因此我们有:
(Weight of 1st pixel for 1st digit * value of 1st pixel) + (Weight of 1st pixel for 2nd digit * value of 2nd pixel) + (Weight of 1st pixel for 3rd digit * value of 3rd pixel)
这似乎不对。权重张量的第一维表示像素,其中 x
张量的第二维表示像素,意味着我们将不同像素的值相乘......这对我来说没有任何意义。
我是不是误会了什么?
这个模型非常简单,可能不值得深入讨论,但你的结论是不正确的。像素值永远不会相乘。这是一个线性模型:
tf.matmul(x, W) + b
...天真地假设图像是一堆独立的像素。每个像素乘以对应于 10 classes 的不同权重。换句话说,这个线性层为每个 (pixel, class)
对分配一个权重。这直接对应于它的形状:[784, 10]
(为简单起见,我忽略了偏置项)。
作为乘法的结果,最终的 10 长向量包含每个 class 的分数。每个分数都考虑了每个像素,更准确地说,它是所有像素值的 加权和 。然后分数进入损失函数以将输出与地面实况进行比较,以便在下一次迭代中我们可以在正确的方向上调整这些权重。
虽然很简单,但不失为一种合理的做法。
我正在阅读 MNIST TensorFlow guide,并试图更好地理解正在发生的事情。
添加了注释的第一组步骤如下所示:
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# Download the data set.
# Comprises thousands of images, each with a label.
# Our images are 28x28, so we have 784 pixels in total.
# one_hot means our labels are treated as a vector with a
# length of 10. e.g. for the number 4, it'd be
# [0, 0, 0, 0, 1, 0, 0, 0, 0, 0].
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# x isn't a specific value. It's a placeholder, a value that
# we'll input when we ask TensorFlow to run a computation.
# We want to input any number of MNIST images, each flattened
# into a 784-dimensional vector (e.g. an array made up of a
# double for each pixel, representing pixel brightness).
# Takes the form of [Image, Pixel].
x = tf.placeholder(tf.float32, [None, 784])
# Variables are modifiable tensors, which live in TensorFlow's
# graph of interacting operations. It can be used and modified
# by the computation. Model parameters are usually set as Variables.
# Weights
# Takes the form of [Pixel, Digit]
W = tf.Variable(tf.zeros([784, 10]))
# Biases
# Takes the form of [Digit]
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 值是该图像中的每个像素。因此我们有:
(Weight of 1st pixel for 1st digit * value of 1st pixel) + (Weight of 1st pixel for 2nd digit * value of 2nd pixel) + (Weight of 1st pixel for 3rd digit * value of 3rd pixel)
这似乎不对。权重张量的第一维表示像素,其中 x
张量的第二维表示像素,意味着我们将不同像素的值相乘......这对我来说没有任何意义。
我是不是误会了什么?
这个模型非常简单,可能不值得深入讨论,但你的结论是不正确的。像素值永远不会相乘。这是一个线性模型:
tf.matmul(x, W) + b
...天真地假设图像是一堆独立的像素。每个像素乘以对应于 10 classes 的不同权重。换句话说,这个线性层为每个 (pixel, class)
对分配一个权重。这直接对应于它的形状:[784, 10]
(为简单起见,我忽略了偏置项)。
作为乘法的结果,最终的 10 长向量包含每个 class 的分数。每个分数都考虑了每个像素,更准确地说,它是所有像素值的 加权和 。然后分数进入损失函数以将输出与地面实况进行比较,以便在下一次迭代中我们可以在正确的方向上调整这些权重。
虽然很简单,但不失为一种合理的做法。