news 2026/9/12 18:31:47

T4周:猴痘病识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
T4周:猴痘病识别
  • 🍨本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖原作者:K同学啊

学习目的:采用CNN实现猴痘病识别

一、 前期准备

关于环境

  • 语言环境:Python3.6
  • 编译器:vsCode
  • 深度学习环境:TensorFlow 2.6.2

1.数据导入

import tensorflow as tf import os,PIL,pathlib import matplotlib.pyplot as plt import numpy as np from tensorflow import keras from tensorflow.keras import layers,models
data_dir = "C:/Users/hsq/Desktop/train/D4/" data_dir = pathlib.Path(data_dir)

2.查看数据

image_count = len(list(data_dir.glob('*/*.jpg'))) print("图片总数为:",image_count)

运行结果:

Monkeypox = list(data_dir.glob('Monkeypox/*.jpg')) PIL.Image.open(str(Monkeypox[0]))

运行结果:

二、数据预处理

1. 加载数据

使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset

batch_size = 32 img_height = 224 img_width = 224

img_height/width:将图像统一缩放到 224×224 像素。

""" 关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789 """ 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)

运行结果:

""" 关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789 """ 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输出数据集的标签。标签将按字母顺序对应于目录名称。

class_names = train_ds.class_names print(class_names)

运行结果:

2. 可视化数据

plt.figure(figsize=(20, 10)) for images, labels in train_ds.take(1): for i in range(20): ax = plt.subplot(5, 10, i + 1) plt.imshow(images[i].numpy().astype("uint8")) plt.title(class_names[labels[i]]) plt.axis("off")

运行结果:

3. 再次检查数据

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

运行结果:

  • 这是一批形状224x224x3的32张图片。
  • Label_batch是形状(32,),这些标签对应32张图片

4. 配置数据集

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

三、构建CNN网络

num_classes = 2 """ 关于卷积核的计算不懂的可以参考文章:https://blog.csdn.net/qq_38251616/article/details/114278995 layers.Dropout(0.4) 作用是防止过拟合,提高模型的泛化能力。 在上一篇文章花朵识别中,训练准确率与验证准确率相差巨大就是由于模型过拟合导致的 关于Dropout层的更多介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/115826689 """ 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)), # 卷积层1,卷积核3*3 layers.AveragePooling2D((2, 2)), # 池化层1,2*2采样 layers.Conv2D(32, (3, 3), activation='relu'), # 卷积层2,卷积核3*3 layers.AveragePooling2D((2, 2)), # 池化层2,2*2采样 layers.Dropout(0.3), layers.Conv2D(64, (3, 3), activation='relu'), # 卷积层3,卷积核3*3 layers.Dropout(0.3), layers.Flatten(), # Flatten层,连接卷积层与全连接层 layers.Dense(128, activation='relu'), # 全连接层,特征进一步提取 layers.Dense(num_classes) # 输出层,输出预期结果 ]) model.summary() # 打印网络结构
  1. Rescaling

    将像素值从 [0, 255] 缩放到 [0, 1],有助于加快收敛。
  2. Dropout(0.3)

    随机丢弃 30% 的神经元,防止过拟合

运行结果:

四、编译

# 设置优化器 opt = tf.keras.optimizers.Adam(learning_rate=1e-4) model.compile(optimizer=opt, loss=tf.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])

代码运行结果:

最终验证准确率约 88.55%(第 48 个 epoch),训练准确率接近 99%,存在一定过拟合

六、模型评估

1. Loss与Accuracy图

from datetime import datetime current_time = datetime.now() # 获取当前时间 acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(epochs) plt.figure(figsize=(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') plt.xlabel(current_time) # 打卡请带上时间戳,否则代码截图无效 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()

运行结果:

2. 指定图片进行预测

# 加载效果最好的模型权重 model.load_weights('best_model.h5')
from PIL import Image import numpy as np # img = Image.open("./D4/Monkeypox/M06_01_04.jpg") #这里选择你需要预测的图片 img = Image.open("C:/Users/hsq/Desktop/train/D4/Others/NM15_02_11.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)])

七、总结

本周继续尽心了CNN模型的训练,但是本周加入了一个新模块,就是使用了ModelCheckpoint进行模型回调,在验证准确率提升时保存最佳模型,并最后加载最佳权重进行预测。相对上周没有保存最佳模型,直接使用最后 epoch 的权重进行预测。这其实就是类似于在PyTorch训练时加入早停的。但是有个问题就是,早停在经过数轮训练后发现模型效能没有提升就会停止训练,而这个模块是在完成全部轮数训练之后选择最优模型,相对而言更加合理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 18:29:49

ADR: [决策标题]

ADR: [决策标题] 【免费下载链接】awesome-copilot Community-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot Context: [为什么需要…

作者头像 李华
网站建设 2026/9/12 18:28:59

Java时间处理与正则表达式实战技巧

1. Java时间与日期处理实战 在Java开发中,时间日期处理是每个开发者必须掌握的硬核技能。从早期的Date、Calendar到Java 8全新的时间API,这套体系经历了革命性的演进。我见过太多项目因为时间处理不当导致线上事故,今天就把这些年的踩坑经验系…

作者头像 李华
网站建设 2026/9/12 18:28:47

AI Coding实战指南:从需求拆解到代码审查的高效协作方法

去年年底我在做一个内部效率工具的时候,第一次认真把AI引进了日常编码流程。说实话,一开始我是抵触的,总觉得AI写代码就是玩具,生成一堆看似正确但根本跑不通的东西,浪费时间还不如自己敲。但连续用了一个月之后&#…

作者头像 李华
网站建设 2026/9/12 18:27:26

COMSOL仿真表面等离子体激元(SPP)的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华