тензорный поток как изменить набор данных

У меня есть ключ API набора данных, который является частью моего графа тензорного потока. Как поменять местами, если я хочу использовать другие данные?

dataset = tf.data.Dataset.range(3)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

variable = tf.Variable(3, dtype=tf.int64)
model = variable*next_element

#pretend like this is me training my model, or something
with tf.Session() as sess:
    sess.run(variable.initializer)
    try:
        while True:
            print(sess.run(model)) # (0,3,6)
    except:
        pass

dataset = tf.data.Dataset.range(2)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()  

### HOW TO DO THIS THING?
with tf.Session() as sess:
    sess.run(variable.initializer) #This would be a saver restore operation, normally...
    try:
        while True:
            print(sess.run(model)) # (0,3)... hopefully
    except:
        pass

person Him    schedule 09.01.2018    source источник


Ответы (2)


Я не верю, что это возможно. Вы просите изменить сам график вычислений, что не разрешено в тензорном потоке. Вместо того, чтобы объяснять это самому, я нахожу принятый ответ в этом сообщении особенно ясным в объяснении этого пункта Можно ли изменить существующий граф вычислений TensorFlow?

Теперь, сказав это, я думаю, что есть довольно простой/чистый способ выполнить то, что вы ищете. По сути, вы хотите сбросить график и перестроить часть Dataset. Конечно, вы хотите повторно использовать model часть кода. Таким образом, просто поместите эту модель в класс или функцию, чтобы разрешить повторное использование. Простой пример, построенный на вашем коде:

# the part of the graph you want to reuse
def get_model(next_element):
    variable = tf.Variable(3,dtype=tf.int64)
    return variable*next_element

# the first graph you want to build
tf.reset_default_graph()

# the part of the graph you don't want to reuse
dataset = tf.data.Dataset.range(3)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

# reusable part
model = get_model(next_element)

#pretend like this is me training my model, or something
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    try:
        while True:
            print(sess.run(model)) # (0,3,6)
    except:
        pass

# now the second graph
tf.reset_default_graph()

# the part of the graph you don't want to reuse
dataset = tf.data.Dataset.range(2)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()  

# reusable part
model = get_model(next_element)

### HOW TO DO THIS THING?
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    try:
        while True:
            print(sess.run(model)) # (0,3)... hopefully
    except:
        pass

Последнее примечание: здесь и там вы также увидите ссылки на tf.contrib.graph_editor документы здесь. Они специально говорят, что вы не можете добиться именно того, что хотите, с помощью graph_editor (см. в этой ссылке: «Вот пример того, что вы не можете сделать», но вы можете довольно близко подойти). Тем не менее, это не очень хорошая практика; у них была веская причина сделать график только добавленным, и я думаю, что описанный выше метод, который я предлагаю, является более чистым способом выполнить то, что вы ищете.

person muskrat    schedule 09.01.2018
comment
Это то, что я делал, и это работает. Когда я задал вопрос, у меня возникли проблемы с восстановлением переменных, потому что я не сбрасывал график по умолчанию (да!). Это определенно правильный путь. - person Him; 10.01.2018

Один из способов, который я бы предложил, но который замедлит работу, — использовать place_holders, за которым следует tf.data.dataset. Таким образом, у вас будет следующее:

train_data = tf.placeholder(dtype=tf.float32, shape=[None, None, 1]) # just an example
# Then add the tf.data.dataset here
train_data = tf.data.Dataset.from_tensor_slices(train_data).shuffle(10000).batch(batch_size)

Теперь при запуске графика в сеансе вы должны вводить данные с помощью заполнителя. Так что кормите чем хотите...

Надеюсь это поможет!!

person I. A    schedule 13.11.2018