Tensorflow,打印丢失功能会在没有feed_dictionary的情况下导致错误

时间:2017-09-06 16:40:42

标签: python tensorflow

我正在阅读Tensorflow文档。在下面的代码中,我刚刚更改了最后一行。我在迭代中推送了最后一行,看看究竟发生了什么......

import tensorflow as tf

# linear_model = W*x+B

W = tf.Variable(.3, dtype=tf.float32)
B = tf.Variable(-3., dtype=tf.float32)
x = tf.placeholder(dtype=tf.float32) #data_X
linear_model = W*x+B

y = tf.placeholder(dtype=tf.float32) #data_Y

loss = tf.reduce_sum(tf.square(linear_model-y))

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

X_train = [1.0,2.0,3.0,4.0] #data_X
y_train = [0.0,-1.0,-2.0,-3.0] #data_y

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        sess.run(train,{x:X_train, y:y_train})
        print(sess.run([W,B,loss], {x:X_train, y:y_train}))

请检查最后一行:print(sess.run([W,B,loss], {x:X_train, y:y_train}))

为什么我需要包含

{x:X_train, y:y_train}

为了打印声明?如果从最后一行中排除此项,则会出错。这没有任何意义,因为损失已经在之前计算过了。感谢

2 个答案:

答案 0 :(得分:2)

如果您打印loss,您会发现它是张量,而不是变量。这是因为TensorFlow定义了一个计算图,然后在调用sess.run时执行它,它不像python那样执行顺序执行。

您可以将loss视为x和y的函数,以了解sess.run正在做什么。

execute loss()   # not enough information to calculate loss
execute loss(x, y) # this will run loss

答案 1 :(得分:1)

之前的行可能是在getSuggestions操作中内部计算损失,但它没有输出任何内容。因此,您的print语句需要首先计算您需要传递train的值。您可以通过将最后两行更改为:

来绕过此语法
feed_dict

上面的第一行实际上明确执行_, W_val, B_val, loss_val = sess.run([train, W, B, loss], {x: X_train, y:y_train}) # run ops all at once, storing desired results print(W_val, B_val, loss_val) # do whatever you want with stored results WB操作,并将其值保存到lossW_val和{{ 1}}。你可以用那些保存的值做任何你想做的事。