第30周:彩色图片分类(Tensorflow实战第二周)

目录

前言

一、前期工作

[1.1 设置GPU](#1.1 设置GPU)

[1.2 导入数据](#1.2 导入数据)

[1.3 数据归一化](#1.3 数据归一化)

[1.4 数据可视化](#1.4 数据可视化)

二、构建CNN网络

[2.1 基本概念](#2.1 基本概念)

[2.2 代码实现](#2.2 代码实现)

三、编译

四、训练模型

五、预测

六、模型评估

总结


前言

说在前面

1)本周任务:学习如何编写一个完整的深度学习程序;了解分类彩色图片和灰度图片有什么区别;测试集accuracy到达72%

2)运行环境:Python3.6、Pycharm2020、tensorflow2.4.0


一、前期工作

1.1 设置GPU

代码如下:

python 复制代码
# 1.1 设置GPU
import tensorflow as tf
import matplotlib.pyplot as plt
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")

1.2 导入数据

代码如下:

python 复制代码
# 1.2 导入数据
from tensorflow.keras import datasets, layers, models
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

1.3 数据归一化

代码如下:

python 复制代码
# 1.3 归一化
# 将像素的值标准化至0到1的区间内。
train_images, test_images = train_images / 255.0, test_images / 255.0
print(train_images.shape, test_images.shape,
      train_labels.shape, test_labels.shape)

打印输出:(50000, 32, 32, 3) (10000, 32, 32, 3) (50000, 1) (10000, 1)

1.4 数据可视化

代码如下:

python 复制代码
#1.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网络

2.1 基本概念

池化层对提取到的特征信息进行降维,一方面使特征图变小,简化网络计算复杂度;另一方面进行特征压缩,提取主要特征,增加平移不变性,减少过拟合风险。但其实池化更多程度上是一种计算性能的一个妥协,强硬地压缩特征的同时也损失了一部分信息,所以现在的网络比较少用池化层或者使用优化后的如SoftPool。

池化层包括最大池化层(MaxPooling)和平均池化层(AveragePooling),均值池化对背景保留更好,最大池化对纹理提取更好)。同卷积计算,池化层计算窗口内的平均值或者最大值。例如通过一个 2*2 的最大池化层,其计算方式如下:

模型结构图如下:

2.2 代码实现

代码如下:

python 复制代码
# 二、构建CNN网络
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()  # 打印网络结构

打印输出:

三、编译

代码如下:

python 复制代码
# 三、编译
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

四、训练模型

代码如下:

python 复制代码
# 四、训练模型
history = model.fit(train_images, train_labels, epochs=15,
                    validation_data=(test_images, test_labels))

打印输出:

Epoch 1/15

1563/1563 [==============================] - 14s 9ms/step - loss: 1.7816 - accuracy: 0.3393 - val_loss: 1.2449 - val_accuracy: 0.5547

Epoch 2/15

1563/1563 [==============================] - 13s 9ms/step - loss: 1.1769 - accuracy: 0.5798 - val_loss: 1.0685 - val_accuracy: 0.6210

Epoch 3/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.9999 - accuracy: 0.6487 - val_loss: 0.9839 - val_accuracy: 0.6495

Epoch 4/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.8891 - accuracy: 0.6879 - val_loss: 0.9301 - val_accuracy: 0.6766

Epoch 5/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.8108 - accuracy: 0.7143 - val_loss: 0.8857 - val_accuracy: 0.6947

Epoch 6/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.7571 - accuracy: 0.7332 - val_loss: 0.8756 - val_accuracy: 0.6972

Epoch 7/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.7010 - accuracy: 0.7553 - val_loss: 0.8619 - val_accuracy: 0.7076

Epoch 8/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.6609 - accuracy: 0.7689 - val_loss: 0.8532 - val_accuracy: 0.7094

Epoch 9/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.6190 - accuracy: 0.7837 - val_loss: 0.8639 - val_accuracy: 0.7116

Epoch 10/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.5839 - accuracy: 0.7942 - val_loss: 0.8705 - val_accuracy: 0.7124

Epoch 11/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.5361 - accuracy: 0.8089 - val_loss: 0.8650 - val_accuracy: 0.7137

Epoch 12/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.5089 - accuracy: 0.8208 - val_loss: 0.8719 - val_accuracy: 0.7175

Epoch 13/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.4602 - accuracy: 0.8381 - val_loss: 0.9218 - val_accuracy: 0.7135

Epoch 14/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.4410 - accuracy: 0.8457 - val_loss: 0.9610 - val_accuracy: 0.7150

Epoch 15/15

1563/1563 [==============================] - 14s 9ms/step - loss: 0.4147 - accuracy: 0.8511 - val_loss: 0.9712 - val_accuracy: 0.7118

五、预测

代码如下:

python 复制代码
# 五、预测
plt.imshow(test_images[1])
import numpy as np
pre = model.predict(test_images)
print(class_names[np.argmax(pre[1])])

打印输出:ship

六、模型评估

代码如下:

python 复制代码
# 六、模型评估
plt.figure(figsize=(10,5))
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.yticks(fontsize=10)
plt.xticks(fontsize=10)
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)

打印输出:

0.7117999792098999

修改优化器为SGD,这时输出的测试集准确率为0.6492000222206116,所以对于本文任务而言,Adam优化器更适用;又继续修改了epoch=20,准确率达到了0.717199981212616


总结

  • 对基于tensorflow框架下搭建深度学习模型的框架有了进一步的了解
  • 分类彩色图片和灰度图片的区别主要体现在以下几个方面:

1)数据维度

彩色图片:通常由三种颜色通道组成(如RGB:红、绿、蓝),每个通道包含了图像的亮度信息,形成一个三维的数据结构。每个像素用三组值表示。

灰度图片:只有一个通道,表示图像的亮度,通常范围是0(黑)到255(白)之间的单一数值。每个像素只用一个值表示。

2)信息丰富度

彩色图片:含有更多的信息和细节,能够传达颜色的变化、色彩的深度和丰富性,适合表现复杂的场景和对象。

灰度图片:信息相对简单,主要通过不同的亮度级别来表现图像的结构和形状,通常用在需要关注形状和轮廓的应用中。

3)处理和计算复杂度

彩色图片:由于亚像素层面上的数据量大,处理和计算通常更加复杂,需要较多的计算资源和时间。

灰度图片:计算更简单,处理速度较快,因为只有一个通道的数据

  • 通过调整训练的epoch提高了测试集上的准确率
相关推荐
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
IT古董11 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
落魄君子11 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
四口鲸鱼爱吃盐11 小时前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
落魄君子12 小时前
ELM分类-单隐藏层前馈神经网络(Single Hidden Layer Feedforward Neural Network, SLFN)
神经网络·分类·数据挖掘
四口鲸鱼爱吃盐13 小时前
Pytorch | 从零构建MobileNet对CIFAR10进行分类
人工智能·pytorch·分类
call me by ur name16 小时前
VLM--CLIP作分类任务的损失函数
人工智能·机器学习·分类
Python机器学习AI16 小时前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
小陈phd19 小时前
深度学习之超分辨率算法——SRCNN
python·深度学习·tensorflow·卷积
机器学习之心21 小时前
BiTCN-BiGRU基于双向时间卷积网络结合双向门控循环单元的数据多特征分类预测(多输入单输出)
深度学习·分类·gru