如果生成器 return 用于使用函数式 API 构建的 multi-input/output Keras 模型,它应该是什么?
What should the generator return if it is used in a multi-input/output Keras model built with functional API?
在 this article 之后,我正在尝试实现生成 RNN。在提到的文章中,训练和验证数据作为满载 np.array
s 传递。但我正在尝试使用 model.fit_generator
方法并提供一个生成器。
我知道如果它是一个简单的模型,生成器应该 return:
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()
return 应该怎么办?我有点困惑,因为有两个输入集合和一个目标。
由于您的模型有两个输入和一个输出,生成器应该 return 一个包含两个元素的元组,其中第一个元素是包含两个数组的 list,这对应两个输入层,第二个元素是一个数组,对应输出层:
def generator():
...
yield [input_samples1, input_samples2], targets
通常,在具有 M
个输入和 N
个输出的模型中,生成器应该 return 两个列表的元组,其中第一个列表具有 M
个数组,第二个有 N
个数组:
def generator():
...
yield [in1, in2, ..., inM], [out1, out2, ..., outN]
如果不使用 Python 生成器,而是使用 Sequence
class 的实例来生成数据,则格式相同,唯一的区别是您将使用 return
而不是 __getitem__
方法中的 yield
。
在 this article 之后,我正在尝试实现生成 RNN。在提到的文章中,训练和验证数据作为满载 np.array
s 传递。但我正在尝试使用 model.fit_generator
方法并提供一个生成器。
我知道如果它是一个简单的模型,生成器应该 return:
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()
return 应该怎么办?我有点困惑,因为有两个输入集合和一个目标。
由于您的模型有两个输入和一个输出,生成器应该 return 一个包含两个元素的元组,其中第一个元素是包含两个数组的 list,这对应两个输入层,第二个元素是一个数组,对应输出层:
def generator():
...
yield [input_samples1, input_samples2], targets
通常,在具有 M
个输入和 N
个输出的模型中,生成器应该 return 两个列表的元组,其中第一个列表具有 M
个数组,第二个有 N
个数组:
def generator():
...
yield [in1, in2, ..., inM], [out1, out2, ..., outN]
如果不使用 Python 生成器,而是使用 Sequence
class 的实例来生成数据,则格式相同,唯一的区别是您将使用 return
而不是 __getitem__
方法中的 yield
。