我们在上一篇文章(TensorFlow实操之–服装图像识别问题-基于Keras)中,我们在TensorFlow框架下采用神经网络的方法实现了服装图像识别,现在我们尝试用CNN的方法来重新实现,看看性能如何。主要步骤
1. 加载必要的包
from __future__ import absolute_import, division, print_function, unicode_literals
from tensorflow import keras
2. 获取数据
数据直接从mninst数据集获取
fashion_mnist=keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
3. 数据预处理
为适应CNN的操作,我们把数据处理成 [样本个数,长,宽,深度] 这四维形式。
train_images=train_images.reshape(train_images.shape[0],28,28,1)
test_images=test_images.reshape(test_images.shape[0],28,28,1)
4. 构建网络模型
通过keras的Sequential创建模型,并添加神经网络的层次。
model=keras.Sequential()
model.add(keras.layers.Conv2D(filters=32,
kernel_size=(3,3),
padding='same',
input_shape=(28,28,1),
activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2,2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Conv2D(filters=64,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2,2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Conv2D(filters=128,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2,2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Conv2D(filters=256,
kernel_size=(3,3),
padding='same',
activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2,2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Dense(1024,activation='relu'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Dense(10,activation='softmax'))
print(model.summary())
通过model.summary()
查看我们的CNN网络结构如下表所示。可以看到我们用了4层卷积池化,一个铺平层,两层全连接层。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 32) 0
_________________________________________________________________
dropout (Dropout) (None, 14, 14, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 14, 14, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 7, 7, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 7, 7, 128) 73856
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128) 0
_________________________________________________________________
dropout_2 (Dropout) (None, 3, 3, 128) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 3, 3, 256) 295168
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 1, 1, 256) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 1, 1, 256) 0
_________________________________________________________________
flatten (Flatten) (None, 256) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 256) 0
_________________________________________________________________
dense (Dense) (None, 1024) 263168
_________________________________________________________________
dropout_5 (Dropout) (None, 1024) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 10250
=================================================================
Total params: 661,258
Trainable params: 661,258
Non-trainable params: 0
5. 配置网络,训练,和 评估
每一项功能都可以用一句代码来实现,分别是
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#
model.fit(train_images,train_labels,epochs=10)
#
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('Test accuracy:', test_acc)
6. 总结
Test accuracy: 0.9035
测试准确性提升到90%以上。
我们用CNN来对服装图像数据进行识别,获得更好的准确率,同时也应该看到其优化的参数数量也巨大,运算需要较多的时间。同时对于网络结构的设置,训练批次,批次大小的设置需要更多的经验来调整。