Что должен возвращать генератор, если он используется в многомодельном функциональном API? - PullRequest
0 голосов
/ 26 ноября 2018

После этой статьи я пытаюсь реализовать генеративный RNN.В упомянутой статье данные обучения и проверки передаются как полностью загруженные np.array с.Но я пытаюсь использовать метод model.fit_generator и вместо этого предоставить генератор.

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

def generator():
    ...
    yield (samples, targets)

Но этоэто порождающая модель, которая означает, что задействованы две модели:

encoder_inputs = Input(shape=(None,))
x = Embedding(num_encoder_tokens, embedding_dim)(encoder_inputs)
x.set_weights([embedding_matrix])
x.trainable = False
x, state_h, state_c = LSTM(embedding_dim, return_state=True)(x)
encoder_states = [state_h, state_c]

decoder_inputs = Input(shape=(None,))
x = Embedding(num_decoder_tokens, embedding_dim)(decoder_inputs)
x.set_weights([embedding_matrix])
x.trainable = False
x = LSTM(embedding_dim, return_sequences=True)(x, initial_state=encoder_states)
decoder_outputs = Dense(num_decoder_tokens, activation='softmax')(x)

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

Как уже упоминалось ранее, я пытаюсь использовать генератор:

model.fit_generator(generator(),
                   steps_per_epoch=500,
                   epochs=20,
                   validation_data=generator(),
                   validation_steps=val_steps)

Но что должно generator()вернуть?Я немного сбит с толку, так как есть две входные коллекции и одна цель.

1 Ответ

0 голосов
/ 26 ноября 2018

Поскольку ваша модель имеет два входа и один выход, генератор должен вернуть кортеж с двумя элементами, где первый элемент представляет собой список , содержащий два массива, которые соответствуют двум входным слоям, и второй элементявляется массивом, соответствующим выходному слою:

def generator():
    ...
    yield [input_samples1, input_samples2], targets

Как правило, в модели с M входами и N выходами генератор должен возвращать кортеж из двух списков, где первый имеет Mмассивы и второй имеет N массивы:

def generator():
        ...
        yield [in1, in2, ..., inM], [out1, out2, ..., outN]
...