在前面学习神经网络的时候,基于Fashion MNIST数据集的softmax函数多分类以及代码实现,已经尝试过使用Fashion Mnist数据集。在本节的学习中,使用卷积神经网络再一次对该数据集进行分析。

代码

几个不同的点,在使用简单的神经网络的时候,对图像预处理是进行扁平化处理。但是使用卷积神经网络的时候,需要加入的数据是一个图片的数据,需要一个四维数据的图片。所谓四维:图片的数量、高、宽、通道。所以要对数据集里的图片进行“增维”。

再次强调,卷积神经网络需要四维的图片数据(数量,宽度,高度,通道数)数据!!

import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 加载Fashion MNIST数据
(train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()

# 将图像扩张到4维,因为卷积神经网络需要载入四维的图像数据
train_image = np.expand_dims(train_image, -1)
# train_image.shape     结果:  (6000,28,28,1)
# 通道为1表示是一张黑白的灰度图片

test_image = np.expand_dims(test_image, -1)

# 卷积神经网络模型的建立
model = tf.keras.Sequential()
# 第一层为卷积层
# 32表示每一层建立32个卷积核,卷积核为3X3大小
model.add(
    tf.keras.layers.Conv2D(32, (3, 3), input_shape=train_image.shape[1:], activation='relu'))
# 池化层
model.add(tf.keras.layers.MaxPool2D())
# 再加入一个卷积层
model.add(
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
# 扁平化会带来太多需要计算的参数,这里进行了一个二维的平均
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(10, activation='softmax'))  # 输出十个概率值,softmax概率分布

# 编译
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',   #输入数据的类别标签采用序号编码
              metrics = ['acc']
)

# 进行训练
history = model.fit(train_image, train_label,epochs=30, validation_data=(test_image, test_label)) 

plt.plot(history.epoch, history.history.get("acc"),label="acc")
plt.plot(history.epoch, history.history.get("val_acc"),label="val_acc")

训练的效果

但是仍然出现了过拟合:

绘制正确率

过拟合优化

针对过拟合,在前面的文章中进行了介绍:

提高神经网络训练的准确率_网络优化与超参数的概念

什么是过拟合?什么是欠拟合?过拟合解决方法之使用Dropout抑制

这里的通过增大网络的规模以及使用Dropout进行抑制:

# 卷积神经网络模型的建立

model = tf.keras.Sequential()
# 第一层为卷积层
# 64表示每一层建立64个卷积核,卷积核为3X3大小
model.add(
    tf.keras.layers.Conv2D(64, (3, 3), input_shape=train_image.shape[1:], activation='relu',padding='same'))
# 64表示每一层建立64个卷积核,卷积核为3X3大小
model.add(
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu',padding='same'))
model.add(
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu',padding='same'))
# 池化层
model.add(tf.keras.layers.MaxPool2D())
# 添加dropout层, 抑制过拟合
model.add(tf.keras.layers.Dropout(0.5))
# 再加入一个卷积层
model.add(
    tf.keras.layers.Conv2D(256, (3, 3), activation='relu',padding='same'))
# 再加入一个卷积层
model.add(
    tf.keras.layers.Conv2D(256, (3, 3), activation='relu',padding='same'))
# 池化层
model.add(tf.keras.layers.MaxPool2D())
# 添加dropout层, 抑制过拟合
model.add(tf.keras.layers.Dropout(0.5))
# 再加入一个卷积层
model.add(
    tf.keras.layers.Conv2D(256, (3, 3), activation='relu',padding='same'))
# 扁平化会带来太多需要计算的参数,这里进行了一个二维的平均
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))  # 输出十个概率值,softmax概率分布

训练的效果:

训练的效果

可以看出略有提升。


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/CNNFashionMnist.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 09 月 21 日
如果觉得我的文章对你有用,请随意赞赏