我正在训练一个基于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)
对于上述问题的任何暗示,以及对改善我的神经网络的一些建议,我将不胜感激。
答案 0 :(得分:0)
您是否在相同时期内训练?
可能发生的事情之一是您在某些运行中具有爆炸性的梯度。也许您可以引入渐变裁剪(gradient clipping in keras)来避免该问题。您还可以使用正则化(keras ruglarizers)进行其他度量。 就填充而言,据我所知,通常要做的是正确填充。基本原理是,对于进入的序列,初始隐藏状态始终为0。否则,您将根据左侧的填充量以不同的隐藏状态开始。
在您的模型中,存在一个问题。您有两次softmax图层。因此,只要拥有
X = Dense(num_activations, activation='softmax')(X)
您接下来不需要激活层。
您仅使用300个样本进行培训还是测试?对于训练来说,这似乎是很少的样本,更多的样本会更好。如果您有足够的计算资源,可以尝试使LSTM更大(例如512)。但是,我想,如果您只有300个样本,它们的性能不会有所不同。您可以尝试的其他方法是调整诸如优化程序和学习率之类的超参数。而且,您可以尝试使用CNN而不是LSTM,也许这也会提高性能。
答案 1 :(得分:0)
我认为,尽管没有使用非常深的网络,但您正在使用的辍学价值很高。辍学是随机的,使用两次高达0.5的值肯定会给您带来巨大变化的结果。辍学率通常保持在0.2-0.3左右,最高值仅适用于较深的网络,以避免过度拟合。尝试摆脱辍学或将其保持在0.15附近。