2016-03-13 6 views
2

Я хочу сделать для циклов с динамическими входами в тензорном потоке.переменная длина для цикла - тензорный поток

Я знаю, что для кода ниже reduce_sum достаточно, но я хочу, чтобы иметь возможность формулировать код так, как описано ниже. Поэтому, учитывая, что у меня есть массив с разными размерами, я хочу пройти этот массив.

Как я могу перемещать массивы динамической длины?

Проблема:

TypeError: range() integer end argument expected, got Tensor

Как я могу оценить get_sum, что находится вне сессии?

sum = get_sum(x, xshape) не должен быть в курсе for внутри сессии

Например:

import tensorflow as tf 
import numpy as np 


x = tf.placeholder(tf.float32, shape=[None]) 
xshape = tf.placeholder(tf.float32, shape=[]) 


def get_sum(x, xshape): 
    sum = 0 
    for i in range(xshape): 
    sum += x[i] 

init = tf.initialize_all_variables() 
sum = get_sum(x, xshape) 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(100): 
    length = np.random.randint(0,10) 
    a = np.random.randint(0, 10, length) 
    print sess.run(sum,feed_dict={x:a, xshape:length}) 
+2

Если число итераций неизвестно раньше времени, не будет ли более подходящим другой цикл? –

+0

какой цикл? – user2776945

+0

Возможно, цикл while. – zondo

ответ

1

Динамические петли еще молоды в TensorFlow, но они существуют. Посмотрите, например, на операторы сгиба и их реализацию. https://www.tensorflow.org/versions/master/api_docs/python/control_flow_ops.html#foldl

+0

Какая ситуация сейчас? Спасибо –

+0

Динамические петли теперь хорошо поддерживаются, и есть несколько операторов более высокого уровня, чтобы упростить их использование. Вы можете сделать, например, 'elems = [1, 2, 3, 4, 5, 6]; sum = tf.foldl (lambda a, x: a + x, elems) ', проверьте документы tf.foldl и tf.scan API. https://www.tensorflow.org/api_docs/python/tf/foldl –

Смежные вопросы