tf.keras: обработка итерации последовательностей переменной длины в пользовательской модели без специального метода обучения - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь реализовать простую рекуррентную архитектуру нейронной сети, обращая внимание на задачу последовательность-последовательность, используя tf.keras в Tensorflow 2.1. В основном я следовал учебнику Tensorflow , и до сих пор он работает.

Однако в руководстве используется самообучающаяся функция обучения, в которой я хотел бы использовать различные tf.keras.Model функционирует как fit, поэтому я попытался настроить код, чтобы я мог их использовать. Проблема c заключается в следующем: в части декодера из-за архитектуры внимания необходимо вручную выполнять итерации по временным шагам, выполнять расчет внимания и передавать результат на следующий шаг. Моя модель декодера выглядит примерно так:

class MyDecoderModel(tf.keras.Model):
    def __init__(self, **kwargs):
        ...

    def call(self, x):
        seq_in, state_in = x
        batch_size, seq_len = seq_in.shape
        for step in range(seq_len):
            do_stuff()

Самое главное, длина последовательности ввода должна быть определена, а не быть None. Но я хочу работать с переменной длиной последовательности. Насколько я понимаю, это делает использование функционального API Keras, который я обычно использовал бы, невозможным для этой Модели, поскольку написание чего-то вроде

x = tf.keras.Input(shape=(None,))
x = MyDecoderModel()(x)

подало бы None в вызов. Поэтому я решил работать только с подклассами Model, написав основную модель, такую ​​как

class MyMainModel(tf.keras.Model):
    ...
    def call(self, x):
        enc_in, dec_in = x
        state = self.my_encoder(enc_in)
        dec_out = self.my_decoder((dec_in, state))
        return dec_out

. В принципе, это работает, если вызывать эту основную модель с входными данными успешно, то это дает результаты. Однако при использовании метода fit() в этой модели происходят вещи, которые я не понимаю: во-первых, модель вызывается с неизвестным размером пакета, но с определенной длиной последовательности. Впоследствии он вызывается только с указанным размером пакета, но с неизвестной длиной последовательности. Следовательно, None пройдено и итерация не пройдена.

Теперь, почему это происходит? Во время обучения должна быть определена длина последовательности партии, почему она не передается моей модели? Есть ли шанс решить это без специального метода обучения? Я был бы очень рад, если бы кто-то мог объяснить, что там происходит ...

1 Ответ

0 голосов
/ 30 апреля 2020

Первое: если ваши входные данные представляют собой последовательность, форма, переданная в Input, должна иметь два значения: (timesteps, features). timesteps может быть None, но features должно иметь фиксированную форму. Если у вас есть только одна функция, сделайте следующее:

x = tf.keras.Input(shape=(None, 1))

Во-вторых, вы можете использовать переменные временные шаги в моделях с несколькими изменениями; tf.unstack ваш друг здесь:

class MyDecoderModel(tf.keras.Model):
    def __init__(self, **kwargs):
        ...

    def call(self, x):
        seq_in, state_in = x
        step_number = 0
        steps_in = tf.unstack(seq_in, axis=SEQUENCE_AXIS)
        steps_out = []
        for step in batches_in:
            steps_out.append(do_stuff())
            step_number += 1
        return tf.stack(steps_out, axis=SEQUENCE_AXIS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...