keras文本分类中相同代码的不同准确性
Different accuracy for the same code in text classification in keras
我正在训练一个基于 LSTM 的递归神经网络进行文本分类,但我有一个奇怪的行为。使用相同的代码和相同的训练集,我获得了非常不同的准确度。
我知道有不同的值是正常的,但有时我得到的值是 40% 的准确度,而其他值是 90%。怎么可能?
此外,有时我在准确度级别上得到 "stuck",我的意思是损失和准确度在不同时期不会改变,因此两个值保持不变。这是什么解释?
我不确定我是否真正理解的另一个方面是我输入文本的填充事实(我正在使用批量训练)。我认为,由于我使用的是 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 个样本
- 我的训练集不统一
对于上述问题的任何提示以及改进我的神经网络的一些建议,我将不胜感激。
你们训练的 epoch 数量是一样的吗?
可能发生的事情之一是您在某些运行中出现梯度爆炸。也许您可以引入梯度裁剪 (gradient clipping in keras) to avoid that problem. You could also use regularization (keras ruglarizers) 来进行另一次测量。
据我所知,当谈到填充时,正确的填充是通常要做的事情。基本原理是对于进入的序列,初始隐藏状态始终为 0。否则,您会根据左侧的填充量从不同的隐藏状态开始。
您的模型存在一个问题。你有两次 softmax 层。所以只需要
X = Dense(num_activations, activation='softmax')(X)
接下来您不需要激活层。
你是只用300个样本来训练还是测试?对于训练来说,这似乎是很少的样本,越多越好。如果您有相应的计算资源,您可以尝试使 LSTM 更大(例如 512)。但是,如果你只有 300 个样本,我猜这不会对性能产生影响。您可以尝试的其他方法是调整超参数,例如优化器和学习率。你可以尝试使用 CNN 而不是 LSTM,也许这也会提高一点性能。
我认为尽管没有使用非常深的网络,但您使用的是高 dropout 值。丢弃是随机的,使用高达 0.5 的值两次,肯定会给您带来截然不同的结果。 Dropouts 通常保持在 0.2 - 0.3 左右,最高值仅用于更深的网络以避免过度拟合。尝试消除丢失或将其保持在 0.15 左右。
我正在训练一个基于 LSTM 的递归神经网络进行文本分类,但我有一个奇怪的行为。使用相同的代码和相同的训练集,我获得了非常不同的准确度。
我知道有不同的值是正常的,但有时我得到的值是 40% 的准确度,而其他值是 90%。怎么可能?
此外,有时我在准确度级别上得到 "stuck",我的意思是损失和准确度在不同时期不会改变,因此两个值保持不变。这是什么解释?
我不确定我是否真正理解的另一个方面是我输入文本的填充事实(我正在使用批量训练)。我认为,由于我使用的是 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 个样本
- 我的训练集不统一
对于上述问题的任何提示以及改进我的神经网络的一些建议,我将不胜感激。
你们训练的 epoch 数量是一样的吗?
可能发生的事情之一是您在某些运行中出现梯度爆炸。也许您可以引入梯度裁剪 (gradient clipping in keras) to avoid that problem. You could also use regularization (keras ruglarizers) 来进行另一次测量。 据我所知,当谈到填充时,正确的填充是通常要做的事情。基本原理是对于进入的序列,初始隐藏状态始终为 0。否则,您会根据左侧的填充量从不同的隐藏状态开始。
您的模型存在一个问题。你有两次 softmax 层。所以只需要
X = Dense(num_activations, activation='softmax')(X)
接下来您不需要激活层。
你是只用300个样本来训练还是测试?对于训练来说,这似乎是很少的样本,越多越好。如果您有相应的计算资源,您可以尝试使 LSTM 更大(例如 512)。但是,如果你只有 300 个样本,我猜这不会对性能产生影响。您可以尝试的其他方法是调整超参数,例如优化器和学习率。你可以尝试使用 CNN 而不是 LSTM,也许这也会提高一点性能。
我认为尽管没有使用非常深的网络,但您使用的是高 dropout 值。丢弃是随机的,使用高达 0.5 的值两次,肯定会给您带来截然不同的结果。 Dropouts 通常保持在 0.2 - 0.3 左右,最高值仅用于更深的网络以避免过度拟合。尝试消除丢失或将其保持在 0.15 左右。