keras中文本分类中相同代码的准确度不同

问题描述 投票:0回答:2

我正在训练一个基于LSTM的循环神经网络进行文本分类,我有一个奇怪的行为。使用相同的代码和相同的训练集,我获得了非常不同的准确度。

我知道拥有不同的价值是正常的,但有时我会获得40%的准确值和其他90%的价值。这怎么可能?

此外,有时我会在准确度上“卡住”,我的意思是在不同的时期内,损失和准确性不会改变,因此两个值保持不变。这是对此的解释?

我不确定我真正理解的另一个方面是输入文本的填充(我正在批量使用培训)。我想,因为我使用的是RNN,所以应该更好地使用左边填充。你知道如何填充输入吗?左右填充更好?

最后一个问题是如何选择层数和节点数。我知道,对于某人来说,最好的方法是通过实验,但有些建议可能会有用。

这是我的RNN的实现:

sentence_indices = Input(shape=input_shape, dtype=np.int32)
embedding_layer =  pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)

embeddings = embedding_layer(sentence_indices)   
X = LSTM(128, return_sequences=True)(embeddings)
X = Dropout(0.5)(X)
X = LSTM(128)(X)
X = Dropout(0.5)(X)
X = Dense(num_activation, activation='softmax')(X)
X =  Activation('softmax')(X)
model = Model(sentence_indices, X)
  • 嵌入层来自GloVe,一个经过预训练的模型。
  • 我或多或少地使用了5个类别和300个样本
  • 我的训练集不统一

我将理解上述问题的任何暗示以及改善我的神经网络的一些建议。

python tensorflow keras nlp text-classification
2个回答
0
投票

你是在训练相同数量的时代吗?

可能发生的一件事是你在一些运行中爆炸了渐变。也许你可以引入渐变剪辑(gradient clipping in keras)来避免这个问题。您还可以使用正则化(keras ruglarizers)进行另一个测量。据我所知,当谈到填充而不是正确的填充是常见的事情。基本原理是,对于进入的序列,初始隐藏状态始终为0.否则,您将根据左侧填充的数量开始使用不同的隐藏状态。

在你的模型中有一个问题。你有两倍softmax层。所以它就足够了

X = Dense(num_activations, activation='softmax')(X)

您接下来不需要激活层。

您只是使用300个样本进行培训或测试吗?对于训练来说,这似乎很少的样本,更多会更好。如果你有计算资源,你可以尝试使LSTM更大(例如512)。但是,如果你只有300个样本,我认为这些性能在性能方面无法改变。您可以尝试的其他方法是调整优化器和学习速率等超参数。你可以尝试使用CNN而不是LSTM,也许这也会提高性能。


0
投票

我认为尽管没有使用非常深的网络,但您正在使用的是辍学的高价值。辍学是随机的,使用高达0.5的值,两次,肯定会给你带来截然不同的结果。辍学通常保持在0.2-0.3左右,最高值仅适用于更深的网络以避免过度拟合。尝试摆脱辍学或保持0.15左右。

© www.soinside.com 2019 - 2024. All rights reserved.