2016-08-21 1 views
5

Я пытаюсь обучить LSTM в Tensorflow с помощью мини-басов, но после завершения обучения я хотел бы использовать модель, представив по одному примеру за нее , Я могу настроить график в Tensorflow для обучения моей сети LSTM, но после этого я не могу использовать обученный результат по своему желанию.Тензорный поток: использование весов, обученных одной модели внутри другой, другая модель

Код установки выглядит примерно так:

#Build the LSTM model. 
cellRaw = rnn_cell.BasicLSTMCell(LAYER_SIZE) 
cellRaw = rnn_cell.MultiRNNCell([cellRaw] * NUM_LAYERS) 

cell = rnn_cell.DropoutWrapper(cellRaw, output_keep_prob = 0.25) 

input_data = tf.placeholder(dtype=tf.float32, shape=[SEQ_LENGTH, None, 3]) 
target_data = tf.placeholder(dtype=tf.float32, shape=[SEQ_LENGTH, None]) 
initial_state = cell.zero_state(batch_size=BATCH_SIZE, dtype=tf.float32) 

with tf.variable_scope('rnnlm'): 
    output_w = tf.get_variable("output_w", [LAYER_SIZE, 6]) 
    output_b = tf.get_variable("output_b", [6]) 

outputs, final_state = seq2seq.rnn_decoder(input_list, initial_state, cell, loop_function=None, scope='rnnlm') 
output = tf.reshape(tf.concat(1, outputs), [-1, LAYER_SIZE]) 
output = tf.nn.xw_plus_b(output, output_w, output_b) 

... Обратите внимание на два заполнители input_data и target_data. Я не беспокоился, включая настройку оптимизатора. После завершения подготовки и учебная сессия закрыта, я хотел бы создать новую сессию, которая использует обученную LSTM сеть вход которого обеспечивается совершенно другим заполнителем, что-то вроде:

with tf.Session() as sess: 
with tf.variable_scope("simulation", reuse=None): 
    cellSim = cellRaw 
    input_data_sim = tf.placeholder(dtype=tf.float32, shape=[1, 1, 3]) 
    initial_state_sim = cell.zero_state(batch_size=1, dtype=tf.float32) 
    input_list_sim = tf.unpack(input_data_sim) 

    outputsSim, final_state_sim = seq2seq.rnn_decoder(input_list_sim, initial_state_sim, cellSim, loop_function=None, scope='rnnlm') 
    outputSim = tf.reshape(tf.concat(1, outputsSim), [-1, LAYER_SIZE]) 

    with tf.variable_scope('rnnlm'): 
     output_w = tf.get_variable("output_w", [LAYER_SIZE, nOut]) 
     output_b = tf.get_variable("output_b", [nOut]) 

    outputSim = tf.nn.xw_plus_b(outputSim, output_w, output_b) 

Эта вторая часть возвращает следующее сообщение об ошибке:

tensorflow.python.framework.errors.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float 
[[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

... Предположительно потому, что граф, я использую до сих пор старых учебных заполнителей, присоединенных к обученным узлам LSTM. Каков правильный способ «извлечь» обученный LSTM и поместить его в новый, другой график, который отличается стилем ввода? Функции с широким охватом, которые Tensorflow, похоже, обращаются к чему-то подобному, но примеры in the documentation говорят об использовании области переменных как способа управления именами переменных, так что один и тот же фрагмент кода будет генерировать аналогичные подграфы на одном и том же графе. Функция «повторного использования», похоже, близка к тому, что я хочу, но я не считаю, что документация Tensorflow, приведенная выше, абсолютно ясна в том, что она делает. Клетки сами по себе не может быть дано имя (другими словами,

cellRaw = rnn_cell.MultiRNNCell([cellRaw] * NUM_LAYERS, name="multicell") 

не действует), и в то время как я могу дать имя к seq2seq.rnn_decoder(), я, вероятно, не сможет удалить rnn_cell.DropoutWrapper(), если я использовал этот узел без изменений.

Вопросы:

Что такое правильный способ перемещения обученных весов LSTM из одного графа в другой?

Правильно ли говорить, что начало новой сессии «освобождает ресурсы», но не стирает граф, построенный в памяти?

Мне кажется, что функция «повторного использования» позволяет Tensorflow искать за пределами области текущей переменной переменные с тем же именем (существующие в другой области) и использовать их в текущей области. Это верно? Если это так, что происходит со всеми краями графа из не текущей области, которая ссылается на эту переменную? Если это не так, почему Tensorflow выдает ошибку, если вы пытаетесь получить одно и то же имя переменной в двух разных областях? Кажется вполне разумным определить две переменные с одинаковыми именами в двух разных областях, например. conv1/sum1 и conv2/sum1.

В моем коде я работаю в новой области, но график не будет работать без данных, которые будут поданы в заполнитель из первоначальной области по умолчанию. По какой-либо причине область по умолчанию всегда «в области видимости»?

Если графы графа могут охватывать разные области действия, а имена в разных областях не могут быть разделены, если они не относятся к одному и тому же узлу, то это, по-видимому, приведет к поражению цели использования разных областей. Что я не понимаю здесь?

Спасибо!

ответ

2

Каков наилучший способ перемещения тренированных весов LSTM с одного графика на другой?

Вы можете создать свой график декодирования первого (с объектом заставки для сохранения параметров) и создать объект GraphDef, который можно импортировать в вашем большом тренировочном графике:

basegraph = tf.Graph() 
with basegraph.as_default(): 
    ***your graph*** 

traingraph = tf.Graph() 
with traingraph.as_default(): 
    tf.import_graph_def(basegraph.as_graph_def()) 
    ***your training graph*** 

убедитесь, что вы загрузите ваши переменные когда вы начинаете сеанс для нового графика.

У меня нет опыта работы с этой функциональностью, так что вы, возможно, придется смотреть в него немного больше

Правильно ли сказать, что, начиная новую сессию «высвобождает ресурсы», но не удаляет граф построен в памяти?

да, объект графа по-прежнему держать его

Мне кажется, как функция «повторного использования» позволяет Tensorflow искать за пределами текущей области видимости переменной для переменных с тем же именем (существующий в другой области) и использовать их в текущей области. Это верно? Если это так, что происходит со всеми краями графа из не текущей области, которая ссылается на эту переменную? Если это не так, почему Tensorflow выдает ошибку, если вы пытаетесь получить одно и то же имя переменной в двух разных областях? Кажется вполне разумным определить две переменные с одинаковыми именами в двух разных областях, например. conv1/sum1 и conv2/sum1.

Нет, повторное использование должно определять поведение, когда вы используете get_variable для существующего имени, когда оно истинно, оно вернет существующую переменную, иначе оно вернет новую. Обычно тензорный поток не должен вызывать ошибку. Вы уверены, что используете tf.get_variable, а не только tf.Variable?

В моем коде я работаю в новой области, но график не будет работать без данных, которые будут поданы в заполнитель из первоначальной области по умолчанию. По какой-либо причине область по умолчанию всегда «в области видимости»?

Я действительно не понимаю, что вы имеете в виду. Они не всегда должны использоваться. Если местозаполнитель не требуется для выполнения операции, вам не нужно его определять.

Если графы графа могут охватывать разные области применения, а имена в разных областях не могут быть разделены, если они не относятся к одному и тому же узлу, то это, по-видимому, приведет к поражению цели использования разных областей. Что я не понимаю здесь?

Я думаю, ваше понимание и использование областей несовершенно, см.выш

+0

Re: предпоследний вопрос: Я пытаюсь подготовить модель, а затем использовать его в том же сценарии Python. Я вообще не использую Saver. Когда я пытаюсь повторно использовать модель, Tensorflow жалуется, потому что я не предоставляю заполнителей, специфичных для обучения. Они не требуются для повторного использования, но они все еще присутствуют на графике. – amm

+0

Re: первый вопрос: как это решение будет работать, если мне нужно изменить место ввода? Я тренируюсь в минибазах, но повторно использую модель без мини-батов, и это, похоже, не дает возможности изменить входные размеры. – amm

+0

Re: от третьего к последнему вопросу: Оказывается, MultiRNNCell - это оболочка, которая создает узлы, которые отличаются от самого объекта-обертки. Есть ли где-нибудь документы, как сохранять и восстанавливать этот тип ансамбля объектов/узлов? Что происходит с ребрами, инцидентами на узле после восстановления?Что происходит с краями, инцидентами на узле, когда tf.get_variable() вызывается в новой области? Использует ли reuse = true изменение какой-либо связи между ребрами и узлами во время этой операции? Я не могу найти конкретную документацию, которая затрагивает эти вопросы. – amm

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