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
图像的数据的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)
model.evaluate(test_image, test_label)
np.argmax(model.predict(test_image[:10]), axis=1)
test_label[:10]
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)
model.evaluate(test_image, test_label)
注意:层数过大也会导致训练太慢,反向传播效果变弱。