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