Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
flatten (Flatten) (None, 5408) 0
_________________________________________________________________
dense (Dense) (None, 32) 173088
_________________________________________________________________
dense_1 (Dense) (None, 10) 330
=================================================================
Total params: 173,738
Trainable params: 173,738
Non-trainable params: 0
_________________________________________________________________
要构建如上一个简单的CNN模型,利用keras包,可以很快很方便的搭建出来,对于像我这样的菜鸟新手来讲,keras确实是一种非常好用的库。
简单解释一下上面这个CNN模型
- 输入28x28的图像,进入卷积层,相关参数为
filters=32,kernel_size=(3,3),strides=(1,1),padding='valid',activation='relu'
32个fileters,核大小3x3,步长1x1,padding填充为valid,激活函数ReLU - 然后进行maxpooling,得到13x13x32的图像
- 接着是flatten,其作用是压平参数,13x13x32=5408,这是为了方便后面的全连接层的计算
- 最后是两个全连接层,第一个共32个神经元,激活函数使用ReLU,第二个共10个神经元,激活函数使用softmax,10个神经元也代表从0到9的10个分类
Code:
'''**********************实现CNN进行MNIST手写识别**********************'''
'''0.载入包'''
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
import matplotlib.pyplot as plt
'''1.载入数据 '''
(x_train,y_train),(x_test,y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape((-1,28,28,1))
x_test = x_test.reshape((-1,28,28,1))
'''2.构造模型'''
model = keras.Sequential()
model.add(layers.Conv2D(input_shape = (x_train.shape[1], x_train.shape[2], x_train.shape[3]),
filters=32,kernel_size=(3,3),strides=(1,1),padding='valid',activation='relu'))# 输出(28-3+2x0)/1+1=26 26x26x32
model.add(layers.MaxPool2D(pool_size=(2,2)))# maxpool,输出13x13x32
model.add(layers.Flatten())# 压平,13x13x32=5408,为了方便全连接计算
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=['acc'])
model.summary()
'''3.训练模型'''
history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)#0.1的比例作为验证集
'''4.评估模型'''
res = model.evaluate(x_test, y_test)
print(res) # loss: 0.1238 - acc: 0.9705
参考资料:
1.keras文档:https://keras.io/
2.Tensorflow2教程:https://zhuanlan.zhihu.com/p/60900649