Tensorflow – tf.nn.conv2D()中的权重值是否会改变?

我在学习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,以了解神经网络的工作原理。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注