Keras:使用带填充序列的mask_zero与单序列非填充训练

时间:2018-06-18 14:57:31

标签: python keras

我在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参数对模型的确切影响。

注意:基于我使用的训练方法,模型初始化存在轻微的参数差异 - 为了简洁起见,我将其留下了。

1 个答案:

答案 0 :(得分:3)

最大的区别是性能训练稳定性,否则填充然后屏蔽与处理单个句子时相同。

  1. 性能:您将一次训练一个点,这可能无法利用硬件上可用的任何并行性。通常,我们会调整批量大小,以便在培训和预测期间从机器中获得最佳性能。
  2. 培训稳定性:当您将批量大小设置为1时,您不再执行小批量培训。训练例程将在每个数据点之后应用更新,这可能对基于动量的算法(例如Adam)有害。相反,在批次上累积渐变往往会提供更稳定的收敛,尤其是在数据有噪声的情况下。
  3. 所以回答这个问题,不,你不能指望他们的表现类似。