第T2周:彩色图片分类

前言

一、我的环境

  • 电脑系统:Windows 11
  • 语言环境:Python 3.9.7
  • 编辑器:Jupyter Lab
  • 深度学习环境:TensorFlow2.4.1

二、代码实现

1. 前期工作

1.1 导入数据

##前期工作
#导入数据
#datasets模块提供了一些常用的数据集,方便用户直接使用。
#layers模块包含了构建神经网络所需的各种层。
#models模块提供了构建和训练模型的工具。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
#datasets.cifar10.load_data()函数从Keras的datasets模块中加载CIFAR-10数据集
#load_data()函数返回两个元组:((train_images, train_labels), (test_images, test_labels))
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

在这里插入图片描述

1.2 归一化

#归一化  
# 将像素的值标准化至0到1的区间内。这样做可以加快模型的训练速度,并且提高模型的收敛性
train_images, test_images = train_images / 255.0, test_images / 255.0
#.shape属性返回数组的维度信息,对于图像数据,形状通常为(数量, 高度, 宽度, 通道数(颜色通道))
train_images.shape,test_images.shape,train_labels.shape,test_labels.shape

在这里插入图片描述

1.3 可视化

#可视化
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer','dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(20,10))
for i in range(20):
    plt.subplot(5,10,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()

在这里插入图片描述

2. 构建CNN网络

##构建CNN网络
model = models.Sequential([
    """
    32表示该层有32个卷积核(过滤器),每个卷积核的尺寸是(3, 3)。
activation='relu'表示激活函数是ReLU(Rectified Linear Unit),它可以帮助解决梯度消失问题,增加非线性。
input_shape=(32, 32, 3)定义了输入数据的形状,即32x32像素的彩色图像,每个像素有3个颜色通道。
    """
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), #卷积层1,卷积核3*3
    """
    最大池化层,用于降低特征图的空间维度,减少计算量。
(2, 2)表示池化窗口的大小是2x2,步长也是2。
    """
    layers.MaxPooling2D((2, 2)),                   #池化层1,2*2采样
    layers.Conv2D(64, (3, 3), activation='relu'),  #卷积层2,卷积核3*3
    layers.MaxPooling2D((2, 2)),                   #池化层2,2*2采样
    layers.Conv2D(64, (3, 3), activation='relu'),  #卷积层3,卷积核3*3
    
    layers.Flatten(),                      #Flatten层,连接卷积层与全连接层
    layers.Dense(64, activation='relu'),   #全连接层,特征进一步提取
    layers.Dense(10)                       #输出层,输出预期结果
])

model.summary()  # 打印网络结构

在这里插入图片描述

3. 编译

##编译
#compile方法是用于配置模型的学习过程,包括选择优化器、损失函数和评估指标
#指定了优化器为Adam。Adam是一种自适应学习率优化算法,它结合了AdaGrad和RMSProp
#两种优化算法的优点,能够自动调整学习率,非常适合处理大规模数据和参数的优化问题
model.compile(optimizer='adam',
              #指定了损失函数为SparseCategoricalCrossentropy。这种损失函数适用于多分类问题,
             # 特别是当标签是整数形式时(即每个样本的标签是一个整数,而不是one-hot编码的形式)
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
            #指定了评估模型性能的指标是准确率(accuracy)
              metrics=['accuracy'])

4. 训练模型

##训练模型
#这个参数指定了训练模型时要遍历整个训练数据集的次数。
#在这里,设置为10,意味着每个训练样本将被模型看到10次
history = model.fit(train_images, train_labels, epochs=10,
#这个参数提供了用于评估模型性能的验证数据。
#在这里,test_images和test_labels分别是之前加载的CIFAR-10数据集中的测试图像和标签。
#在每个epoch结束时,模型会在这些数据上进行评估,以检查其泛化能力。
                    validation_data=(test_images, test_labels))

在这里插入图片描述

5. 预测

##预测
#plt.imshow()是matplotlib库中的一个函数,用于显示图像
plt.imshow(test_images[1])

在这里插入图片描述

import numpy as np

pre = model.predict(test_images)
print(class_names[np.argmax(pre[1])])

在这里插入图片描述

#模型评估
import matplotlib.pyplot as plt
#使用plt.plot()函数绘制训练过程中的准确率变化曲线
#history.history['accuracy']是训练过程中每个epoch的准确率值
plt.plot(history.history['accuracy'], label='accuracy')
#绘制验证集上的准确率变化曲线
#history.history['val_accuracy']是每个epoch在验证集上的准确率值
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
#设置x轴的标签为"Epoch",表示训练周期
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
#设置y轴的显示范围从0.5到1,即50%到100%的准确率
plt.ylim([0.5, 1])
#添加图例,并且指定图例的位置在图表的右下角
plt.legend(loc='lower right')
plt.show()
#model.evaluate()是Keras模型的一个方法,用于评估模型在整个测试集上的性能
#verbose=2参数表示在评估过程中打印详细的输出信息
#这行代码返回两个值:test_loss是测试集上的损失值,test_acc是测试集上的准确率
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

在这里插入图片描述

print(test_acc)

在这里插入图片描述

三、心得体会

1. 分类彩色图片会灰度图片有什么区别

数据表示:

彩色图片:通常以RGB(红、绿、蓝)颜色模型来表示,每个像素点包含三个颜色通道的强度值,因此每个像素通常由三个字节表示,分别对应RGB通道。
灰度图片:仅包含亮度信息,没有颜色信息。每个像素点只有一个强度值,通常用一个字节表示。

信息量:

彩色图片提供了更多的信息,包括颜色和亮度,这使得它们在视觉上更丰富,也更适合人类观看。
灰度图片只包含亮度信息,不包含颜色信息,因此信息量较少。

处理复杂度:

彩色图片的处理通常比灰度图片更复杂,因为需要处理更多的数据。例如,彩色图片在进行边缘检测、特征提取等操作时,可能需要考虑多个通道的信息。
灰度图片由于数据量较小,处理起来相对简单,计算量也较小。

2. 流程总结

本周任务是对CIFAR-10数据集中的图像进行分类。CIFAR-10是一个常用的小型图像数据集,包含10个类别的60000张32x32彩色图像。以下是代码的主要作用和涉及的知识点:

导入必要的库:
    tensorflow:一个开源机器学习库,广泛用于深度学习模型的构建和训练。
    datasets:Keras库中的模块,用于加载和处理数据集。
    layers:Keras库中的模块,包含构建神经网络所需的各种层。
    models:Keras库中的模块,提供构建和训练模型的工具。
    matplotlib.pyplot:用于数据可视化的库。

加载和预处理数据:
    使用datasets.cifar10.load_data()函数加载CIFAR-10数据集。
    将图像数据归一化,即将像素值从0-255标准化到0-1,以加快训练速度并提高模型收敛性。

数据可视化:
    使用matplotlib库显示部分训练图像及其类别标签,以直观了解数据集。

构建CNN模型:
    使用Sequential模型,这是一个线性堆叠的层序列。
    添加多个卷积层(Conv2D),每个卷积层后面通常跟着一个激活函数(如ReLU)和一个最大池化层(MaxPooling2D),用于特征提取和降维。
    添加一个Flatten层,将多维输入一维化,以便连接到全连接层(Dense)。
    添加全连接层进行特征进一步提取,并在输出层使用10个神经元对应10个类别。

编译模型:
    使用compile方法配置模型的学习过程,包括选择优化器(如Adam)、损失函数(如SparseCategoricalCrossentropy)和评估指标(如准确率)。

训练模型:
    使用fit方法训练模型,指定训练的轮数(epochs)和验证数据。

评估和预测:
    使用evaluate方法在测试集上评估模型性能。
    使用plot函数绘制训练和验证过程中的准确率变化曲线。
    最后,打印出在测试集上的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值