2017-08-03 3 views
1

Ich verwende einen tf.while_loop, um Tensoren dynamisch zu verketten.tf.while_loop nur unter Berücksichtigung der letzten Iteration

Der Code

embeds_raw = tf.constant(np.array([ 
    [1, 1], 
    [1, 1], 
    [2, 2], 
    [3, 3], 
    [3, 3], 
    [3, 3] 
], dtype='float32')) 
embeds = tf.Variable(initial_value=embeds_raw) 
container_variable = tf.zeros([512], dtype=tf.int32, name='container_variable') 
sen_len = tf.placeholder('int32', shape=[None], name='sen_len') 
# max_l = tf.reduce_max(sen_len) 
current_size = tf.shape(sen_len)[0] 
padded_sen_len = tf.pad(sen_len, [[0, 512 - current_size]], 'CONSTANT') 
added_container_variable = tf.add(container_variable, padded_sen_len) 
u1 = tf.TensorArray(dtype=tf.float32, size=512, clear_after_read=False) 
u1 = u1.split(embeds, added_container_variable) 
res = tf.split(embeds, added_container_variable) 

i = tf.constant(0, shape=(), dtype='int32', name='i') 
x = tf.Variable(tf.constant(0, shape=[2, 2], dtype=tf.float32), dtype=tf.float32) 

def condition(_i, _x): 
    return tf.less(_i, current_size) 

def body(_i, _x): 
    return _i + 1, tf.concat([x, u1.read(_i)], axis=0) 

idx, x = tf.while_loop(
    condition, 
    body, 
    [i, x], 
    shape_invariants=[tf.TensorShape([]), tf.TensorShape([None, 2])], 
) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    sents = sess.run(x, feed_dict={sen_len: [2, 1, 3]}) 
    print(sents) 
    print(len(res)) 

Was ist passiert, dass es bei jeder Iteration wird verketten, aber die Änderungen fallen. Mit anderen Worten, die neue Iteration verwendet nicht das vorherige Ergebnis. Hier

ist die Ausgabe erhalte ich:

[[ 0. 0.] 
[ 0. 0.] 
[ 3. 3.] 
[ 3. 3.] 
[ 3. 3.]] 

Während meine gewünschte Ausgabe ist:

[[ 0. 0.] 
[ 0. 0.] 
[ 1. 1.] 
[ 1. 1.] 
[ 2. 2.] 
[ 3. 3.] 
[ 3. 3.] 
[ 3. 3.]] 

Antwort

1

Dies liegt daran, diese Zeile:

return _i + 1, tf.concat([x, u1.read(_i)], axis=0) 

sollten Sie es ändern zu :

return _i + 1, tf.concat([_x, u1.read(_i)], axis=0) 
Verwandte Themen