Keras掩模层可用于处理RNN的可变长度序列训练。当我使用它们时,掩模层的准确度低于单批训练。我怀疑我没有正确使用遮罩层。
我的目标是训练LSTM学习如何拼写单词。这些序列是不同的英语单词,用一个热表示法编码。下面是数据编码部分的代码:folder.setSelection(item)
是构成序列的所有字母的集合,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
培训:
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)
我是否正确使用了遮罩层?