十二 Keras卷积神经网络实例(手写数字识别)

文章目录

      • 数据处理
      • 初始化模型
      • 添加层,构建网络
      • 编译模型
      • 训练模型
      • 模型评估及预测
      • 网络优化

数据处理

import tensorflow as tf
import keras
from keras import layers

下载数据集(用)

import keras.datasets.mnist as mnist
(train_image, train_label), (test_image, test_label) = mnist.load_data()

在这里插入图片描述
查看训练集

train_image.shape

在这里插入图片描述
训练集是60000张28*28像素的图片组成

图像的数据的shape
hight width channel(黑白图像是1,彩色图像是3)

conv2d 要求数据是一个高 宽 channel 形状的图像
conv2d:图片输入形状:batch(有多少张图片) ,高,宽, channel
为了给conv2d输入图像,我们需要将图片扩宽一个用来表示channel的维度
dense:图片输入形状:batch(有多少张图片) ,data

train_image = np.expand_dims(train_image, axis=-1) ##axis=-1表示在最后一个维度上扩增

此时再看训练集图像形状

在这里插入代码片

在这里插入图片描述
此时变为一个四维数据形状
测试集也扩宽维度

test_image = np.expand_dims(test_image, axis=-1)

初始化模型

model = keras.Sequential()

添加层,构建网络

##卷积层
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1), name='conv_1'))
##64个卷积核,体现在channel会从变为64,(3,3)是卷积核大小为3*3,卷积函数relu,输入数据形状填后三个维度
model.add(layers.Conv2D(64, (3, 3), activation='relu', name='conv_2'))
##添加第二层就不用填输入形状了
##池化层
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
##MaxPooling2D默认就可以,这一行也可以写model.add(layers.MaxPooling2D(pool_size=()))
##数据扁平化变成二维形状从而输入到layers层
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu', name='dense_1'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax', name='dense_2'))
model.summary()

十二 Keras卷积神经网络实例(手写数字识别)_第1张图片
可以看到第一层网络输出为(26,26,64),卷积核不能被28整除,所以图像会减小一些
可以看到第一层网络输出为(24,24,64),卷积核不能被28整除,所以图像会减小一些
第三层池化操作输出为(12,12,64)
第四层扁平化操作将三维数据变为二维数据
第五层Dense
第六层Droupout层
第七层Dense层输出10个单元

编译模型

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',##对应的label是0123456789顺序编码所以用这个
              metrics=['accuracy'])

训练模型

model.fit(train_image, train_label, epochs=3, batch_size=512)

训练时间花费很长时间,超过三次
在这里插入图片描述

模型评估及预测

model.evaluate(test_image, test_label)

在这里插入图片描述
测试集上的准确率也很高,比之前的Dense要高.

model.evaluate(test_image, test_label)

在这里插入图片描述
测试集上准确率也很高
预测前十张图片

np.argmax(model.predict(test_image[:10]), axis=1)

在这里插入图片描述
实际前十张图片

test_label[:10]

在这里插入图片描述
可以看出结果预测全对
argmax() :
十二 Keras卷积神经网络实例(手写数字识别)_第2张图片
在这里插入图片描述

 np.argmax(model.predict(test_image[:10]), axis=1)

表示输出前十张图片中,每张图片对应的最大概率值的索引。

网络优化

1: 增加卷积层
2:增加卷积核个数

model = keras.Sequential()
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_image, train_label, epochs=10, batch_size=512)

十二 Keras卷积神经网络实例(手写数字识别)_第3张图片

model.evaluate(test_image, test_label)

在这里插入图片描述
测试集准确率变大

注意:层数过大也会导致训练太慢,反向传播效果变弱。

你可能感兴趣的:(Keras,深度学习)