avatar

深度学习入门(二)

MNIST数据集是一个手写体数据集,由四部分组成,训练图片集,训练标签集,测试图片集,测试标签集;这个其实并不是普通的文本文件或是图片文件,而是一个压缩文件。
MNIST数据集在深度学习中的地位就好像helloword在学习编程时的地位,所以下边开始对这个数据集的学习。

下载数据集

keras内置了mnist数据集,我们可以直接调用方法去下载

1
2
data = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = data.load_data()

这样keras就会自动的去官网下载数据集了,但是这样的下载速度太慢了,一般下载到一般会失败,所以我们直接手动下载下来然后本地读取,这里的读取有两种方法:

  1. 到这个文件夹下把下载好的数据集放进去 “C:\Users\your username.keras\datasets”

    • 推荐使用这种方法,这样可以直接调用keras内置方法data.load_data()去读取
  2. 将下载好的数据集放在任意位置,然后根据源代码,自己写个函数去读取:

    • 不推荐
      1
      2
      3
      4
      5
      6
      7
      def 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张图片,像素为28
28
我们取出数据集中某张图片,可以看到他的图片和标签。

创建模型

1
2
3
4
5
6
model = 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.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax')) # 将64全连接到10个单元

编译模型

1
2
3
4
5
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)

训练模型

1
2
3
4
5
6
7
8
9
10
model.fit(x_train, y_train, epochs=50, batch_size=512)  # batch_size一次训练所取样本数

Epoch 47/50
60000/60000 [==============================] - 1s 12us/step - loss: 0.0676 - accuracy: 0.9818
Epoch 48/50
60000/60000 [==============================] - 1s 12us/step - loss: 0.0570 - accuracy: 0.9833
Epoch 49/50
60000/60000 [==============================] - 1s 13us/step - loss: 0.0538 - accuracy: 0.9843
Epoch 50/50
60000/60000 [==============================] - 1s 11us/step - loss: 0.0517 - accuracy: 0.9851

抑制过拟合

可以看到训练后的模型在训练集上精确度很高,但是我们在测试集上测试他的精确度就偏低了,这就是发生了过拟合现象,某个神经元所占的权重过大了,为了抑制这种现象的发生,我们采用Dropout的方法,随机掐死一些神经元,防止出现一家独大的现象。

随机掐死一般的神经元

1
2
3
4
5
6
7
8
model = 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
6
Epoch 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
2
3
4
model.evaluate(x_test, y_test)  

10000/10000 [==============================] - 0s 18us/step
[0.24123203506022692, 0.9441999793052673]
文章作者: gh
文章链接: https://ghclub.top/posts/43712/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GHBlog
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论