【问题标题】:Accuracy goes to 0.0000 when training RNN with Keras?使用 Keras 训练 RNN 时准确度达到 0.0000?
【发布时间】:2016-10-31 00:48:22
【问题描述】:

我正在尝试使用 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,表示应该与这段矢量化文本一起使用的标签。

这看起来应该可以工作,但是在第一个 epoch 期间,训练准确度不断下降......在第一个 epoch 结束时/对于其余的训练,它正好是 0,我不确定为什么会这样正在发生。我以前用 keras/TF 训练过很多模型,但从未遇到过这个问题。

知道这里会发生什么吗?

【问题讨论】:

  • 你试过降低学习率吗?对于此任务,adam 的默认 1e-3 非常高。

标签: keras


【解决方案1】:

标签总是单一的吗?这意味着标签向量中只有一个元素为 1,其余元素为 0。

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

https://github.com/fchollet/keras/blob/master/examples/babi_memnn.py#L202

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

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2017-12-21
    • 2019-06-09
    • 2020-10-17
    • 2018-08-16
    • 2020-02-11
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多