365天深度学习训练营-第T4周:猴痘病识别

news2025/1/11 6:38:38
  •  🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

 我的环境:

  • 语言环境:Python3.10.7
  • 编译器:VScode
  • 深度学习环境:TensorFlow2

 一、前期工作: 

1、导入数据集

from tensorflow import keras
from tensorflow.keras import layers, models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tf

data_dir = "D:\T4猴痘病"
data_dir = pathlib.Path(data_dir)

#查看图片数量
image_count = len(list(data_dir.glob("*/*.jpg")))
print(image_count)

Monkeypox = list(data_dir.glob("Monkeypox/*.jpg"))
image_path = str(Monkeypox[0])

# Open the image using PIL
image = PIL.Image.open(image_path)

# Display the image using matplotlib
plt.imshow(image)
plt.axis("off") 
plt.show()

2. 数据预处理

2.1设置图片格式

batch_size = 32
img_height = 224
img_width = 224

2.2划分训练集

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split = 0.2,
    subset = "training",
    seed = 123,
    image_size = (img_height, img_width),
    batch_size = batch_size
)

tf.keras.preprocessing.image_dataset_from_directory函数从目录中创建图像数据集。该函数可以方便地从磁盘上的文件夹中加载图像数据并进行预处理。

参数解释如下:

  • data_dir: 字符串,指定包含图像数据的目录路径。
  • validation_split: 浮点数,指定验证集的比例。例如,设置为0.2表示将20%的数据用作验证集,剩余80%用作训练集。
  • subset: 字符串,指定要创建的子集类型。在这里,设置为"training"表示创建训练集。
  • seed: 整数,用于随机数生成的种子,以确保结果可重复。
  • image_size: 元组,指定图像的目标尺寸。例如,(img_height, img_width)表示将图像调整为给定的高度和宽度。
  • batch_size: 整数,指定每个批次中的图像数量。

 运行结果:

 2.3划分验证集

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split = 0.2,
    subset = "validation",
    seed = 123,
    image_size = (img_height, img_width),
    batch_size = batch_size
)

运行结果:

2.4查看标签 

class_names = train_ds.class_names
print(class_names)

 运行结果:

2.5数据可视化 

plt.figure(figsize = (20, 10))#创建一个图形对象,并指定其大小为20x10英寸

for images, labels in train_ds.take(1):#遍历train_ds数据集中的第一个批次,每个批次包含一批图和对应的标签。这里使用take(1)函数从数据集中获取一个批次。
  for i in range(20):
#在图形对象中创建一个子图,这里的子图是一个5x10的网格,并将当前子图设置为第i+1个位置。
    plt.subplot(5, 10, i + 1)
#使用Matplotlib的imshow函数显示当前图像。images[i]是当前图像的张量表示,使用.numpy()将其转换为NumPy数组,并使用.astype("uint8")将数据类型转换为uint8以便显示。
    plt.imshow(images[i].numpy().astype("uint8"))
#为当前图像设置标题,标题内容是通过索引labels[i]从class_names列表中获取的类别名称。
    plt.title(class_names[labels[i]])
#坐标轴显示
    plt.axis("off")
plt.show()

代码使用Matplotlib库绘制训练数据集train_ds中的前20张图像,并显示其对应的标签(类名)。代码中定义的class_names是一个包含数据集类别名称的列表。

注意,这里使用了train_ds.take(1)来从train_ds数据集中取出第一个批次的图像和标签。train_ds是一个tf.data.Dataset对象,它包含了经过预处理和批量处理的训练图像数据。

 2.6检查数据

for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break

 2.7配置数据集

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size = AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size = AUTOTUNE)

shuffle():打乱数据
具体来说,shuffle(1000) 的作用是将数据集中的样本顺序进行随机打乱,以增加样本之间的独立性,并减少模型训练时对数据的记忆性。

参数 1000 表示要在数据集中创建一个缓冲区,其中包含 1000 个样本。在进行数据读取时,会从缓冲区中随机选择样本,并将其作为当前的批次。每个样本在缓冲区中的位置是随机的,并且会随着每个批次的读取而不断更新。

prefetch():预取数据,加速执行
prefetch()功能详细介绍: CPU正在准备数据时,加速器处于空闲状态。相反,当加速器正在训练模型时,CPU处于空闲状态。因此,训练所用的时间是CPU预处理时间和加速器训练时间的总和。
prefetch()将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第N个训练步时,CPU正在准备第N+1步的数据。这样做不仅可以最大限度地缩短训练的单步用时(而不是总用时),而且可以缩短提取和转换数据所需的时间。如果不使用prefetch() ,CPU和GPU/TPU在大部分时间都处于空闲状态。

cache():将数据缓存到内存当中

三、搭建CNN网络

#设置Sequential模型,创建神经网络
model = models.Sequential([
    layers.experimental.preprocessing.Rescaling(1./255,input_shape=(img_height,img_width,3)),
    #设置二维卷积层1,设置32个3*3卷积核,activation参数将激活函数设置为ReLU函数
    #input_shape设置图形的输入形状
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)),
    #池化层1,2*2采样
    layers.AveragePooling2D(2*2),
    #设置二维卷积层2,设置64个3*3卷积核,激活函数设置为ReLU函数
    layers.Conv2D(64, (3, 3), activation='relu'),
    #池化层2,2*2采样
    layers.AveragePooling2D((2, 2)),
    #设置停止工作概率,防止过拟合
    layers.Dropout(0.3),
 
    #Flatten层,用于连接卷积层与全连接层
    layers.Flatten(),
    #全连接层,特征进一步提取,64为输出空间的维数(神经元),激活函数为ReLU函数
    layers.Dense(128,activation='relu'),
    #输出层,4为输出空间的维数
    layers.Dense(4)
])
#打印网络结构
model.summary()

运行结果:

 四、编译

在准备对模型进行训练之前,还需要再对其进行一些设置 。以下内容是在模型的编译步骤中添加的:
●损失函数(loss) :用于衡量模型在训练期间的准确率。
●优化器(optimizer) :决定模型如何根据其看到的数据和自身的损失函数进行更新。
●指标(metrics) :用于监控训练和测试步骤。以下示例使用了准确率,即被正确分类的图像的比率。

#设置优化器
opt = keras.optimizers.Adam(learning_rate=0.001)
model.compile(
    #设置优化器为Adam优化器
    optimizer = opt,
    #设置损失函数为交叉熵损失函数
    #from_logits为True时,会将y_pred转化为概率
    loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    #设置性能指标列表,将在模型训练时对列表中的指标进行监控
    metrics = ['accuracy']
)

五、训练模型 

from tensorflow.keras.callbacks import ModelCheckpoint

epochs = 50

checkpointer = ModelCheckpoint(
    'best_model.h5',
    monitor = 'val_accuracy',
    verbose = 1,
    save_best_only = True,
    save_weights_only = True
)

history = model.fit(
    train_ds,
    validation_data = val_ds,
    epochs = epochs,
    callbacks = [checkpointer]
)

运行结果:

 六、模型评估

6.1Loss和Acc图

loss = history.history['loss']
val_loss = history.history['val_loss']

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

epochs_range = range(len(loss))

plt.figure(figsize = (12, 4))

plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label = "Training Acc")
plt.plot(epochs_range, val_acc, label = "Validation Acc")
plt.legend(loc = 'lower right')
plt.title("Training And Validation Acc")

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label = "Training Loss")
plt.plot(epochs_range, val_loss, label = "Validation Loss")
plt.legend(loc = 'upper right')
plt.title("Training And Validation Loss")

plt.show()

上述代码是用于绘制训练和验证准确率以及训练和验证损失随着训练周期的变化趋势的图表。

 `acc = history.history['accuracy']`:从训练历史记录中获取训练准确率的数值列表。
 `val_acc = history.history['val_accuracy']`:从训练历史记录中获取验证准确率的数值列表。
 `loss = history.history['loss']`:从训练历史记录中获取训练损失的数值列表。
 `val_loss = history.history['val_loss']`:从训练历史记录中获取验证损失的数值列表。
 `epochs_range = range(epochs)`:创建一个表示训练周期范围的迭代器,其中 `epochs` 是训练周期的总数。

接下来,使用 `matplotlib.pyplot` 绘制图表:
 `plt.figure(figsize=(12, 4))`:创建一个图表对象,设置图表的大小为 (12, 4)。
 `plt.subplot(1, 2, 1)`:创建一个子图,表示第一个子图,用于绘制准确率。
 `plt.plot(epochs_range, acc, label='Training Accuracy')`:绘制训练准确率随着训练周期的变化曲线。
 `plt.plot(epochs_range, val_acc, label='Validation Accuracy')`:绘制验证准确率随着训练周期的变化曲线。
 `plt.legend(loc='lower right')`:显示图例,并设置其位置在右下角。
 `plt.title('Training and Validation Accuracy')`:设置子图的标题为 "Training and Validation Accuracy"。
 `plt.subplot(1, 2, 2)`:创建一个子图,表示第二个子图,用于绘制损失。
 `plt.plot(epochs_range, loss, label='Training Loss')`:绘制训练损失随着训练周期的变化曲线。
 `plt.plot(epochs_range, val_loss, label='Validation Loss')`:绘制验证损失随着训练周期的变化曲线。
 `plt.legend(loc='upper right')`:显示图例,并设置其位置在右上角。
 `plt.title('Training and Validation Loss')`:设置子图的标题为 "Training and Validation Loss"。
 `plt.show()`:显示图表。

运行结果:

6.2指定结果进行预测

model.load_weights('best_model.h5')

from PIL import Image
import numpy as np

img = Image.open("D:/T4MonkeyPox/Monkeypox/M01_02_06.jpg")
 
image = tf.image.resize(img, [img_height, img_width]) 

img_array = tf.expand_dims(image, 0)


predictions = model.predict(img_array)
#这个函数用于对输入图像进行分类预测。它使用已经训练好的模型来对输入数据进行推断,并输出每个类别的概率分布。
print("预测结果为:", class_names[np.argmax(predictions)])

 model.load_weights('best_model.h5')
代码用于加载之前训练中保存的最佳模型权重。'best_model.h5' 指的是之前保存的模型权重文件路径和名称。这样可以避免从头开始训练模型,直接使用已经训练好的最佳模型进行预测的工作。

img = Image.open("D:/T4MonkeyPox/Monkeypox/M01_02_06.jpg")

代码用于使用 PIL 库中的 Image.open() 方法打开一张待预测的图片。

image = tf.image.resize(img, [img_height, img_width]) 
这个函数调整输入图像的大小以符合模型的要求。
在这个例子中,使用 TensorFlow 的 tf.image.resize() 函数将图像缩放为指定大小,其中 img_height 和 img_width 是指定的图像高度和宽度。

img_array = tf.expand_dims(image, 0)
这个函数将输入图像转换为形状为 (1, height, width, channels) 的四维数组,
其中 height 和 width 是图像的高度和宽度,channels 是图像的通道数(例如 RGB 图像有 3 个通道)。这里使用 TensorFlow 的 tf.expand_dims() 函数来扩展图像数组的维度,以匹配模型的输入格式。
image 是一个二维图片张量,它的形状是 (height, width, channels)。其中 height 和 width 分别为图片的高度和宽度,channels 为图片的颜色通道数。0 是一个整数值,它指定在哪个维度上扩展此张量,这里表示在最前面(第一个)的维度上扩展。因此,函数的作用是将输入张量 image 在最前面添加一个额外的维度(batch_size),生成一个四维张量。

tf.expand_dims(input, axis)
其中 input 表示要扩展的输入张量,axis 表示要在哪个维度上进行扩展。在这个例子中,input 是变量 image,axis 是 0。

print("预测结果为:", class_names[np.argmax(predictions)])
将模型输出的概率分布转换为最终预测结果。
具体来说,使用 np.argmax() 函数找到概率最大的类别索引,然后使用该索引在 class_names 列表中查找相应的类别名称,并输出预测结果。

 运行结果:

 七、完整代码

from tensorflow import keras
from tensorflow.keras import layers, models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tf

data_dir = "D:\T4MonkeyPox"
data_dir = pathlib.Path(data_dir)

image_count = len(list(data_dir.glob("*/*.jpg")))

Monkeypox = list(data_dir.glob("Monkeypox/*.jpg"))

batch_size = 32
img_height = 224
img_width = 224

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split = 0.2,
    subset = "training",
    seed = 123,
    image_size = (img_height, img_width),
    batch_size = batch_size
)

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split = 0.2,
    subset = "validation",
    seed = 123,
    image_size = (img_height, img_width),
    batch_size = batch_size
)

class_names = train_ds.class_names

plt.figure(figsize = (20, 10))


AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size = AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size = AUTOTUNE)

num_classes = 2

model = models.Sequential([
    layers.experimental.preprocessing.Rescaling(1. / 255, input_shape = (img_height, img_width, 3)),
    
    
    layers.Conv2D(16, (3, 3), activation = 'relu', input_shape = (img_height, img_width, 3)),
    layers.AveragePooling2D((2, 2)),
    layers.Conv2D(32, (3, 3), activation = 'relu'),
    layers.AveragePooling2D((2, 2)),
    layers.Dropout(0.3),
    layers.Conv2D(64, (3, 3), activation = 'relu'),
    layers.Dropout(0.3),

    layers.Flatten(),
    layers.Dense(128, activation = 'relu'),
    layers.Dense(num_classes)
])

#设置优化器
opt = keras.optimizers.Adam(learning_rate=0.001)
model.compile(
    #设置优化器为Adam优化器
    optimizer = opt,
    #设置损失函数为交叉熵损失函数
    #from_logits为True时,会将y_pred转化为概率
    loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    #设置性能指标列表,将在模型训练时对列表中的指标进行监控
    metrics = ['accuracy']
)

from tensorflow.keras.callbacks import ModelCheckpoint

epochs = 50

checkpointer = ModelCheckpoint(
    'best_model.h5',
    monitor = 'val_accuracy',
    verbose = 1,
    save_best_only = True,
    save_weights_only = True
)

history = model.fit(
    train_ds,
    validation_data = val_ds,
    epochs = epochs,
    callbacks = [checkpointer]
)

loss = history.history['loss']
val_loss = history.history['val_loss']

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

epochs_range = range(len(loss))

plt.figure(figsize = (12, 4))

plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label = "Training Acc")
plt.plot(epochs_range, val_acc, label = "Validation Acc")
plt.legend(loc = 'lower right')
plt.title("Training And Validation Acc")

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label = "Training Loss")
plt.plot(epochs_range, val_loss, label = "Validation Loss")
plt.legend(loc = 'upper right')
plt.title("Training And Validation Loss")

plt.show()

model.load_weights('best_model.h5')

from PIL import Image
import numpy as np

img = Image.open("D:/T4MonkeyPox/Monkeypox/M01_02_06.jpg") 

image = tf.image.resize(img, [img_height, img_width]) 

img_array = tf.expand_dims(image, 0)

predictions = model.predict(img_array)

print("预测结果为:", class_names[np.argmax(predictions)])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白开酒吧前要知道的几个知识(一)

第一、团队建设如果决定开酒吧,除非你的资金充裕,否则都该寻找合伙人。共同的目标会让你和合伙人之间合作的更愉快,所以合伙人应该选择善于沟通交流的。选定靠谱的合伙人之后,应该建立一个大致的团队体系,在团队内做好…

CAD怎么转成清晰的图片?分享几种好用的转换方法

CAD文件通常需要特定软件才能打开和编辑,而将其转换为图片格式可以使其更加普遍地被浏览和共享。此外,由于图片通常具有较小的文件大小,因此转换为图片格式可以更快地上传和下载,可以方便地用于演示和分享。那么我们怎么把CAD文件…

Python进行单元测试是怎么做的?

前言 在我的日常工作中,我是一名专业程序员。我使用c、c#和Javascript。我是一个开发团队的一员,他们使用单元测试来验证我们的代码是否按照它应该的方式工作。 在本文中,我将通过讨论以下主题来研究如何使用Python创建单元测试。 单元测试…

一文详解Mac搭建Vulkan开发环境

本文为Vukan系列的第二篇文章,上一篇文章对Vulkan进行了简单介绍,并对其与OpenGL的优劣势进行了比较,为应用开发人员在选择图形API方面提供了建议。下边开始本文的主要内容,详细介绍在Mac操作系统中,如何搭建Vulkan开发…

力扣 98. 验证二叉搜索树

题目来源:https://leetcode.cn/problems/validate-binary-search-tree/description/ C题解1:中序遍历,递归法。获取数组,如果是递增则返回true,否则返回false。 class Solution { public:void zhongxu(TreeNode* node…

用vue3+elementplus做的一个滚动菜单栏的组件

目录 起因概览设计及解决思路1.滚动条竖起来2.绑定菜单3.吸附优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider,但是这个感觉很不实用,在底部,而且横向滚动,最常见的应该是那种固定在左上角的带着菜单的滚动条&a…

MySQL总结(索引,Explain,MVCC和隔离级别,锁)

文章目录 一、索引1.索引构成2.如何查找3.最左匹配原则4.覆盖索引5.减少冗余索引和重复索引1.冗余索引2.重复索引 6.索引适用情况和注意事项1.适用情况2.注意事项 二、Explain执行计划1.Explain语句 三、隔离级别与MVCC1.事前准备2.四个事务并发的问题1.脏写2.脏读3.不可重复读…

(有10个维度为(256,128,130)的tensor,计算10个tensor两两之间的相似性以及差异性,并将相似性和差异性可视化。

有10个维度为(256,128,130)的tensor,计算10个tensor两两之间的相似性以及差异性,并将相似性和差异性可视化。 问题描述解决办法 问题描述 有10个维度为(256,128,130)的tensor,计算10个tensor两…

Java基础复习第二天

目录 一、字符串 二、不可变的好处 三、String, StringBuffer and StringBuilder的区别 四、字符串池 五、新字符串(“abc”) 一、字符串 String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承…

前端-基础选择器

从今天开始学习下前端的知识-查漏补缺&#xff0c;仅为自己学习记录使用 基础选择器 标签选择器类选择器id 选择器通配符选择器 标签选择器 标签名 {属性名&#xff1a;属性值; }<style>p {color: red;} </style><p>你好&#xff0c;世界</p>类选择…

Unity URP 获取Camera Stack

URP 获取Camera Stack 1.using UnityEngine.Rendering.Universal; 2.Camera.main.GetUniversalAdditionalCameraData().cameraStack

【日志加载 log4j】

日志 笔记记录 1. 日志介绍2. 日志体系结构3.Log4j开发流程4.Log4j组成4.1 Loggers 记录器4.2 Appenders 输出源4.3 Layouts 布局5. 配置文件 log4j.properties 1. 日志介绍 2. 日志体系结构 3.Log4j开发流程 1.引入依赖<dependency><groupId>log4j</groupId>…

爬虫正常用哪种代理比较好?

在进行网络爬虫时&#xff0c;使用代理可以带来许多好处&#xff0c;包括提高请求的可靠性、防止IP封锁、实现匿名浏览等。以下是一些常见的代理类型&#xff0c;你可以根据需要选择最适合的&#xff1a; 免费代理&#xff1a;免费代理可能数量众多&#xff0c;但质量和稳定性参…

Python获取某品牌加盟数据采集实现可视化数据分析

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境 : python 3.8 运行代码 pycharm 2022.3 辅助敲代码 jupyter 数据分析使用软件 模块使用 &#xff1a; requests 数据请求模块 需要安装 parsel 数据解析模块 csv pandas pyecharts 第三方模块安装&#xf…

基于Java开发的企业人力资源管理系统(ehr系统)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理…

BOLD信号的生理建模及其对有效连接的影响

导读 本文提供了BOLD信号生理过程的总体概述(即生成生物物理模型)&#xff0c;包括它们在生理信息动态因果模型(P-DCM)框架下的时间过程特征。BOLD信号主要由顺磁性脱氧血红蛋白的变化决定&#xff0c;而顺磁性脱氧血红蛋白的变化是氧代谢、脑血流量和脑血容量变化共同作用的结…

测试工程师首chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

【IP地址与子网掩码】网络杂谈(19)之IP地址分类与子网掩码的概念

涉及知识点 什么是子网掩码&#xff0c;IP地址的分类&#xff0c;子网掩码的概念&#xff0c;深入了解子网掩码与IP地址,A类&#xff0c;B类&#xff0c;C类&#xff0c;D类&#xff0c;E类ip地址范围。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

Linux调试笔记

gdb调试----------------------------------------------------------------------------------------- CMakeFile.txt加入set(CMAKE_BUILD_TYPE Debug) gdb ./rknn_MNIST 打断点 b 110/main(行号/函数名) 单步调试 s&#xff08;step&#xff09; 单步跳过 n&#xff08;n…

计算机组成原理(2)_计算机基本组成

计算机组成系列文章目录 第一章 计算机的基本组成 1. 大致简介 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 计算机组成系列文章目录前言参考资料一、组成架构&#xff08;冯/图&#xff09;1. 组成架构2. 冯诺依曼3. 图灵…