TensorFlow实操之---基于Keras+CNN实现服装图像识别

我们在上一篇文章(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来对服装图像数据进行识别,获得更好的准确率,同时也应该看到其优化的参数数量也巨大,运算需要较多的时间。同时对于网络结构的设置,训练批次,批次大小的设置需要更多的经验来调整。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值