彩色图片分类

2023-10-28 17:50
文章标签 分类 彩色图片

本文主要是介绍彩色图片分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文为🔗365天深度学习训练营 中的学习记录博客
 原作者:K同学啊|接辅导、项目定制

我的环境:

1.语言:python3.7

2.编译器:pycharm

3.深度学习环境:TensorFlow2.5


一.前期工作

1.设置GPU

若是使用的是cpu可忽略

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")if gpus:gpu0 = gpus[0]tf.config.experimental.set_memory_growth(gpu0, True)tf.config.set_visible_devices([gpu0],"GPU")

使用cpu训练

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

2.导入包

import os
import  tensorflow as tf
from tensorflow.keras import datasets,layers,models
import matplotlib.pyplot as plt
import numpy as np

3.设置数据集

CIFAR10 数据集一共有10 类,总共 60000 张彩色图片,每类图片有 6000 张。此数据集中 50000 个样例被作为训练集,剩余 10000 个样例作为测试集。类之间相互度立,不存在重叠的部分。

#导入数据集依次为训练集图片、训练集标签、测试集图片、测试集标签
(train_images,train_labels),(test_images,test_labels) = datasets.cifar10.load_data()

tensorflow会自动下载数据保存到(C:\Users\86133\.keras\datasets)

4.归一化

把数值放缩到0到1的小区间中

好处

  1. 提高迭代求解的收敛速度
  2. 提高迭代求解的精度

缺点:

  1. 最大值与最小值非常容易受异常点影响
  2. 鲁棒性较差,只适合传统精确小数据场景#将像素的值标准化到0到1的区间。(对于灰度图像来说,每个图像的最大值是255,每个像素最小值是0,所以直接除以255即可完成归一化) train_images,test_images = train_images / 255.0 , test_images / 255.0 train_images.shape,test_labels.shape,train_labels.shape,test_labels.shape
#将像素的值标准化到0到1的区间。(对于灰度图像来说,每个图像的最大值是255,每个像素最小值是0,所以直接除以255即可完成归一化)
train_images,test_images = train_images / 255.0 , test_images / 255.0train_images.shape,test_labels.shape,train_labels.shape,test_labels.shape

5、可视化

#打印一个标签数组,绘制前20行,每行5张共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(4,5,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网络(关于卷积层可参考)

1、卷积层

(1)卷积计算

卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此在CNN中,可以(有可能)正确理解图像等具有形状的数据。

CNN中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)。

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。

假设输入图片是3*3,与一个2*2的卷积核,计算如下

输入的元素与对应核函数上的元素相乘再求和(2 * 1+3 * 2+4 * 3 +2 * 0 = 20),再将其保存在输出的对应位置上。然后将这个过程在所有位置上都进行一遍,就能得到卷积运算的输出。

输入大小为n * n的图片,通过m * m的卷积核,输出维度为(n-m+1)*(n-m+1)

(2)填充

在进行卷积层处理之前,有时需要先对输入进行一下特殊处理(为输入图像的边界四周填充数据可将其由3*3变为4*4),下图填充为0

输入大小n * n的图片,通过k * k的卷积核,填充为p,输出维度为(n-k+1+2p)*(n-k+1+2p)

每次进行卷积运算输出都所会缩小空间,若不进行填充操作,在某个时刻输出大小就有可能变为1,无法再应用卷积运算。

(3)步幅

应用于输入的位置间隔叫做步幅。以上的例子步幅都为1.有时候为了高效计算或者缩减采样次数,卷积计算有时候会跳过中间的位置,每次滑动多个元素。使用步幅为2,计算如下:

输入大小n * n的图片,通过k * k的卷积核,填充为p,步幅为s,输出维度为((n-k+2p) / s + 1)*((n-k+2p) / s + 1),若算出不为整数向下取整。

2、池化层

池化层是模仿人类视觉系统对数据进行降维,一方面使特征图变小,简化网络计算复杂度;另一方面对特征压缩,提取主要特征,提升模型的尺度不变性、旋转不变性。减少过拟合风险。

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

 CNN模型

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) #卷积层1,卷积核3*3
model.add(layers.MaxPooling2D((2, 2))) #最大池化层1,2*2采样
model.add(layers.Dropout(0.2))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))  # 卷积层2,卷积核3*3
model.add(layers.MaxPooling2D((2, 2)))  # 最大池化层2,2*2采样
model.add(layers.Dropout(0.2))
model.add(layers.Conv2D(64, (3, 3), activation='relu')) # 卷积层3,卷积核3*3
#在模型的最后,您将把卷积后的输出张量(本例中形状为 (4, 4, 64))传给一个或多个 Dense 层来完成分类。
model.add(layers.Flatten()) # Flatten层,连接卷积层与全连接层
model.add(layers.Dense(64, activation='relu')) # 全连接层,特征进一步提取
model.add(layers.Dense(10)) # 输出层,输出预期结果
model.summary()# 打印网络结构

model = models.Sequential() #构建一个空的网络模型,它是一个线性堆叠模型,各种神经网络会被顺序添加。

layers.Conv2D()#构建一个卷积层

layers.MacxPooling2D() #构建一个最大池化层

layers.Flatten() # Flatten层,连接卷积层与全连接层,把多维的输入一维化,常用在从卷积层到全连接层的过渡。

每个最大池化层后我都加入了一个Dropout,它可以通过随机失活神经元,强制网络中的权重只取最小值,使得权重值的分布更加规则,减小样本过拟合问题,起到正则化的作用。

当Dropout应用到某个层中,它会再训练过程中对所应用的层随机丢弃(你所设置的)输出数量单位。当Dropout取一个小数作为他的输入值(如:0.1、0.2、0.3......),代表了从应用的层中随机放弃10%、20%、30%的输出单位。

 三、编译

model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
  • optimizer:优化器,用于控制梯度裁剪。
  • loss:损失函数(或称目标函数、优化评分函数)
  • metrics:评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 metrics 的参数来输入。评价函数和损失函数相似,只不过评价函数的结果不会用于训练过程中。

四、训练模型

history = model.fit(train_images, train_labels, epochs=10,validation_data=(test_images, test_labels))

五、预测

通过模型进行预测得到的是每一个类别的概率,数字越大该图片为该类别的可能性越大。

plt.imshow(test_images[1])#预测测试集中的第一张图片
plt.show()

pre = model.predict(test_images)#对所有测试图片进行预测
print(class_names[np.argmx(pre[1])])#输出第一张图片的预测结果

六、模型评估

#评估模型
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)

 

这篇关于彩色图片分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294917

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构

文本分类场景下微调BERT

How to Fine-Tune BERT for Text Classification 论文《How to Fine-Tune BERT for Text Classification?》是2019年发表的一篇论文。这篇文章做了一些实验来分析了如何在文本分类场景下微调BERT,是后面网上讨论如何微调BERT时经常提到的论文。 结论与思路 先来看一下论文的实验结论: BERT模型上面的