最易懂深度学习2:IMDB数据集学习(2)
上接上一篇。接下来我来分析后一部分的代码。
代码实例分析
接下来我们要做的事情是验证我们的模型。这里的目的是看一看我们的模型在其它数据上的效果
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
这里以10000个为分界线把数据分开来,x是训练所用的训练集,y是对应的标签,但是这个时候其实是用了交叉验证的方法,通俗点讲就是前面的数据用来做验证,后面的数据用来训练,这样和前面的过程相反,用了一组数据达到了验证的效果。
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val, y_val))
这里用model。fit来做批次验证,可以看到epochs轮次为20轮,意思是所有的数据要被训练20次,batch size代表一个轮里面每次取512组数据,这个数字理论上可以根据需要调整。
我把前三个轮次的结果列出来:
Train on 15000 samples, validate on 10000 samples
Epoch 1/20
15000/15000 ---- - 5s 354us/step - loss: 0.5058 - binary_accuracy: 0.7938 - val_loss: 0.3961 - val_binary_accuracy: 0.8510
Epoch 2/20
15000/15000 ---- - 2s 162us/step - loss: 0.3044 - binary_accuracy: 0.9036 - val_loss: 0.3046 - val_binary_accuracy: 0.8888
Epoch 3/20
15000/15000 ---- - 2s 161us/step - loss: 0.2222 - binary_accuracy: 0.9273 - val_loss: 0.3026 - val_binary_accuracy: 0.8754
从这些结果可以看出,这个模型对于训练所用的部分的精度可以在三轮之后达到百分之九十以上,但是对于验证的精度却只能维持在百分之八十多。这个情况和很多因素有关,比如数据的大小,模型的搭建,超参数,就是模型里面选择的参数都有关,最后也和选用的方法有关。
history_dict = history.history
history_dict.keys()
每个轮次的验证结果是存储在字典里面的,用history方法去调用字典获取键值,这是为了后面画图做准备。
结果如下:dict_keys([‘val_binary_accuracy’, ‘binary_accuracy’, ‘val_loss’, ‘loss’])
可以看到四个键值,很清楚。下一步就是直观地表达出验证效果了,这里使用的是matplotlib来作图。代码如下:
import matplotlib.pyplot as plt
acc = history.history['binary_accuracy']
val_acc = history.history['val_binary_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
这里作出了随着轮次增加,测试集的损失和验证集的损失图,如图所示:
可以明显看到轮次增加之后损失的变化是截然相反的,用同样的方法,还可以画出准确度的图像。
从上面两个图可以明显发现,这个模型在训练的时候对训练集的效果越来越好,但在预测的时候的效果却变得越来越差,这就是所谓的过拟合问题,鉴于训练的目的就是预测,如果过拟合了,那么这个模型就是没有用处的,这种情况也是我们不想看到的。所以掌握轮次也是比较重要的操作。模型训练完了,看起来百分之八十多的准确率已经还不错了。