我在Keras建立一个LSTM模型来对句子中的实体进行分类。我正在尝试使用零填充序列和mask_zero参数,或者使用生成器在一个句子(或一组相同长度的句子)上训练模型,因此我不需要用零填充它们。
如果我这样定义我的模型:
model = Sequential()
model.add(Embedding(input_dim=vocab_size+1, output_dim=200, mask_zero=True,
weights=[pretrained_weights], trainable = True))
model.add(Bidirectional(LSTM(units=100, return_sequences=True, recurrent_dropout=0.1)))
model.add(Dropout(0.2))
model.add(Bidirectional(LSTM(units=100, return_sequences=True, recurrent_dropout=0.1)))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(target_size, activation='softmax')))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics = ['accuracy'])
我可以期望带有mask_zero参数的填充序列执行类似于一次一个句子地输入模型非填充序列吗?基本上:
model.fit(padded_x, padded_y, batch_size=128, epochs=n_epochs,
validation_split=0.1, verbose=1)
或
def iter_sentences():
while True:
for i in range(len(train_x)):
yield np.array([train_x[i]]), to_categorical([train_y[i]], num_classes = target_size)
model.fit_generator(iter_sentences(), steps_per_epoch=less_steps, epochs=way_more_epochs, verbose=1)
我不确定是否存在一种方法优先于另一种方法,或者mask_zero参数对模型的确切影响。
注意:基于我使用的训练方法,模型初始化存在轻微的参数差异 - 为了简洁起见,我将其留下了。
答案 0 :(得分:3)
最大的区别是性能和训练稳定性,否则填充然后屏蔽与处理单个句子时相同。
所以回答这个问题,不,你不能指望他们的表现类似。