gpt4 book ai didi

tensorflow - 为什么我们需要使用 feed_dict 传递值来打印 TensorFlow 中的损失值

转载 作者:行者123 更新时间:2023-11-30 09:06:06 24 4
gpt4 key购买 nike

下面是小的 Tensorflow 代码

# coding: utf-8

# In[27]:

import tensorflow as tf


# In[28]:

# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)


# In[29]:

# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b


# In[30]:

y = tf.placeholder(tf.float32)


# In[31]:

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

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


# In[32]:

# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]


# In[33]:

# training loop
init = tf.global_variables_initializer()


# In[34]:

with tf.Session() as sess:
sess.run(init)

for i in range(1000):
sess.run(train, {x: x_train, y: y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})

print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))


# In[ ]:

在 for 循环中我们有以下代码

with tf.Session() as sess:
sess.run(init)

for i in range(1000):
sess.run(train, {x: x_train, y: y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})

print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

我的问题是,当我们运行 sess.run(train, {x: x_train, y: y_train}) 时,也会计算 loss ,那么为什么我们需要当想要检索损失值时传递 feed_dict ,如下所示?谁能帮我理解这一点吗?

 curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})

最佳答案

您在代码中定义了 2 个占位符:xytf.placeholder是一个容器,可以在程序的每次执行时为其提供不同的值。

当您使用tf.placeholder时,TensorFlow 在内部使用这个容器(占位符)定义其计算图。 sess.run()运行此计算图,但该图本身没有任何意义,因为占位符容器是空的 - 它们不包含任何内容。因此,每当您在代码中使用占位符时,您都需要使用 feed_dict 在图表中传递这些占位符的值。 sess.run()的参数.

占位符的优点是,您在 sess.run() 的一次执行中放入的值不被记住。即第二次调用sess.run()将再次有空占位符,并且您将再次必须通过 feed_dict 将值放入其中。 。这就是为什么您必须在每次调用 sess.run() 时发送占位符的值。 .

一个有用的类比可能是将您的 TensorFlow 计算图视为一台物理机器 - 具有输入管道( xy )和输出管道( loss )。机器消耗来自输入管道的数据(因此数据不会在多次调用中保留),并且机器还会从输出管道吐出内容 - 如果您没有捕获输出,您就会丢失它。机器(图表)不存储其中的任何值或结果。它仅用于定义对数据应用不同操作的工作流程。

类似 train 的操作是机器的杠杆,拉动时可以在机器内执行某些操作。现在,为了让机器完成任何工作,您必须在输入管道中放入一些东西。当您调用sess.run(train)时,机器用完占位符中的数据,计算损失(它通过loss输出管道发送出去,你没有捕获)并通过反向传播修改其内部变量。现在输入管道再次为空,并且旧值 loss丢失了!因此,当你想要计算损失时,你将数据放入输入管道中,并要求机器通过 loss 输出损失。管道。

您可能会想这样做:

loss_value, _ = sess.run([loss, train], {x: x_train, y: y_train})

但不幸的是,TensorFlow 给出 no guarantees至于order其中sess.run()评估其操作。所以在上面的代码行中你不会知道 loss_value 是否返回的是运行训练操作之前或之后的损失。唯一的方法是首先运行训练操作,然后在两次单独的 sess.run() 调用中运行损失操作。正如您在代码中所做的那样。

关于tensorflow - 为什么我们需要使用 feed_dict 传递值来打印 TensorFlow 中的损失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com