Seq2Seq в CNTK: Функция ошибки времени выполнения поддерживает только 2 динамические оси

Я пытаюсь реализовать базовую модель перевода, в которой ввод и вывод представляют собой предложения на разных языках в CNTK с использованием LSTM.

введите здесь описание изображения

Для этого я создаю модель следующим образом:

def create_model(x):
    with c.layers.default_options():
        m = c.layers.Recurrence(c.layers.LSTM(input_vocab_size))(x)
        m = sequence.last(m)
        y = c.layers.Recurrence(c.layers.LSTM(label_vocab_size))(m)
        return m

batch_axis = Axis.default_batch_axis()
input_seq_axis = Axis('inputAxis')
input_dynamic_axes = [batch_axis, input_seq_axis]
raw_input = input_variable(shape = (input_vocab_dim), dynamic_axes = input_dynamic_axes, name = 'raw_input')
z= create_model(raw_input)

Но я получаю следующую ошибку:

RuntimeError: Currently PastValue/FutureValue Function only supports input operand with 2 dynamic axis (1 sequence-axis and 1 batch-axis)

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

Любая помощь высоко ценится.


person pseudo_teetotaler    schedule 04.02.2017    source источник


Ответы (2)


Операция last() обнажает динамическую ось, поскольку она сводит входную последовательность к единственному значению (вектор мысли).

Затем вектор мысли должен стать начальным состоянием для второго повторения. Поэтому его не следует передавать в качестве аргумента данных для второго повторения.

В текущей версии аргумент initial_state функции Recurrence() не может зависеть от данных. Это будет возможно в ближайшее время, код уже находится на рассмотрении и скоро будет объединен в мастер.

До тех пор существует более сложный способ передачи зависимого от данных начального состояния, когда вы вручную создаете повторение (без слоя Recurrence()) и вручную добавляете начальное скрытое состояние в повторение. Это проиллюстрировано в примере последовательности-2-последовательности.

person Frank Seide MSFT    schedule 06.02.2017
comment
Спасибо за ваш ответ. Я проходил тот же учебник Seq2Seq и хотел избежать этой сложной функции LSTM_Layer. У меня была куча сомнений относительно этой функции. Я, вероятно, опубликую их как отдельный вопрос. - person pseudo_teetotaler; 07.02.2017
comment
В текущей версии аргумент initial_state функции Recurrence() не может зависеть от данных. Сейчас поддерживается? Любое обновление по этому поводу? - person pseudo_teetotaler; 13.03.2017

Это может быть:

input_dynamic_axes= [Axis.default_batch_axis(), Axis.default_dynamic_axis()] 

Первый будет номером образца в вашей мини-партии, второй будет длиной последовательности, автоматически выведенной CNTK.

person Morgan Funtowicz    schedule 06.02.2017