Keras模型学习给出错误答案训练准确度提高到0.8,然后急剧下降到0.1

Keras模型学习给出错误答案训练准确度提高到0.8,然后急剧下降到0.1,keras,neural-network,Keras,Neural Network,我正在阅读弗朗索瓦·乔利特(François Chollet)的《深入学习Python》一书 在第7.9节中,有一个使用Conv1D层处理IMDB数据集的示例神经网络。令我惊讶的是,它开始学习,训练和验证的准确性都有所提高,但经过几个时期后,训练和验证的准确性都有所下降 看到验证准确率下降并不让我感到惊讶,这是非常典型的过度拟合,但我不明白的是,训练准确率如何下降到12%。这就好像网络在学习与它应该学习的相反的东西。 代码是: import keras from keras import lay

我正在阅读弗朗索瓦·乔利特(François Chollet)的《深入学习Python》一书

在第7.9节中,有一个使用Conv1D层处理IMDB数据集的示例神经网络。令我惊讶的是,它开始学习,训练和验证的准确性都有所提高,但经过几个时期后,训练和验证的准确性都有所下降

看到验证准确率下降并不让我感到惊讶,这是非常典型的过度拟合,但我不明白的是,训练准确率如何下降到12%。这就好像网络在学习与它应该学习的相反的东西。

代码是:

import keras
from keras import layers
from keras.datasets import imdb
from keras.preprocessing import sequence
from keras.optimizers import Adam, RMSprop

max_features = 2000
max_len = 500

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)

model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128,
                           input_length=max_len,
                           name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))

model.summary()

model.compile(optimizer=RMSprop(),
              loss='binary_crossentropy',
              metrics=['acc'])

history = model.fit(x_train, y_train,
                    epochs=20,
                    batch_size=128,
                    validation_split=0.2,
                    # callbacks=callbacks,
                    )
培训结果如下:

Train on 20000 samples, validate on 5000 samples
Epoch 1/20
20000/20000 [==============================] - 4s 212us/step - loss: 0.7043 - acc: 0.6076 - val_loss: 0.4488 - val_acc: 0.8166
Epoch 2/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.4509 - acc: 0.8179 - val_loss: 0.6575 - val_acc: 0.7594
Epoch 3/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.4082 - acc: 0.7923 - val_loss: 0.4759 - val_acc: 0.7874
Epoch 4/20
20000/20000 [==============================] - 3s 152us/step - loss: 0.3633 - acc: 0.7526 - val_loss: 0.5385 - val_acc: 0.7356
Epoch 5/20
20000/20000 [==============================] - 3s 154us/step - loss: 0.3333 - acc: 0.7235 - val_loss: 0.5658 - val_acc: 0.7056
Epoch 6/20
20000/20000 [==============================] - 3s 152us/step - loss: 0.2793 - acc: 0.6868 - val_loss: 0.5790 - val_acc: 0.6494
Epoch 7/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.2433 - acc: 0.6408 - val_loss: 0.6710 - val_acc: 0.5726
Epoch 8/20
20000/20000 [==============================] - 3s 149us/step - loss: 0.2061 - acc: 0.5789 - val_loss: 1.7192 - val_acc: 0.3538
Epoch 9/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.1769 - acc: 0.5144 - val_loss: 0.8144 - val_acc: 0.4416
Epoch 10/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.1507 - acc: 0.4365 - val_loss: 1.1555 - val_acc: 0.3682
Epoch 11/20
20000/20000 [==============================] - 3s 152us/step - loss: 0.1395 - acc: 0.3675 - val_loss: 1.1440 - val_acc: 0.3412
Epoch 12/20
20000/20000 [==============================] - 3s 156us/step - loss: 0.1241 - acc: 0.3159 - val_loss: 1.8202 - val_acc: 0.2686
Epoch 13/20
20000/20000 [==============================] - 3s 155us/step - loss: 0.1225 - acc: 0.2756 - val_loss: 1.0667 - val_acc: 0.2944
Epoch 14/20
20000/20000 [==============================] - 3s 152us/step - loss: 0.1183 - acc: 0.2422 - val_loss: 1.1143 - val_acc: 0.2794
Epoch 15/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.1153 - acc: 0.2142 - val_loss: 1.1599 - val_acc: 0.2686
Epoch 16/20
20000/20000 [==============================] - 3s 153us/step - loss: 0.1150 - acc: 0.1930 - val_loss: 1.2467 - val_acc: 0.2544
Epoch 17/20
20000/20000 [==============================] - 3s 151us/step - loss: 0.1145 - acc: 0.1766 - val_loss: 1.1953 - val_acc: 0.2492
Epoch 18/20
20000/20000 [==============================] - 3s 153us/step - loss: 0.1115 - acc: 0.1508 - val_loss: 1.4812 - val_acc: 0.2226
Epoch 19/20
20000/20000 [==============================] - 3s 156us/step - loss: 0.1119 - acc: 0.1355 - val_loss: 1.2690 - val_acc: 0.2288
Epoch 20/20
20000/20000 [==============================] - 3s 155us/step - loss: 0.1127 - acc: 0.1248 - val_loss: 1.2903 - val_acc: 0.2148

当然,我可以在验证准确率处于最高水平时尽早停止,但我想了解的是,培训准确率是如何急剧下降的。更令人惊讶的是,它是如何降到0.5以下的,作为一个softmax 0/1类型的输出层,我预计精度在0.5左右。看起来它真的学会了给出错误的答案

听起来像爆炸式的梯度或高方差。在激活(或其他某种正则化)之前尝试批处理规范化

使用一些简单的模型,如下面的模型,然后逐步升级:

model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128,
                           input_length=max_len,
                           name='embed'))
model.add(layers.Flatten())
model.add(layers.Dense(512))
model.add(layers.BatchNormalization())
model.add(layers.ReLU())
model.add(layers.Dense(1))
model.add(layers.ReLU())
在20集之后,这一集达到了70%


另一个问题可能是数据中的示例太少,请尝试获取更多示例,可能是通过数据扩充或减少功能。

Michael,感谢梯度爆炸的提示,我以前从未听说过这个问题

这个网络真正不寻常的是,对于一个有两个答案且样本平衡的分类问题,我得到了12.5%的准确率。如果网络没有学习,我会期望50%左右

在休息后回到它,我意识到问题是最后一个致密层缺少激活功能。这对于回归问题来说是可以的,但对于像这样的分类问题就不行了。加入激活后,网络训练正常,训练精度不断提高。它显示了过度装配,但这是意料之中的

简言之,问题是在没有激活函数的情况下使用损失函数
binary\u crossentropy