目录
前言
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
一、我的环境
- 电脑系统: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函数绘制训练和验证过程中的准确率变化曲线。
最后,打印出在测试集上的准确率。