我在学习Tensorflow的神经网络时,对tf.nn.conv2D(x, W, strides=[1, 1, 1, 1], padding=’SAME’)有了一些疑问。
当我输入图像值x和权重值W(通过tf.truncated_normal(shape, stddev=0.1)初始化),我理解它会返回tf.nn.conv2D()的结果值。
但我的问题是,当调用tf.nn.conv2D()时,它是否会改变权重值?
如果它改变了权重值,它是如何工作的?事实上,当我打印权重值时,它确实发生了变化。但我不知道为什么……我的假设是值W是某种按引用调用的形式,因此在计算tf.nn.conv2D()时,值W被改变了。这对吗?
回答:
Tensorflow的代码流程与传统编程语言不同。首先,代码会创建一个图(可以使用Tensorboard可视化),然后使用反向传播计算更新规则,这在内部已实现。
当你编写:
h = tf.nn.conv2D(x, W, strides=[1, 1, 1, 1], padding='SAME')
它会在你的神经网络中创建一个卷积层,对你的输入矩阵进行卷积(http://cs231n.github.io/convolutional-networks/),并将结果输出到h中。现在,执行这种卷积的整个目的是识别图像中的一些局部模式,例如垂直或水平边缘。例如,一个像
W = [[0,1,0],[0,1,0],[0,1,0]]
这样的权重矩阵W将识别图像中的垂直边缘。然而,由于这里W是随机初始化的
W = tf.Variable(tf.truncated_normal(shape, stddev=0.1)))
在开始时无法找到任何模式。这是通过反向传播解决的。
当你在标记数据上训练你的神经网络时,每一步矩阵W都会被更新,以减少误差E相对于W的导数。你在代码中看不到这个过程,因为反向传播在Tensorflow中是内部实现的,你只需要编写前向传播的代码。如果你将W定义为
W = tf.Variable(tf.truncated_normal(shape, stddev=0.1)),trainable=False)
它就不会被更新,但这样做就失去了训练参数的整个目的。
我建议你在继续学习Tensorflow之前,先浏览一下http://neuralnetworksanddeeplearning.com,以了解神经网络的工作原理。