一、搭建模型整体架构
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())
model.summary()
model.add(layers.Flatten())
model.summary()
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
代码讲解:
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)))
1、添加第一层:
layers.Conv2D参数详解:
Init signature:
layers.Conv2D(
filters,
kernel_size,
...
activation=None,
input_shape,)
filters 要去训练多少个卷积核
kernel_size: 卷积核大小
activation: 非线性化所需要去使用的激活函数
input_shape:输入数据的形状
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
2、添加第二层
第二层添加的时候就不需要 input_shape 这个参数了,因为默认是去根据上一层输出的形状进行计算。
model.add(layers.MaxPooling2D())
3、添加池化层
默认参数,无需修改。其中pool_size=(2,2)
model.summary()
4、参看模型参数
疑问:为什么不是28 * 28?
因为Conv2D中参数 Padding = ‘valid' 使得图像像素大小不能用卷积核整除,所以图像会有所损失
5、将数据扁平化
model.add(layers.Flatten())
model.summary()
6、添加Dense层
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
输出十个数据,所以最后是10,是多分类问题,所以激活函数是 softmax
上面就是一个十分简单的典型卷积神经网络
二、训练和优化
train_label
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
model.fit(train_image, train_label, epochs=10, batch_size=512)
代码讲解:
1、编译阶段:
根据train_label
发现他是一个顺序编码,所以使用的损失函数是: sparse_categorical_crossentropy
2、训练阶段:
model.fit(train_image, train_label, epochs=10, batch_size=512)
3、做出预测
import numpy as np
np.argmax(model.predict(test_image[:10]),axis=1)
test_label[:10]
4、如何优化
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())
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D())
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.summary()