Python 2.7 在tf.可变张量切片上赋值

Python 2.7 在tf.可变张量切片上赋值,python-2.7,tensorflow,Python 2.7,Tensorflow,我正在努力做到以下几点 state[0,:] = state[0,:].assign( 0.9*prev_state + 0.1*( tf.matmul(inputs, weights) + biases ) ) for i in xrange(1,BATCH_SIZE): state[i,:] = state[i,:].assign( 0.9*state[i-1,:] + 0.1*( tf.matmul(inputs, weights) + biases ) ) prev_state

我正在努力做到以下几点

state[0,:] = state[0,:].assign( 0.9*prev_state + 0.1*( tf.matmul(inputs, weights) + biases ) )
for i in xrange(1,BATCH_SIZE):
    state[i,:] = state[i,:].assign( 0.9*state[i-1,:] + 0.1*( tf.matmul(inputs, weights) + biases ) )
prev_state = prev_state.assign( state[BATCH_SIZE-1,:] )

作为后续行动。我得到一个错误,
Tensor
没有
assign
方法

变量
张量的切片调用
赋值
方法的正确方法是什么


完整当前代码:

import tensorflow as tf
import math
import numpy as np

INPUTS = 10
HIDDEN_1 = 20
BATCH_SIZE = 3


def create_graph(inputs, state, prev_state):
    with tf.name_scope('h1'):
        weights = tf.Variable(
        tf.truncated_normal([INPUTS, HIDDEN_1],
                            stddev=1.0 / math.sqrt(float(INPUTS))),
        name='weights')
        biases = tf.Variable(tf.zeros([HIDDEN_1]), name='biases')

        updated_state = tf.scatter_update(state, [0], 0.9 * prev_state + 0.1 * (tf.matmul(inputs[0,:], weights) + biases))
        for i in xrange(1, BATCH_SIZE):
          updated_state = tf.scatter_update(
              updated_state, [i], 0.9 * updated_state[i-1, :] + 0.1 * (tf.matmul(inputs[i,:], weights) + biases))

        prev_state = prev_state.assign(updated_state[BATCH_SIZE-1, :])
        output = tf.nn.relu(updated_state)
    return output

def data_iter():
    while True:
        idxs = np.random.rand(BATCH_SIZE, INPUTS)
        yield idxs

with tf.Graph().as_default():
    inputs = tf.placeholder(tf.float32, shape=(BATCH_SIZE, INPUTS))
    state = tf.Variable(tf.zeros([BATCH_SIZE, HIDDEN_1]), name='inner_state')
    prev_state = tf.Variable(tf.zeros([HIDDEN_1]), name='previous_inner_state')

    output = create_graph(inputs, state, prev_state)

    sess = tf.Session()
    # Run the Op to initialize the variables.
    init = tf.initialize_all_variables()
    sess.run(init)
    iter_ = data_iter()
    for i in xrange(0, 2):
        print ("iteration: ",i)
        input_data = iter_.next()
        out = sess.run(output, feed_dict={ inputs: input_data})

Tensorflow
变量
对象对使用、和操作更新切片的支持有限。这些操作中的每一个都允许您指定一个变量、切片索引向量(表示变量第0维中的索引,表示要变异的连续切片)和值张量(表示在相应切片索引处应用于变量的新值)

要更新单行变量,可以使用
tf.scatter\u update()
。例如,要更新第0行的
状态
,您可以执行以下操作:

updated_state = tf.scatter_update(
    state, [0], 0.9 * prev_state + 0.1 * (tf.matmul(inputs, weights) + biases))
要链接多个更新,可以使用从
tf.scatter\u update()
返回的可变
updated\u状态
张量:

最后,您可以计算得到的
updated\u state.op
,以将所有更新应用于
state

for i in xrange(1, BATCH_SIZE):
  updated_state = tf.scatter_update(
      updated_state, [i], 0.9 * updated_state[i-1, :] + ...)

prev_state = prev_state.assign(updated_state[BATCH_SIZE-1, :])
sess.run(updated_state.op)  # or `sess.run(updated_state)` to fetch the result

另外,您可能会发现使用计算中间状态更有效,只需在变量中具体化
prev_state

Tensorflow
variable
对象对使用、和ops更新切片的支持有限。这些操作中的每一个都允许您指定一个变量、切片索引向量(表示变量第0维中的索引,表示要变异的连续切片)和值张量(表示在相应切片索引处应用于变量的新值)

要更新单行变量,可以使用
tf.scatter\u update()
。例如,要更新第0行的
状态
,您可以执行以下操作:

updated_state = tf.scatter_update(
    state, [0], 0.9 * prev_state + 0.1 * (tf.matmul(inputs, weights) + biases))
要链接多个更新,可以使用从
tf.scatter\u update()
返回的可变
updated\u状态
张量:

最后,您可以计算得到的
updated\u state.op
,以将所有更新应用于
state

for i in xrange(1, BATCH_SIZE):
  updated_state = tf.scatter_update(
      updated_state, [i], 0.9 * updated_state[i-1, :] + ...)

prev_state = prev_state.assign(updated_state[BATCH_SIZE-1, :])
sess.run(updated_state.op)  # or `sess.run(updated_state)` to fetch the result

PS.您可能会发现使用它来计算中间状态更有效,而只是在变量中具体化
prev_state

谢谢,我有点困惑如何在这种情况下使用
scan
,我不应该先用ops构建一个图,然后在输出节点上使用scan吗?我遇到的另一个问题是,因为我要在批元素维度上分解图,
tf.matmul(输入,权重)
不仅有效,而且行
updated\u state=tf.scatter\u update(state,[0],0.9*prev\u state+0.1*(tf.matmul(输入[0,:],权重)+偏差))
给出:
值错误:形状(10,)必须有秩2。我将用完整的代码更新OP谢谢,我有点困惑在这种情况下如何使用
scan
,我不应该先用OP构建一个图,然后在输出节点上使用scan吗?我遇到的另一个问题是,因为我要在批元素维度上分解图,
tf.matmul(输入,权重)
不仅有效,而且行
updated_state=tf.scatter_update(state[0],0.9*prev_state+0.1*(tf.matmul(输入[0,:],权重)+bias))
给出:
ValueError:Shape(10,)必须具有秩2
。我将用完整的代码更新OP