十二 Keras卷积神经网络实例
程序员文章站
2024-03-14 12:20:16
...
数据处理
import tensorflow as tf
import keras
from keras import layers
下载数据集(用vpn)
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()
可以看到第一层网络输出为(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() :
np.argmax(model.predict(test_image[:10]), axis=1)
表示输出前十张图片中,每张图片对应的最大概率值的索引。