了解Tensorflow MNIST教程 - 输入x是列矩阵还是列矩阵数组?

时间:2016-12-06 14:36:22

标签: python machine-learning tensorflow mnist

我正在关注Tensorflow MNIST tutorial

通过理论/直觉部分,我开始理解 #include<iostream> using namespace std; #define size 10 class mergesort { public: mergesort(){} void merge(int a[]) { int mid = 5; if (size < 2) return; int left[size]; int right[size]; for (int i = 0; i < mid; i++) { left[i] = a[i]; } for (int j = mid; j < size-1; j++) { right[j-mid] = a[j]; } merge(left); merge(right); sort(left, right, a, mid, size-mid); } void sort(int left[], int right[], int a[], int L, int R) { int i = 0; int j = 0; int k = 0; while (i < L && j < R) { if (left[i] <= right[j]) { a[k] = left[i]; k++; i++; } else if (right[j] < left[i]) { a[k] = right[j]; k++; j++; } } while (i < L) { a[k] = left[i]; k++; i++; } while (i < R) { a[k] = right[j]; k++; j++; } } }; void main() { mergesort m; int a[size]; cout << "Enter the elements:" << endl; for (int i = 0; i < size; i++) { cin >> a[size]; } m.merge(a); } 输入,作为列矩阵。

事实上,在描述x时,softmax显示为列矩阵:

softmax intuition, with x clearly being shown as a column matrix

但是,在x中声明,x看起来像这样:

tensorflow

我读了一个x = tf.placeholder(tf.float32, [None, 784]) 是一个可变长度(None)的数组,这个数组的每个元素都是一个大小为784的列矩阵。

即使x被声明为列矩阵数组,它也就像它只是一个列矩阵一样使用:

x

在示例中,y = tf.nn.softmax(tf.matmul(x, W) + b) W被直接声明为形状b[784, 10]的变量,这是有道理的。

我的问题是:

  1. Tensorflow是否会自动为x中的每个列矩阵执行softmax操作?

  2. 我是否正确假设[无,值]意味着,直觉上,一个可变大小的数组,每个元素都是一个大小值数组?或者[None,value]是否也可能只是一个大小值数组? (没有它在容器数组中)

  3. 链接理论描述的正确方法是什么,其中x是列向量与实现,其中x是列矩阵数组?

  4. 感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

直觉是针对单个输入样本(这就是您看到列向量的原因)。然而,在实践中,使用由许多输入样本组成的小批量进行训练。 (取决于batch_size)。

x = tf.placeholder(tf.float32, [None, 784])

此行生成尺寸为? x 784的矩阵,其中?将表示批量大小。从某种意义上说,列向量已成为这个新矩阵的行。

由于我们已将列向量转换为行,因此我们将xW的乘法顺序互换。这就是为什么您的W维度为784 x 10b的维度10将适用于所有元素。 第一次乘法后,x*W的维度为? x 10b的每一行都添加了相同的元素x*W。因此,如果我的第一行x*W[1,2,3,4,5,6,7,8,9,0]b[1,1,1,1,1,1,1,1,1,1],则结果的第一行将为[2,3,4,5,6,7,8,9,10,1]。如果您发现很难理解,请尝试转换W*x

回答你的问题,

  

Tensorflow是否自动对x?

中的每个列矩阵执行softmax操作

是的,在您的背景下。 TensorFlow将softmax应用于维度1的所有元素(上面解释中的所有行)。因此,生成的softmax结果也会包含维? x 10

  

我是否正确假设[None,value]意味着,直觉上,一个可变大小的数组,每个元素都是一个大小值数组?或者[None,value]是否也可能只是一个大小值数组? (没有它在容器数组中)

是的,前者是正确的解释。另请参阅上面的?矩阵类比。

  

链接理论描述的正确方法是什么,其中x是列向量与实现,其中x是列矩阵数组?

我个人将此解释为W*x的转置。通过详细说明,让x为多个列向量,[x1 x2 x3 x4 x5 ...]具有维度784 x ?,其中?是批量大小。让W具有维度10 x 784。如果您在每列上应用W,则会获得[W*x1 W*x2 W*x3...]或多个维度为10的列向量,并提供净矩阵维10 x ?

对您的代码中的trans(W*x) = trans(x)*trans(W)x进行整个操作W的转置。