Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tensorflow中更新张量_Python_Tensorflow_Variable Assignment_Tensorflow Gradient - Fatal编程技术网

Python 在tensorflow中更新张量

Python 在tensorflow中更新张量,python,tensorflow,variable-assignment,tensorflow-gradient,Python,Tensorflow,Variable Assignment,Tensorflow Gradient,我在tensorflow中定义了一个无监督问题,我需要在每次迭代中更新我的B和tfZ,但我不知道如何使用tensorflow会话更新我的tfZ tfY = tf.placeholder(shape=(15, 15), dtype=tf.float32) with tf.variable_scope('test'): B = tf.Variable(tf.zeros([])) tfZ = tf.convert_to_tensor(Z, dtype=tf.float32) def

我在tensorflow中定义了一个无监督问题,我需要在每次迭代中更新我的B和tfZ,但我不知道如何使用tensorflow会话更新我的tfZ

tfY = tf.placeholder(shape=(15, 15), dtype=tf.float32)

with tf.variable_scope('test'):
    B = tf.Variable(tf.zeros([]))
    tfZ = tf.convert_to_tensor(Z, dtype=tf.float32)

def loss(tfY):
    r = tf.reduce_sum(tfZ*tfZ, 1)
    r = tf.reshape(r, [-1, 1])
    D = tf.sqrt(r - 2*tf.matmul(tfZ, tf.transpose(tfZ)) + tf.transpose(r) + 1e-9)
    return tf.reduce_sum(tfY*tf.log(tf.sigmoid(D+B))+(1-tfY)*tf.log(1-tf.sigmoid(D+B)))

LOSS = loss(Y)
GRADIENT = tf.gradients(LOSS, [B, tfZ])

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

tot_loss = sess.run(LOSS, feed_dict={tfY: Y})

loss_grad = sess.run(GRADIENT, feed_dict={tfY: Y})

learning_rate = 1e-4
for i in range(1000):
    sess.run(B.assign(B - learning_rate * loss_grad[0]))
    print(tfZ)
    sess.run(tfZ.assign(tfZ - learning_rate * loss_grad[1]))

    tot_loss = sess.run(LOSS, feed_dict={tfY: Y})
    if i%10==0:
        print(tot_loss)
此代码打印以下内容:

Tensor("test_18/Const:0", shape=(15, 2), dtype=float32)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-35-74ddafc0bf3a> in <module>()
     25     sess.run(B.assign(B - learning_rate * loss_grad[0]))
     26     print(tfZ)
---> 27     sess.run(tfZ.assign(tfZ - learning_rate * loss_grad[1]))
     28 
     29     tot_loss = sess.run(LOSS, feed_dict={tfY: Y})

AttributeError: 'Tensor' object has no attribute 'assign'
一个张量对象没有赋值属性,但是我找不到任何附加到该对象的函数可以这样做。如何正确更新张量?

与之不同,它不提供赋值方法;如果张量是可变的,则必须显式调用函数:

tf.assign(tfZ, tfZ - learning_rate * loss_grad[1])
更新:并非所有的张量都是可变的,例如,你的tfZ不是可变的。到目前为止,可变张量只是那些至少在tensorflow 1.x中解释的对应于变量的张量,这可以在将来扩展。普通张量是运算结果的句柄,也就是说,它们绑定到运算及其输入。要更改不可变的张量值,必须更改源张量占位符或变量。在您的特定情况下,将tfZ作为变量也会更容易

顺便说一下,它只是tf.assign上的一个包装器,必须在会话中运行result op才能实际执行赋值

注意:在这两种情况下,都会在图形中创建一个新节点。如果像在代码片段中那样在循环中调用它,则图形将膨胀1000个节点。在实际生产代码中这样做是一种不好的做法,因为它很容易导致OOM。

与之不同,它不提供赋值方法;如果张量是可变的,则必须显式调用函数:

tf.assign(tfZ, tfZ - learning_rate * loss_grad[1])
更新:并非所有的张量都是可变的,例如,你的tfZ不是可变的。到目前为止,可变张量只是那些至少在tensorflow 1.x中解释的对应于变量的张量,这可以在将来扩展。普通张量是运算结果的句柄,也就是说,它们绑定到运算及其输入。要更改不可变的张量值,必须更改源张量占位符或变量。在您的特定情况下,将tfZ作为变量也会更容易

顺便说一下,它只是tf.assign上的一个包装器,必须在会话中运行result op才能实际执行赋值


注意:在这两种情况下,都会在图形中创建一个新节点。如果像在代码片段中那样在循环中调用它,则图形将膨胀1000个节点。在实际生产代码中这样做是一种不好的做法,因为它很容易导致OOM。

感谢您的解释,运行tf.assigntfZ,tfZ-learning_rate*loss_grad[1]仍然会产生相同的错误消息,尽管:Tensor'object没有属性'assign'@NicolaiF Oops,我的坏消息,我忘了提一个重要的问题point@NicolaiF我已经更新了答案,很抱歉最初的混淆谢谢你这么好的解释,我把我的代码从:tfZ=tf.convert_改为_tensorZ,dtype=tf.float32改为tfZ=tf.Variabletf.convert_改为_tensorZ,dtype=tf.float32,这样它就可以作为一个变量,现在我分配的方式与B相同。更好的方法是在开始会话之前创建一次assign op,然后根据需要多次调用它。这意味着使用梯度而不是损失梯度。顺便说一句,变量支持assign_sub方法。感谢您的解释,运行tf.assigntfZ,tfZ-learning_rate*loss_grad[1]仍然会产生相同的错误消息:Tensor'object没有属性'assign'@NicolaiF-Oops,糟糕,我忘了提到一个重要的错误point@NicolaiF我已经更新了答案,很抱歉最初的混淆谢谢你这么好的解释,我把代码从:tfZ=tf.convert\u改为\u tensorZ,dtype=tf.float32改为tfZ=tf.Variabletf.convert\u改为\u tensorZ,dtype=tf.float32,这样它就可以作为一个变量,现在我分配的方式与B相同。更好的方法是在开始会话之前创建一次assign op,然后根据需要多次调用它。这意味着使用梯度而不是损失梯度。顺便说一下,变量支持赋值子方法。