Tensorflow 张量流预测

Tensorflow 张量流预测,tensorflow,mnist,Tensorflow,Mnist,我正在研究这一点,我在下面的代码中发现:在评估预测时,他运行精度,这运行正确的变量,这反过来运行预测,这将使用随机数重新初始化权重,并重建NN模型。这是怎么回事?我错过了什么 def神经网络模型(数据): 隐藏的_1_层={'weights':tf.Variable(tf.random_normal([784,n_nodes_hl1]), “偏差”:tf.Variable(tf.random_normal([n_nodes_hl1])) 隐藏的_2_层={'weights':tf.Variabl

我正在研究这一点,我在下面的代码中发现:在评估预测时,他运行精度,这运行正确的变量,这反过来运行预测,这将使用随机数重新初始化权重,并重建NN模型。这是怎么回事?我错过了什么

def神经网络模型(数据):
隐藏的_1_层={'weights':tf.Variable(tf.random_normal([784,n_nodes_hl1]),
“偏差”:tf.Variable(tf.random_normal([n_nodes_hl1]))
隐藏的_2_层={'weights':tf.Variable(tf.random_normal([n_nodes_hl1,n_nodes_hl2]),
“偏差”:tf.Variable(tf.random_normal([n_nodes_hl2]))
隐藏的_3_层={'weights':tf.Variable(tf.random_normal([n_nodes_hl2,n_nodes_hl3]),
“偏差”:tf.Variable(tf.random_normal([n_nodes_hl3]))
输出_层={'weights':tf.Variable(tf.random_normal([n_节点_hl3,n_类]),
“偏差”:tf.Variable(tf.random_normal([n_类]),}
l1=tf.add(tf.matmul(数据,隐藏层['weights')),隐藏层['biases'))
l1=tf.nn.relu(l1)
l2=tf.add(tf.matmul(l1,隐藏的\u 2\u层['权重]),隐藏的\u 2\u层['偏差])
l2=tf.nn.relu(l2)
l3=tf.add(tf.matmul(l2,隐藏层['weights')),隐藏层['biases'))
l3=tf.nn.relu(l3)
输出=tf.matmul(l3,输出层['weights'])+输出层['biases']
返回输出
def系列神经网络(x):
预测=神经网络模型(x)
成本=tf.reduce\u mean(tf.nn.softmax\u cross\u熵与logits(预测,y))
优化器=tf.train.AdamOptimizer()。最小化(成本)
hm_时代=10
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
对于范围内的历元(hm_历元):
历元损失=0
对于范围内的(int(mnist.train.num\u示例/批次大小)):
历元x,历元y=mnist.train.next\u批次(批次大小)
_,c=sess.run([optimizer,cost],feed_dict={x:epoch_x,y:epoch_y})
历元损失+=c
打印('Epoch',Epoch,'completed of',hm_epochs,'loss:',Epoch_loss)
correct=tf.equal(tf.argmax(预测,1),tf.argmax(y,1))
准确度=tf.reduce_平均值(tf.cast(正确的“浮动”))
打印('accurity:',accurity.eval({x:mnist.test.images,y:mnist.test.labels}))
训练神经网络(x)

你几乎做对了。
精度
张量间接取决于
预测
张量,它取决于张量
x
。在您的代码片段中,您没有包括
x
实际上是什么;但是,在链接教程中:

x=tf.placeholder('float',[None,784])
y=tf.占位符('float')
因此,
x
是一个占位符,即直接从用户处获取其值的张量。从文章的最后一行还不完全清楚

训练神经网络(x)
他实际上并不是在调用一个转换函数
train\u neural\u network(x)
,它接受一个
x
并动态处理它,就像你从常规函数中所期望的那样;相反,该函数使用对先前定义的占位符变量(实际上是假人)的引用来定义计算图,然后使用会话直接执行。 然而,该图仅使用
神经网络模型(x)
构建一次,然后查询给定数量的历元

你错过的是:

运行([optimizer,cost],feed\u dict={x:epoch\u x,y:epoch\u y}) 如果输入值为
x
epoch\ux
,以及
y
epoch\uy
,则查询
优化器
操作的结果和
成本
张量,通过所有定义的计算节点将数据拉回到
x
。为了获得
成本
,还需要
y
。两者都由调用者提供。
AdamOptimizer
将更新所有可训练变量作为其执行的一部分,从而改变网络的权重

此后,

accurity.eval({x:mnist.test.images,y:mnist.test.labels})
或者,相当于

sess.run(准确度,feed_dict={x:mnist.test.images,y:mnist.test.labels})
然后对同一图形进行另一次求值(不更改),但这次使用
mnist.test.images
for
x
mnist.test.labels
for
y
的输入。 它之所以能工作,是因为
预测
本身取决于
x
,它在每次调用
sess.run(…)
时都会被用户提供的值覆盖

这是TensorBoard中的图形。很难说,但两个占位符节点位于左下角,紧挨着名为“Variable”的橙色节点,位于右中,绿色“Slice_1”的下方

下面是网络图的相关部分的样子;我用TensorBoard导出了这个。这有点难,因为节点没有手动标记(除了我自己标记的几个节点),但这里有六个相关点。占位符是黄色的:在右下角你会看到
x
,而
y
在左中。 绿色是对我们有意义的中间值:左边是
预测
张量,右边是名为
正确
的张量。蓝色部分是图表的端点:在左上角有
成本
张量,在右上角你会发现
精度
。从本质上讲,数据是从底部流向顶部的

因此,每当你说“评估
预测
给定
x
”、“评估
准确度
给定
x
y
”或“优化我的网络给定
x
y
”,你实际上只是在黄色末端和obse上提供值