python与深度学习(七):CNN和fashion_mnist

1. 说明

本篇文章是CNN的另外一个例子,fashion_mnist,是衣服类的数据集。
可以搭建和手写数字识别的一样的模神经网络来训练模型。

2. fashion_mnist实战

2.1 导入相关库

以下第三方库是python专门用于深度学习的库

# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras
from keras.datasets import fashion_mnist
# 引入绘制acc和loss曲线的库
import matplotlib.pyplot as plt
# 引入ANN的必要的类
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten
from keras.models import Sequential
from keras import optimizers, losses

2.2 加载数据

把fashion_mnist数据集进行加载

"1.加载数据"
"""
x_train是fashion_mnist训练集图片,大小的28*28的,y_train是对应的标签是数字
x_test是fashion_mnist测试集图片,大小的28*28的,y_test是对应的标签是数字
"""
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()  # 加载fashion_mnist数据集
print('mnist_data:', x_train.shape, y_train.shape, x_test.shape, y_test.shape)  # 打印训练数据和测试数据的形状

2.3 数据预处理

(1) 将输入的图片进行归一化,从0-255变换到0-1;
(2) 将输入图片的形状(60000,28,28)转换成(60000,28,28,1),相当于将图片拉直,便于输入给神经网络;
(3) 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数, 计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算 独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0。

"2.数据预处理"


def preprocess(x, y):  # 数据预处理函数
    x = tf.cast(x, dtype=tf.float32) / 255.  # 将输入的图片进行归一化,从0-255变换到0-1
    x = tf.reshape(x, [28, 28, 1])
    """
    # 将输入图片的形状(60000,28,28)转换成(60000,28,28,1),
    相当于将图片拉直,便于输入给神经网络
    """
    y = tf.cast(y, dtype=tf.int32)  # 将输入图片的标签转换为int32类型
    y = tf.one_hot(y, depth=10)
    """
    # 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数,
    计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算
    独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0
    """
    return x, y

2.4 数据处理

数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象

batchsz = 128  # 每次输入给神经网络的图片数
"""
数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象
"""
db = tf.data.Dataset.from_tensor_slices((x_train, y_train))  # 构建训练集对象
db = db.map(preprocess).shuffle(60000).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理
ds_val = tf.data.Dataset.from_tensor_slices((x_test, y_test))  # 构建测试集对象
ds_val = ds_val.map(preprocess).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理

2.5 构建网络模型

构建了两层卷积层,两层池化层,然后是展平层(将二维特征图拉直输入给全连接层),然后是三层全连接层。

"3.构建网络模型"
model = Sequential([Conv2D(filters=6, kernel_size=(5, 5), activation='relu'),
                    MaxPool2D(pool_size=(2, 2), strides=2),
                    Conv2D(filters=16, kernel_size=(5, 5), activation='relu'),
                    MaxPool2D(pool_size=(2, 2), strides=2),
                    Flatten(),
                    Dense(120, activation='relu'),
                    Dense(84, activation='relu'),
                    Dense(10,activation='softmax')])

model.build(input_shape=(None, 28, 28, 1))  # 模型的输入大小
model.summary()  # 打印网络结构

2.6 模型编译

模型的优化器是Adam,另外一种优化方法,学习率是0.01,
损失函数是losses.CategoricalCrossentropy,多分类交叉熵,
性能指标是正确率accuracy。

"4.模型编译"
model.compile(optimizer='Adam',
              loss=losses.CategoricalCrossentropy(from_logits=False),
              metrics=['accuracy']
                )
"""
模型的优化器是Adam
损失函数是losses.CategoricalCrossentropy,
性能指标是正确率accuracy
"""

2.7 模型训练

模型训练的次数是20,每1次循环进行测试

"5.模型训练"
history = model.fit(db, epochs=20, validation_data=ds_val, validation_freq=1)
"""
模型训练的次数是20,每1次循环进行测试
"""

2.8 模型保存

以.h5文件格式保存模型

"6.模型保存"
model.save('cnn_fashion.h5')  # 以.h5文件格式保存模型

2.9 模型评价

得到测试集的正确率

"7.模型评价"
model.evaluate(ds_val)  # 得到测试集的正确率

2.10 模型测试

对模型进行测试

"8.模型测试"
sample = next(iter(ds_val))  # 取一个batchsz的测试集数据
x = sample[0]  # 测试集数据
y = sample[1]  # 测试集的标签
pred = model.predict(x)  # 将一个batchsz的测试集数据输入神经网络的结果
pred = tf.argmax(pred, axis=1)  # 每个预测的结果的概率最大值的下标,也就是预测的数字
y = tf.argmax(y, axis=1)  # 每个标签的最大值对应的下标,也就是标签对应的数字
print(pred)  # 打印预测结果
print(y)  # 打印标签数字

2.11 模型训练结果的可视化

对模型的训练结果进行可视化

"9.模型训练时的可视化"
# 显示训练集和验证集的acc和loss曲线
acc = history.history['accuracy']  # 获取模型训练中的accuracy
val_acc = history.history['val_accuracy']  # 获取模型训练中的val_accuracy
loss = history.history['loss']  # 获取模型训练中的loss
val_loss = history.history['val_loss']  # 获取模型训练中的val_loss
# 绘值acc曲线
plt.figure(1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
# 绘制loss曲线
plt.figure(2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()  # 将结果显示出来

3. fashion_mnist的CNN模型可视化结果图

Epoch 1/20
469/469 [==============================] - 13s 21ms/step - loss: 0.6610 - accuracy: 0.7600 - val_loss: 0.5067 - val_accuracy: 0.8097
Epoch 2/20
469/469 [==============================] - 12s 24ms/step - loss: 0.4408 - accuracy: 0.8375 - val_loss: 0.4202 - val_accuracy: 0.8491
Epoch 3/20
469/469 [==============================] - 12s 24ms/step - loss: 0.3844 - accuracy: 0.8595 - val_loss: 0.3868 - val_accuracy: 0.8605
Epoch 4/20
469/469 [==============================] - 13s 27ms/step - loss: 0.3507 - accuracy: 0.8707 - val_loss: 0.3924 - val_accuracy: 0.8533
Epoch 5/20
469/469 [==============================] - 13s 27ms/step - loss: 0.3272 - accuracy: 0.8805 - val_loss: 0.3621 - val_accuracy: 0.8674
Epoch 6/20
469/469 [==============================] - 14s 27ms/step - loss: 0.3106 - accuracy: 0.8859 - val_loss: 0.3436 - val_accuracy: 0.8728
Epoch 7/20
469/469 [==============================] - 14s 28ms/step - loss: 0.2923 - accuracy: 0.8923 - val_loss: 0.3429 - val_accuracy: 0.8732
Epoch 8/20
469/469 [==============================] - 14s 29ms/step - loss: 0.2821 - accuracy: 0.8962 - val_loss: 0.3268 - val_accuracy: 0.8802
Epoch 9/20
469/469 [==============================] - 14s 28ms/step - loss: 0.2714 - accuracy: 0.8994 - val_loss: 0.3208 - val_accuracy: 0.8832
Epoch 10/20
469/469 [==============================] - 14s 28ms/step - loss: 0.2621 - accuracy: 0.9031 - val_loss: 0.3187 - val_accuracy: 0.8822
Epoch 11/20
469/469 [==============================] - 12s 24ms/step - loss: 0.2517 - accuracy: 0.9059 - val_loss: 0.3154 - val_accuracy: 0.8870
Epoch 12/20
469/469 [==============================] - 12s 25ms/step - loss: 0.2418 - accuracy: 0.9098 - val_loss: 0.3058 - val_accuracy: 0.8928
Epoch 13/20
469/469 [==============================] - 12s 25ms/step - loss: 0.2344 - accuracy: 0.9129 - val_loss: 0.3182 - val_accuracy: 0.8885
Epoch 14/20
469/469 [==============================] - 12s 24ms/step - loss: 0.2277 - accuracy: 0.9150 - val_loss: 0.3212 - val_accuracy: 0.8824
Epoch 15/20
469/469 [==============================] - 12s 24ms/step - loss: 0.2190 - accuracy: 0.9177 - val_loss: 0.2903 - val_accuracy: 0.8981
Epoch 16/20
469/469 [==============================] - 12s 24ms/step - loss: 0.2141 - accuracy: 0.9198 - val_loss: 0.3071 - val_accuracy: 0.8895
Epoch 17/20
469/469 [==============================] - 12s 25ms/step - loss: 0.2091 - accuracy: 0.9211 - val_loss: 0.3042 - val_accuracy: 0.8897
Epoch 18/20
469/469 [==============================] - 13s 26ms/step - loss: 0.2018 - accuracy: 0.9239 - val_loss: 0.2985 - val_accuracy: 0.8973
Epoch 19/20
469/469 [==============================] - 13s 26ms/step - loss: 0.1942 - accuracy: 0.9275 - val_loss: 0.2867 - val_accuracy: 0.9026
Epoch 20/20
469/469 [==============================] - 12s 25ms/step - loss: 0.1887 - accuracy: 0.9286 - val_loss: 0.3019 - val_accuracy: 0.9005
79/79 [==============================] - 1s 9ms/step - loss: 0.3019 - accuracy: 0.9005

在这里插入图片描述
在这里插入图片描述
从以上结果可知,模型的准确率达到了90%

4. 完整代码

# python练习
# 重新学习时间:2023/5/2 14:46
# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras
from keras.datasets import fashion_mnist
# 引入绘制acc和loss曲线的库
import matplotlib.pyplot as plt
# 引入ANN的必要的类
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten
from keras.models import Sequential
from keras import optimizers, losses

"1.加载数据"
"""
x_train是fashion_mnist训练集图片,大小的28*28的,y_train是对应的标签是数字
x_test是fashion_mnist测试集图片,大小的28*28的,y_test是对应的标签是数字
"""
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()  # 加载fashion_mnist数据集
print('mnist_data:', x_train.shape, y_train.shape, x_test.shape, y_test.shape)  # 打印训练数据和测试数据的形状

"2.数据预处理"


def preprocess(x, y):  # 数据预处理函数
    x = tf.cast(x, dtype=tf.float32) / 255.  # 将输入的图片进行归一化,从0-255变换到0-1
    x = tf.reshape(x, [28, 28, 1])
    """
    # 将输入图片的形状(60000,28,28)转换成(60000,28,28,1),
    相当于将图片拉直,便于输入给神经网络
    """
    y = tf.cast(y, dtype=tf.int32)  # 将输入图片的标签转换为int32类型
    y = tf.one_hot(y, depth=10)
    """
    # 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数,
    计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算
    独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0
    """
    return x, y


batchsz = 128  # 每次输入给神经网络的图片数
"""
数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象
"""
db = tf.data.Dataset.from_tensor_slices((x_train, y_train))  # 构建训练集对象
db = db.map(preprocess).shuffle(60000).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理
ds_val = tf.data.Dataset.from_tensor_slices((x_test, y_test))  # 构建测试集对象
ds_val = ds_val.map(preprocess).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理

"3.构建网络模型"
model = Sequential([Conv2D(filters=6, kernel_size=(5, 5), activation='relu'),
                    MaxPool2D(pool_size=(2, 2), strides=2),
                    Conv2D(filters=16, kernel_size=(5, 5), activation='relu'),
                    MaxPool2D(pool_size=(2, 2), strides=2),
                    Flatten(),
                    Dense(120, activation='relu'),
                    Dense(84, activation='relu'),
                    Dense(10,activation='softmax')])

model.build(input_shape=(None, 28, 28, 1))  # 模型的输入大小
model.summary()  # 打印网络结构

"4.模型编译"
model.compile(optimizer='Adam',
              loss=losses.CategoricalCrossentropy(from_logits=False),
              metrics=['accuracy']
                )
"""
模型的优化器是Adam
损失函数是losses.CategoricalCrossentropy,
性能指标是正确率accuracy
"""

"5.模型训练"
history = model.fit(db, epochs=20, validation_data=ds_val, validation_freq=1)
"""
模型训练的次数是20,每1次循环进行测试
"""
"6.模型保存"
model.save('cnn_fashion.h5')  # 以.h5文件格式保存模型

"7.模型评价"
model.evaluate(ds_val)  # 得到测试集的正确率

"8.模型测试"
sample = next(iter(ds_val))  # 取一个batchsz的测试集数据
x = sample[0]  # 测试集数据
y = sample[1]  # 测试集的标签
pred = model.predict(x)  # 将一个batchsz的测试集数据输入神经网络的结果
pred = tf.argmax(pred, axis=1)  # 每个预测的结果的概率最大值的下标,也就是预测的数字
y = tf.argmax(y, axis=1)  # 每个标签的最大值对应的下标,也就是标签对应的数字
print(pred)  # 打印预测结果
print(y)  # 打印标签数字

"9.模型训练时的可视化"
# 显示训练集和验证集的acc和loss曲线
acc = history.history['accuracy']  # 获取模型训练中的accuracy
val_acc = history.history['val_accuracy']  # 获取模型训练中的val_accuracy
loss = history.history['loss']  # 获取模型训练中的loss
val_loss = history.history['val_loss']  # 获取模型训练中的val_loss
# 绘值acc曲线
plt.figure(1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
# 绘制loss曲线
plt.figure(2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()  # 将结果显示出来

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您好!Fashion-MNIST是一个流行的图像分类数据集,用于训练和测试机器学习模型。卷积神经网络(Convolutional Neural Network,CNN)是一种常用的深度学习模型,特别适用于图像相关的任务。 要使用卷积神经网络对Fashion-MNIST数据集进行分类,通常需要以下步骤: 1. 准备数据集:首先,您需要下载Fashion-MNIST数据集并加载到您的程序中。这个数据集包含了10个类别的服装图像,每个类别有6000张训练图像和1000张测试图像。 2. 数据预处理:在训练模型之前,您需要对数据进行预处理。这通常包括将像素值归一化到0到1之间,将标签转换为独热编码(one-hot encoding),以及将数据划分为训练集和验证集。 3. 构建卷积神经网络模型:使用卷积层、池化层和全连接层来构建您的卷积神经网络模型。您可以选择不同的架构和超参数来优化模型性能。 4. 模型训练:使用训练集对模型进行训练。通过反向传播和梯度下降算法,不断调整模型参数以最小化损失函数。 5. 模型评估:使用测试集评估模型的性能。计算准确率、精确率、召回率等指标,了解模型在未见过的数据上的表现。 6. 模型优化:根据评估结果,对模型进行调整和优化。可以尝试不同的网络架构、正则化技术、优化算法等来提升模型性能。 这只是一个简要的概述,实际上在实现Fashion-MNIST卷积神经网络时,还需要考虑数据增强、调参等细节。如果您需要更具体的代码实现或深入的解释,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜yuan~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值