MNIST数据集是一个手写体数据集,由四部分组成,训练图片集,训练标签集,测试图片集,测试标签集;这个其实并不是普通的文本文件或是图片文件,而是一个压缩文件。
MNIST数据集在深度学习中的地位就好像helloword在学习编程时的地位,所以下边开始对这个数据集的学习。
下载数据集
keras内置了mnist数据集,我们可以直接调用方法去下载
1 | data = keras.datasets.mnist |
这样keras就会自动的去官网下载数据集了,但是这样的下载速度太慢了,一般下载到一般会失败,所以我们直接手动下载下来然后本地读取,这里的读取有两种方法:
到这个文件夹下把下载好的数据集放进去 “C:\Users\your username.keras\datasets”
- 推荐使用这种方法,这样可以直接调用keras内置方法data.load_data()去读取
将下载好的数据集放在任意位置,然后根据源代码,自己写个函数去读取:
- 不推荐
1
2
3
4
5
6
7def load_data():
path = r'E:\dataset\mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
return (x_train, y_train), (x_test, y_test)
- 不推荐
我们可以看到训练集有60000张图片,像素为2828
测试集有10000张图片,像素为2828
我们取出数据集中某张图片,可以看到他的图片和标签。
创建模型
1 | model = keras.Sequential() |
编译模型
1 | model.compile( |
训练模型
1 | model.fit(x_train, y_train, epochs=50, batch_size=512) # batch_size一次训练所取样本数 |
抑制过拟合
可以看到训练后的模型在训练集上精确度很高,但是我们在测试集上测试他的精确度就偏低了,这就是发生了过拟合现象,某个神经元所占的权重过大了,为了抑制这种现象的发生,我们采用Dropout的方法,随机掐死一些神经元,防止出现一家独大的现象。
随机掐死一般的神经元1
2
3
4
5
6
7
8model = keras.Sequential()
model.add(layers.Flatten()) # 将mnist数据集中的(60000, 28, 28) ---> (60000, 28*28, 1)
model.add(layers.Dense(64, activation='relu')) # 将28*28全连接到64个单元
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax')) # 将64全连接到10个单元
现在可以明显看到模型在训练集和测试集上准确率很接近,成功抑制了过拟合现象。1
2
3
4
5
6Epoch 48/50
60000/60000 [==============================] - 1s 13us/step - loss: 0.1782 - accuracy: 0.9536 - val_loss: 0.2408 - val_accuracy: 0.9426
Epoch 49/50
60000/60000 [==============================] - 1s 13us/step - loss: 0.1695 - accuracy: 0.9546 - val_loss: 0.2471 - val_accuracy: 0.9448
Epoch 50/50
60000/60000 [==============================] - 1s 13us/step - loss: 0.1690 - accuracy: 0.9556 - val_loss: 0.2412 - val_accuracy: 0.9442
评估模型
1 | model.evaluate(x_test, y_test) |