2017-01-30 69 views
1

我正在研究这个tutorial,我在下面的代码中发现:在评估预测时,他运行准确性,运行正确的变量,然后运行预测,再次用randoms再次重新计算权重,并重建NN模型。这是对的吗?我错过了什么?Tensor Flow MNIST评估预测

def neural_network_model(data): 
    hidden_1_layer = {'weights':tf.Variable(tf.random_normal([784, n_nodes_hl1])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))} 

    hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))} 

    hidden_3_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl3]))} 

    output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl3, n_classes])), 
        'biases':tf.Variable(tf.random_normal([n_classes])),} 


    l1 = tf.add(tf.matmul(data,hidden_1_layer['weights']), hidden_1_layer['biases']) 
    l1 = tf.nn.relu(l1) 

    l2 = tf.add(tf.matmul(l1,hidden_2_layer['weights']), hidden_2_layer['biases']) 
    l2 = tf.nn.relu(l2) 

    l3 = tf.add(tf.matmul(l2,hidden_3_layer['weights']), hidden_3_layer['biases']) 
    l3 = tf.nn.relu(l3) 

    output = tf.matmul(l3,output_layer['weights']) + output_layer['biases'] 

    return output 

def train_neural_network(x): 
    prediction = neural_network_model(x) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction,y)) 
    optimizer = tf.train.AdamOptimizer().minimize(cost) 

    hm_epochs = 10 
    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for _ in range(int(mnist.train.num_examples/batch_size)): 
       epoch_x, epoch_y = mnist.train.next_batch(batch_size) 
       _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) 
       epoch_loss += c 
      print('Epoch', epoch, 'completed out of',hm_epochs,'loss:',epoch_loss) 

     correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 

     accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 
     print('Accuracy:',accuracy.eval({x:mnist.test.images, y:mnist.test.labels})) 

train_neural_network(x) 

回答

2

你几乎说得没错。张量间接依赖于prediction张量,张量取决于张量x。在你的代码片段中,你并没有包括实际的x;然而从链接教程:

x = tf.placeholder('float', [None, 784]) 
y = tf.placeholder('float') 

所以x是一个占位符,即直接从用户获取其值的张量。它不是从

train_neural_network(x) 

的最后一行,他实际上并没有调用转换功能train_neural_network(x)接受一个x并处理它的飞行,就像你会从一个普通函数期望完全清楚;相反,该函数使用对之前定义的占位符变量的引用 - 虚拟实际 - 为了定义计算图形,它然后直接使用会话执行。 但是,该图只使用neural_network_model(x)构造一次,然后查询对于给定数量的时期。

什么你错过的是:

_, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y}) 

此查询optimizer操作的结果和cost张量给定的输入值epoch_xxepoch_yy,通过定义的所有计算节点中提取数据,一路回落至x。为了获得cost,还需要y。两者都由来电者提供。 AdamOptimizer将更新所有可训练变量作为其执行的一部分,从而改变网络的权重。

之后,

accuracy.eval({x: mnist.test.images, y: mnist.test.labels}) 

,或等效

sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}) 

然后发出相同图的另一个评价 - 在不改变它 - 但使用的输入mnist.test.imagesxmnist.test.labels这个时候为y。 它的工作原理是因为prediction本身取决于x,该值在每次调用sess.run(...)时被覆盖为用户提供的值。

以下是TensorBoard中的图形。很难说,但两个占位节点位于左下方,位于称为“变量”的橙色节点旁边,位于中心右侧,位于绿色“Slice_1”下方。

下面是网络图的相关部分的外观。我用TensorBoard导出了这个。由于节点没有被人工标记(除了我自己标记的一对夫妇)之外,有点难,但是这里有六个相关的要点。占位符为黄色:在右下角,您会发现xy位于左侧中间位置。 绿色是对我们有意义的中间值:左边是prediction张量,右边是称为correct的张量。蓝色部分是图的端点:左上角有cost张量,右上角有accuracy。实质上,数据从底部流向顶部。

Network graph

所以,当你说“评估prediction给出x”,“评估accuracy给出xy”或“优化我的网络给xy”,你真的只是提供的黄色两端值和观察绿色或蓝色的结果。

+0

我认为我没有得到它,你说对同一个图的另一个评估,如何在不改变预测的情况下改变它,再次调用神经网络模型,当它重建图时必须调用一次,因为我正在计算哪些行只能被调用,是你的意思? –

+0

我知道他在输入时改变了X,但是他也改变了隐藏层的权重并将其重新随机化,这是他真的做了什么? –

+0

可以这样想:网络图由'neural_network_model(x)'定义。该函数返回一个对张量“预测”的引用,该引用以某种方式依赖于“x”;除了_defining_网络的外观外,它没有做任何事情。只要您使用'sess.run()'(或'.evaluate')评估张量,该图就会在CPU或GPU上实例化并修复。之后,本质上唯一改变任何事情的就是Optimizer,在这种情况下是“AdamOptimizer”。其他的一切只是获取网络产生的结果,如果你给它提供'x'和'y'。这有帮助吗? – sunside