我正在关注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
显示为列矩阵:
但是,在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]
的变量,这是有道理的。
我的问题是:
Tensorflow是否会自动为x中的每个列矩阵执行softmax操作?
我是否正确假设[无,值]意味着,直觉上,一个可变大小的数组,每个元素都是一个大小值数组?或者[None,value]是否也可能只是一个大小值数组? (没有它在容器数组中)
链接理论描述的正确方法是什么,其中x是列向量与实现,其中x是列矩阵数组?
感谢您的帮助!
答案 0 :(得分:4)
直觉是针对单个输入样本(这就是您看到列向量的原因)。然而,在实践中,使用由许多输入样本组成的小批量进行训练。 (取决于batch_size
)。
x = tf.placeholder(tf.float32, [None, 784])
此行生成尺寸为? x 784
的矩阵,其中?
将表示批量大小。从某种意义上说,列向量已成为这个新矩阵的行。
由于我们已将列向量转换为行,因此我们将x
和W
的乘法顺序互换。这就是为什么您的W
维度为784 x 10
而b
的维度10
将适用于所有元素。
第一次乘法后,x*W
的维度为? x 10
。 b
的每一行都添加了相同的元素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
的转置。