Tensorflow - tf.nn.conv2D()中的权重值是否发生了变化?

时间:2017-03-26 09:12:30

标签: python machine-learning tensorflow

虽然我正在研究具有张量流的神经网络,但我得到了一个关于tf.nn.conv2D(x,W,strides = [1,1,1,1],padding =' SAME&#39)

当我输入图像值x和权重值W(由tf.truncated_normal(shape,stddev = 0.1)初始化)时,我知道它将返回一些值,这是tf.nn.conv2D()的结果。

但我的问题是,当调用tf.nn.conv2D()时,它是否会改变权重值?

如果它改变了Weight的值,它是如何工作的?实际上,当我打印Weight值时,它会发生变化。但我不知道为什么......我的假设是值W是某种被引用的调用,所以在计算tf.nn.conv2D()时,值W被改变。是不是?

1 个答案:

答案 0 :(得分:1)

Tensorflow代码流与您的传统编程语言不同。首先,从代码创建一个图形(可以使用Tensorboard可视化,然后使用已在内部实现的反向传播计算更新规则。

当你写:

h = tf.nn.conv2D(x, W, strides=[1, 1, 1, 1], padding='SAME')

它在您的神经网络中创建一个卷积层,在您的输入矩阵上执行卷积(http://cs231n.github.io/convolutional-networks/),并在 h 中输出结果。现在,执行这种卷积的整个目的是识别一些局部图案,例如图像中的垂直或水平边缘。例如,权重矩阵 W ,例如

W = [[0,1,0],[0,1,0],[0,1,0]]

将识别图像中的垂直边缘。但是,由于 W 已在此处随机初始化

W = tf.Variable(tf.truncated_normal(shape, stddev=0.1)))

一开始就找不到任何模式。这是通过反向传播解决的。

当您在标记数据上训练您的神经网络时,在每一步都会更新矩阵 W ,以便减少误差E w.r.t W的导数。您无法在代码中看到它发生,因为反向传播是在Tensorflow内部实现的,您只需要为正向传递编写代码。如果您将 W 定义为

W = tf.Variable(tf.truncated_normal(shape, stddev=0.1)),trainable=False)

它不会被更新,但是培训参数的整个目的都将被打败。

我建议您在继续使用Tensorflow之前,先了解http://neuralnetworksanddeeplearning.com以了解神经网络的工作原理。