如何正确使用keras遮罩层?

K.W*_*ter 5 python nlp keras recurrent-neural-network

Keras遮罩层可用于处理RNN的可变长度序列训练。当我使用它们时,与单批训练相比,蒙版层的准确性较低。我怀疑我没有正确使用遮罩层。

我的目标是训练LSTM学习如何拼写单词。这些序列是不同的英语单词,用一键表示编码。以下是数据编码部分的代码:chars是组成序列的所有字母的集合,mylist是序列的列表,是序列MAXLEN的最大长度。

char_indices = dict((c, i) for i, c in enumerate(chars))
indices_char = dict((i, c) for i, c in enumerate(chars))

X = np.zeros((len(mylist), MAXLEN, len(chars)), dtype=np.bool)
y = np.zeros((len(mylist), MAXLEN, len(chars)), dtype=np.bool)

for i, sentence in enumerate(mylist):
    for t in range(len(sentence)-Data_end):
        X[i, t, char_indices[sentence[t]]] = 1
        y[i, t, char_indices[sentence[t+1]]] = 1
Run Code Online (Sandbox Code Playgroud)

我的网络定义为:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(None, len(chars))))
model.add(LSTM(2000, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(2000, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(len(chars))))
model.add(Activation('softmax'))

sgd = SGD(lr=lr_init, decay=decay_init, momentum=momentum_init, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
early_stopping = EarlyStopping(patience=2,verbose=1)
Run Code Online (Sandbox Code Playgroud)

训练:

model.fit(X, y, callbacks=[early_stopping],batch_size=32, nb_epoch=1)
Run Code Online (Sandbox Code Playgroud)

我是否正确使用遮罩层?