【问题标题】:How to change the value of a tensor which is not a tf.Variable in TensorFlow?如何更改 TensorFlow 中不是 tf.Variable 的张量的值?
【发布时间】:2018-01-09 13:57:16
【问题描述】:

我知道TensorFlow中有一个tf.assign函数,但是这个函数主要针对可变张量(tf.Variable)。如何修改张量的值?比如下面的代码,

import numpy as np
import tensorflow as tf

X = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])

conv1 = tf.layers.conv2d(X, filters=64, kernel_size=(3, 3), padding='same',name='conv1')
relu1 = tf.nn.relu(conv1)

conv2 = tf.layers.conv2d(relu1, filters=64, kernel_size=(3, 3), padding='same',name='conv2')
relu2 = tf.nn.relu(conv2)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

tensor = sess.graph.get_tensor_by_name(u'conv2/Conv2D:0')
feature_map = tf.reduce_mean(tensor[:,:,:,24])

image = np.random.uniform(size=(1,32,32,3))
sess.run([feature_map], feed_dict={X: image})

如何修改feature_map的值而不影响其推导?

更具体地说,当我更改feature_map 的值时,它不会影响其推导过程。 比如y = a^2y'= 2a,我只要把a = 1改成a = 2就行了。

Other_op = tf.gradients(feature_map, X)

不同的feature_map会得到不同的值,但不会破坏操作的图结构。

【问题讨论】:

  • 还是不太清楚。也许是对别人。更改馈入值将影响使用该值作为输入的张量。因此,如果输入a,我希望y(在y = a^2 中)会发生变化。您为什么不希望这些受到影响?我认为您可能需要更改图表。
  • 就像一个交叉熵损失。我需要标准化损失值,它是一个张量。所以我想修改值,它也可以反向传播。
  • 现在可能开始有意义了。你可以提供一个例子。听起来您要求替换损失值,而实际上您最好允许传入损失计算中使用的占位符/变量。(当您建议 tf.gradient 时,我没有太注意作为操作)其他人可能有更好的想法。
  • 输入的值可以影响张量,但奇怪的是这种变化不影响导数的值。无论如何,感谢您与您讨论。

标签: python tensorflow neural-network deep-learning variable-assignment


【解决方案1】:

在您的示例中,feature_map 没有值,因为它是一个操作。因此你不能改变它的价值。您可以做的是,将另一个值作为session.runfeed_dict 参数的一部分传入。

例如,如果您的 feature_map 后面跟着这样的操作:

other_op = tf.gradient(feature_map, X)

然后您可以通过feed_dict 更改传递给该操作的值(在这种情况下为gradient),如下所示:

session.run(other_op, feed_dict={feature_map: <new value>})

【讨论】:

  • 感谢您的快速回复!是否可以更清楚如何使用feed_dict 方法传递另一个值。新值会影响其推导吗?就像tf.gradient(feature_map, X)
  • 是的,我为此添加了一个示例
  • 但是使用feed_dict 传递值,feature_map 需要是tf.placeholder。它不会传播。可悲的是,尝试这种方法是没有用的。
  • 一个tf.placeholder 必须通过feed_dict 提供。但是其他张量也可以这样输入。
  • 是的!你说的对!但在这种情况下,我发现session.run(other_op, feed_dict={X:image, feature_map: &lt;new value&gt;})session.run(other_op, feed_dict={X:image, feature_map: &lt;new value&gt;}) 具有相同的值。那就是我说的没有用
【解决方案2】:

这是不可能的。张量是tf.Operation 的输出。来自documentation

张量是Operation 的输出之一的符号句柄。它不保存该操作的输出值,而是提供一种在 TensorFlow tf.Session 中计算这些值的方法。

所以你不能单独改变它的值。

【讨论】:

  • 感谢您的指导。有没有其他方法可以达到我描述的结果?
  • 您可以运行后续操作并传递您自己的值feature_map。这样其他操作就会认为 feature_map 具有该值。但它不会通过feature_map 传播。如果够了,试试sess.run(..., feed_dict={feature_map: ...})
  • 也许我真的需要考虑其他方式。我想更改 op 的值,但不影响其 graph
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多