前言
- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
一、我的环境
- 语言环境:Python 3.8.20
- 编译器:jupyter lab
- 深度学习环境:TensorFlow 2.10.0
二、准备工作
1、设置GPU
如果使用的是CPU可以忽略这步
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
if gpus:
gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU
tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用
tf.config.set_visible_devices([gpu0],"GPU")
2、导入数据
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
3、归一化
# 将像素的值标准化至0到1的区间内。
train_images, test_images = train_images / 255.0, test_images / 255.0
train_images.shape,test_images.shape,train_labels.shape,test_labels.shape
4、可视化
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()
三、构建CNN网络
卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,广泛应用于图像和视频处理、自然语言处理等领域。CNN 通过模拟生物视觉系统的工作原理,能够自动提取数据的特征,并进行分类或回归等任务。以下是 CNN 的主要组成部分和工作原理:
1. CNN 的主要组件
-
卷积层(Convolutional Layer):这是 CNN 的核心层,用于从输入数据中提取特征。卷积层通过使用若干个滤波器(也叫卷积核)对输入进行卷积操作,生成特征图(Feature Map)。这些滤波器会检测不同的局部特征,例如边缘、角点等。
-
激活函数(Activation Function):在卷积层之后,通常会应用非线性激活函数(如 ReLU)来引入非线性,使网络能够学习更复杂的特征。
-
池化层(Pooling Layer):池化层用于对特征图进行降采样,从而减少参数数量和计算量,同时提高网络对小的平移和变换的鲁棒性。常见的池化方式有最大池化(Max Pooling)和平均池化(Average Pooling)。
-
全连接层(Fully Connected Layer):在 CNN 的最后几层,通常会加入全连接层,将提取到的高层次特征进行整合,并用于最终的分类或回归任务。
-
输出层(Output Layer):输出层的节点数量等于分类的类别数量(在分类问题中),并通过激活函数(如 Softmax)计算每个类别的概率。
2. CNN 的工作流程
-
输入层:接收原始输入数据(如图像)。通常图像数据会以 RGB 通道格式表示。
-
卷积层和激活函数:通过滤波器提取输入数据的局部特征,并使用激活函数引入非线性。
-
池化层:对特征图进行降采样,减少计算量,并保留重要特征。
-
重复卷积和池化:CNN 可以堆叠多个卷积和池化层,以提取更高层次的特征。
-
全连接层和输出层:将提取的特征整合并用于最终的分类或其他任务。
3. CNN 的优势
- 局部感知:CNN 可以通过卷积操作捕获局部特征。
- 权值共享:滤波器的权值在整个输入上共享,减少了参数数量。
- 空间不变性:池化层能够提高网络对平移、缩放等变换的鲁棒性。
4. 应用场景
- 图像分类:识别图像中的物体或场景。
- 目标检测:检测图像中的特定目标并定位。
- 图像分割:将图像划分为多个区域或对象。
- 自然语言处理:用于文本分类、情感分析等任务。
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), #卷积层1,卷积核3*3
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() # 打印网络结构
四、编译
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
五、训练模型
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
六、预测
通过模型进行预测得到的是每一个类别的概率,数字越大该图片为该类别的可能性越大
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'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
plt.show()
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(test_acc)
八、总结
分类彩色图片和灰度图片在卷积神经网络(CNN)中有一些关键的区别,主要体现在输入的通道数、特征提取的复杂性和训练数据的处理方式上。以下是具体的区别和影响:
1. 输入通道数的差异
- 彩色图片:通常有 3 个通道(RGB),每个通道对应一种颜色(红、绿、蓝)。彩色图片的输入数据形状通常为
(高度, 宽度, 3)
,需要提取多个通道的信息。 - 灰度图片:只有一个通道,输入数据形状为
(高度, 宽度, 1)
或(高度, 宽度)
。灰度图像表示亮度信息,没有颜色信息。
2. 特征提取的复杂性
- 彩色图片:由于包含 RGB 3 个通道的信息,网络需要学习和提取不同颜色通道之间的特征和相互关系。彩色图像能提供更多的细节信息,如颜色分布和色调变化,使得网络有机会学习到更复杂的特征。
- 灰度图片:只有亮度信息,因此只能基于亮度的变化来提取特征。这在某些情况下可能使得分类问题变得更简单,但也可能导致某些基于颜色的特征丢失。
3. 网络结构的影响
- 卷积核大小:无论是彩色图片还是灰度图片,卷积核的大小(如 3x3 或 5x5)通常不变。但对于彩色图片,卷积核会有 3 个深度(对应 RGB 3 个通道);而灰度图片的卷积核只有 1 个深度。
- 输入层权重数量:由于彩色图片有 3 个通道,第一层卷积层的参数会比灰度图片多 3 倍,需要学习更多的权重。
4. 数据预处理的差异
- 彩色图片:通常需要将每个通道的像素值进行标准化,如减去均值或除以标准差。这种标准化操作可以在每个通道上分别进行。
- 灰度图片:只有一个通道,标准化时只需对这一个通道的像素值进行处理。
5. 应用场景的影响
- 彩色图片:更适合分类中需要依赖颜色信息的任务,比如水果分类(红色苹果和绿色苹果)。
- 灰度图片:适用于颜色信息不重要或只关注形状和亮度变化的任务,如手写数字识别(MNIST 数据集)。
6. 模型的训练复杂度
- 彩色图片:由于包含更多信息,模型可能需要更多的训练数据和更深的网络结构,以充分学习不同通道之间的复杂关系。
- 灰度图片:训练相对简单,因为输入信息较少,特征提取的复杂度低。
总之,彩色图片和灰度图片在图像分类中有着不同的处理要求,影响网络的输入、特征提取过程和训练复杂性。