第T2周:彩色图片分类

前言

一、我的环境

  • 语言环境: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 的工作流程

  1. 输入层:接收原始输入数据(如图像)。通常图像数据会以 RGB 通道格式表示。

  2. 卷积层和激活函数:通过滤波器提取输入数据的局部特征,并使用激活函数引入非线性。

  3. 池化层:对特征图进行降采样,减少计算量,并保留重要特征。

  4. 重复卷积和池化:CNN 可以堆叠多个卷积和池化层,以提取更高层次的特征。

  5. 全连接层和输出层:将提取的特征整合并用于最终的分类或其他任务。

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. 模型的训练复杂度

  • 彩色图片:由于包含更多信息,模型可能需要更多的训练数据和更深的网络结构,以充分学习不同通道之间的复杂关系。
  • 灰度图片:训练相对简单,因为输入信息较少,特征提取的复杂度低。

总之,彩色图片和灰度图片在图像分类中有着不同的处理要求,影响网络的输入、特征提取过程和训练复杂性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值