使用Keras训练RNN时,准确度达到0.0000?

时间:2016-10-31 00:48:22

标签: keras

我尝试使用Spacy的自定义字嵌入来训练序列 - >标签RNN查询分类器。这是我的代码:

word_vector_length = 300
dictionary_size = v.num_tokens + 1
word_vectors = v.get_word_vector_dictionary()
embedding_weights = np.zeros((dictionary_size, word_vector_length))
max_length = 186
for word, index in dictionary._get_raw_id_to_token().items():
    if word in word_vectors:
        embedding_weights[index,:] = word_vectors[word]
model = Sequential()
model.add(Embedding(input_dim=dictionary_size, output_dim=word_vector_length,
                    input_length= max_length, mask_zero=True, weights=[embedding_weights]))
model.add(Bidirectional(LSTM(128, activation= 'relu', return_sequences=False)))
model.add(Dense(v.num_labels, activation= 'sigmoid'))

model.compile(loss = 'binary_crossentropy',
              optimizer = 'adam',
              metrics = ['accuracy'])

model.fit(X_train, Y_train, batch_size=200, nb_epoch=20)

这里word_vectors从spacy.vectors中剥离并且长度为300,输入为np_array,看起来像维度186的[0,0,12,15,0...],其中整数是输入中的标记ID,并且我相应地构建了嵌入的权重矩阵。每个训练样本的输出层为[0,0,1,0,...0],长度为26,表示应该使用这段矢量化文本的标签。

这看起来应该有效,但在第一个时代,训练准确性不断下降......到第一个时期结束时/其余的训练时间,它正好是0而我是&#39 ;我不确定为什么会这样。我之前用keras / TF训练过很多模型,从未遇到过这个问题。

知道这里可能会发生什么吗?

1 个答案:

答案 0 :(得分:-1)

标签总是一热吗?意思是标签向量中只有一个元素是1,其余为零。

如果是这样,那么可以尝试使用softmax激活和分类的交叉熵损失,如下面的官方示例所示:

javafx.scene.Image

这将有助于限制网络在最后一层输出概率分布(即softmax层输出总和最多为1)。