在 numpy 中,我可以使用numpy.copy创建变量的副本。有没有类似的方法可以用来在 TensorFlow 中创建张量的副本?
4 回答
您问如何在标题中复制变量,但如何在问题中复制张量。让我们看看不同的可能答案。
(1) 您想创建一个与当前存储在我们将调用的变量中的值相同的张量。var
tensor = tf.identity(var)
但请记住,“张量”是一个图节点,在评估时将具有该值,并且在您评估它的任何时候,它都会获取 的当前值var
。您可以使用控制流操作,例如with_dependencies()
查看变量更新的顺序和身份的时间。
(2) 您想创建另一个变量并将其值设置为当前存储在变量中的值:
import tensorflow as tf
var = tf.Variable(0.9)
var2 = tf.Variable(0.0)
copy_first_variable = var2.assign(var)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
print sess.run(var2)
sess.run(copy_first_variable)
print sess.run(var2)
(3)您想要定义一个变量并将其起始值设置为您已经将变量初始化为相同的值(这就是 nivwu.. 上面回答的内容):
var2 = tf.Variable(var.initialized_value())
var2
调用时将被初始化tf.initialize_all_variables
。在您已经初始化图形并开始运行之后,您不能使用它来复制 var 。
你可以通过几种方式做到这一点。
- 这将为您创建一个副本:
v2 = tf.Variable(v1)
- 您也可以使用身份操作:(
v2 = tf.identity(v1)
我认为这是一种正确的做法。
这是一个代码示例:
import tensorflow as tf
v1 = tf.Variable([[1, 2], [3, 4]])
v_copy1 = tf.Variable(v1)
v_copy2 = tf.identity(v1)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
a, b = sess.run([v_copy1, v_copy2])
sess.close()
print a
print b
他们都将打印相同的张量。
这将执行深层复制
copied_variable = tf.Variable(source_variable.initialized_value())
它还可以正确处理初始化,即
tf.intialize_all_variables()
将首先正确初始化 source_variable,然后将该值复制到copyed_variable
在 TF2 中:
tf.identity()
会为你做好事。最近在google colab中使用该功能遇到了一些问题。如果这就是你在这里的原因,这将对你有所帮助。
错误:无法将输入张量从 /job:localhost/replica:0/task:0/device:CPU:0 复制到 /job:localhost/replica:0/task:0/device:GPU:0 以运行身份:没有为方向找到一元变体设备复制函数:1 和变体 type_index: tensorflow::data::(anonymous namespace)::DatasetVariantWrapper [Op:Identity]
#Erroneous code
tensor1 = tf.data.Dataset.from_tensor_slices([[[1], [2]], [[3], [4]]])
tensor2 = tf.identity(tensor1)
#Correction
tensor1 = tf.data.Dataset.from_tensor_slices([[[1], [2]], [[3], [4]]])
with tf.device('CPU'): tensor2 = tf.identity(tensor1)