第T4周:TensorFlow实现猴痘识别(Tensorboard的使用)

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

目标
1、学习tensorboard的使用
具体实现

(一)环境

语言环境:Python 3.10
编 译 器: PyCharm
框 架: TensorFlow

(二)具体步骤:

1. 安装Tensorboard
# pip install tensorboard
2.使用GPU

-----------------------------------------------utils.py-----------------------------------------------------

import tensorflow as tf  
import PIL  
import matplotlib.pyplot as plt  
  
  
def GPU_ON():  
    # 查询tensorflow版本  
    print("Tensorflow Version:", tf.__version__)  
    # print(tf.config.experimental.list_physical_devices('GPU'))  
  
    # 设置使用GPU  
    gpus = tf.config.list_physical_devices("GPU")  
    print(gpus)  
  
    if gpus:  
        gpu0 = gpus[0]  # 如果有多个GPU,仅使用第0个GPU  
        tf.config.experimental.set_memory_growth(gpu0, True)  # 设置GPU显存按需使用  
        tf.config.set_visible_devices([gpu0], "GPU")
3.导入猴痘图片数据,Tensorboard查看图片
# # 创建TensorBoard摘要器和文件写入器  
summary_writer = tf.summary.create_file_writer('./logs')

# 查看一下数据的基本情况  
data_dir = "./datasets/mp/"  
data_dir = pathlib.Path(data_dir)  # 转换成Path对象,便于后续访问  
image_count = len(list(data_dir.glob('*/*.jpg')))   # 遍历data_dir下面所有的.jpg图片(包含所有子目录)。  
print("图片总数量为:", image_count)  
MonkeyPox = list(data_dir.glob('MonkeyPox/*.jpg'))  # 遍历data_dir子目录MonkeyPox下所有的.jpg图片  
print("猴痘图片数量为:", len(MonkeyPox))  

# tf.summary.image() 需要一个包含 (batch_size, height, width, channels) 的 4 秩张量。因此,需要重塑张量。  
# 记录一个图像,因此 batch_size 为 1。图像为灰度图,因此将 channels 设置为 1。  
img = np.reshape(PIL.Image.open(MonkeyPox[1]), (-1, 224, 224, 3))  # 查看一张猴痘的图片,看看是什么样子  
with  summary_writer.as_default():  
    tf.summary.image("猴痘", img , step=0) # 显示一张图像

命令行,输入:

# >tensorboard --logdir ./logs

image.png
打开链接:
image.png
查看多张图片:

# 查看一下数据的基本情况  
data_dir = "./datasets/mp/Monkeypox/"  
  
list_ds = tf.data.Dataset.list_files(data_dir + "*.jpg")  
print(list_ds)  
images = []  
for i in list_ds:  
    image_temp = tf.io.read_file(i)  
    image_temp = tf.image.decode_jpeg(image_temp)  
    images.append(image_temp)  
  
print(images[0])  
  
with  summary_writer.as_default():  
    tf.summary.image("猴痘", images[0:5] , step=0) # 显示一张图像  
  
  
def plot_to_image(figure):  
  """Converts the matplotlib plot specified by 'figure' to a PNG image and  
  returns it. The supplied figure is closed and inaccessible after this call."""  # Save the plot to a PNG in memory.  
  buf = io.BytesIO()  
  plt.savefig(buf, format='png')  
  # Closing the figure prevents it from being displayed directly inside  
  # the notebook.  plt.close(figure)  
  buf.seek(0)  
  # Convert PNG buffer to TF image  
  image = tf.image.decode_png(buf.getvalue(), channels=4)  
  # Add the batch dimension  
  image = tf.expand_dims(image, 0)  
  return image  
  
def image_grid():  
  """Return a 5x5 grid of the MNIST images as a matplotlib figure."""  
  # Create a figure to contain the plot.  
  figure = plt.figure(figsize=(10,10))  
  for i in range(25):  
    # Start next subplot.  
    plt.subplot(5, 5, i + 1, title="猴痘")  # 中文显示乱码,哈哈
    plt.xticks([])  
    plt.yticks([])  
    plt.grid(False)  
    plt.imshow(images[i], cmap=plt.cm.binary)  
  
  return figure  
  
# Prepare the plot  
figure = image_grid()  
# Convert to image and log  
with summary_writer.as_default():  
  tf.summary.image("Training data", plot_to_image(figure), step=0)

image.png
标签中文显示还是不行,哈哈。

3. 数据预处理,加载数据
# 数据预处理,并将数据加载到dataset中  
batch_size = 32  
img_width = 224  
img_height = 224  
  
train_ds = tf.keras.preprocessing.image_dataset_from_directory(  
    directory=data_dir,     # 数据图片所在的目录,如果下面的labels为inferred则包含子目录  
    labels="inferred",      # 默认为inferred表示从目录结果中获取labels,如果为None就是没有labels,或者是一个labels的元组/列表。  
    validation_split=0.2,   # 0-1之间的数,表示为验证保留的数据部分,这里相当于保留20%作为验证数据  
    subset="training",      # 返回数据的子集,从”training"/"validation"/"both"三个中选择,这里只返回训练数据子集  
    shuffle=True,           # 打乱数据集,默认是True,就是打乱。如果为False,则按字母数字顺序进行排序。  
    seed=123,               # 打乱数据的随机种子,不改变这个数字,每次的打乱顺序应该是一样的  
    image_size=(img_height, img_width),     # 图片重新设置大小,如果不设定,默认是(256, 256)  
    batch_size=batch_size   # 数据批次大小,默认是32.假如设置为None则不进行批次处理  
)  
Found 2142 files belonging to 2 classes.
Using 1714 files for training.
val_ds = tf.keras.preprocessing.image_dataset_from_directory(  
    directory=data_dir,  
    validation_split=0.2,  
    subset="validation",  
    seed=123,  
    image_size=(img_height, img_width),  
    batch_size=batch_size  
)
Found 2142 files belonging to 2 classes.
Using 428 files for validation.
# 查看数据分类  
class_names = train_ds.class_names  
print("数据分类:", class_names)
数据分类: ['Monkeypox', 'Others']
6.配置数据集,加速
# 配置数据库,加速  
AUTOTUNE = tf.data.AUTOTUNE  
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)  
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
7.构建CNN网络模型

image.png

num_classes = len(class_names)
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)               # 输出层,输出预期结果
])
8.编码模型
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=1e-4)

model.compile(optimizer=opt,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
9.训练模型, 加入Tensorboard查看
logdir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir)

# 训练模型  
from tensorflow.keras.callbacks import ModelCheckpoint  
epochs = 50  
checkpointer = ModelCheckpoint('./models/Monkeypox_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, tensorboard_callback] 
)

整个过程如下,第一轮训练都会根据monitor监视的值是否有改进,来判断是否要保存该轮的模型.前面9轮都有改进,都在保存,后面没有改进就没有保存:

Epoch 1/50
2024-10-07 13:20:42.878241: I tensorflow/stream_executor/cuda/cuda_dnn.cc:384] Loaded cuDNN version 8101
2024-10-07 13:20:44.358266: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314] INTERNAL: ptxas exited with non-zero error code -1, output: 
Relying on driver to perform ptx compilation. 
Modify $PATH to customize ptxas location.
This message will be only logged once.
2024-10-07 13:20:45.626487: I tensorflow/stream_executor/cuda/cuda_blas.cc:1614] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.
52/54 [===========================>..] - ETA: 0s - loss: 0.7343 - accuracy: 0.5200
Epoch 1: val_accuracy improved from -inf to 0.64720, saving model to ./models\Monkeypox_best_model.h5
54/54 [==============================] - 8s 36ms/step - loss: 0.7324 - accuracy: 0.5216 - val_loss: 0.6843 - val_accuracy: 0.6472
Epoch 2/50
52/54 [===========================>..] - ETA: 0s - loss: 0.6673 - accuracy: 0.5812
Epoch 2: val_accuracy did not improve from 0.64720
54/54 [==============================] - 1s 26ms/step - loss: 0.6667 - accuracy: 0.5846 - val_loss: 0.6560 - val_accuracy: 0.5911
Epoch 3/50
52/54 [===========================>..] - ETA: 0s - loss: 0.6356 - accuracy: 0.6466
Epoch 3: val_accuracy improved from 0.64720 to 0.67290, saving model to ./models\Monkeypox_best_model.h5
54/54 [==============================] - 2s 28ms/step - loss: 0.6373 - accuracy: 0.6435 - val_loss: 0.6179 - val_accuracy: 0.6729
Epoch 4/50
54/54 [==============================] - ETA: 0s - loss: 0.6140 - accuracy: 0.6744
Epoch 4: val_accuracy improved from 0.67290 to 0.69159, saving model to ./models\Monkeypox_best_model.h5
54/54 [==============================] - 2s 28ms/step - loss: 0.6140 - accuracy: 0.6744 - val_loss: 0.5860 - val_accuracy: 0.6916
Epoch 5/50
52/54 [===========================>..] - ETA: 0s - loss: 0.5892 - accuracy: 0.6921
Epoch 5: val_accuracy improved from 0.69159 to 0.71729, saving model to ./models\Monkeypox_best_model.h5
54/54 [==============================] - 2s 28ms/step - loss: 0.5913 - accuracy: 0.6902 - val_loss: 0.5633 - val_accuracy: 0.7173
......
Epoch 49/50
53/54 [============================>.] - ETA: 0s - loss: 0.0262 - accuracy: 0.9929
Epoch 49: val_accuracy did not improve from 0.88785
54/54 [==============================] - 1s 26ms/step - loss: 0.0260 - accuracy: 0.9930 - val_loss: 0.5357 - val_accuracy: 0.8785
Epoch 50/50
54/54 [==============================] - ETA: 0s - loss: 0.0209 - accuracy: 0.9947
Epoch 50: val_accuracy did not improve from 0.88785
54/54 [==============================] - 1s 26ms/step - loss: 0.0209 - accuracy: 0.9947 - val_loss: 0.5442 - val_accuracy: 0.8645

image.png
image.png

### (三)总结
  1. Tensorboard的模型结构图非常清晰,对于分析网络结构对我本人还是非常直观。容易学习。
  2. Tensorboard可以有效的组织历史数据,对于做比对效率提高很多。

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

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

相关文章

LeetCode:513.找二叉树左下角的

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:513.找二叉树左下角的 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

【Rust自学】7.6. 将模块拆分为不同文件

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.6.1. 将模块的内容移动到其他文件 如果在模块定义时模块名后边跟的是;而不是代码块&#…

随机种子定不死找bug

记录一次debug的心路历程 在运行别人的开源项目时遇到了随机种子定不死的情况, 运行一开始会有1e-5次方左右的误差, 后面误差会越来越大。 一开始以为是随机种子没有定死, 使用的以下代码固定的随机种子: torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manu…

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器 1、按键控制 LED 按键:常见的输入设备,按下导通,松手断开 按键抖动:由子按键内部使用的是机械式弹簧片来进行通断的、所以在按下和松手的瞬间会伴随有一连串的抖动 按键控制LED接线图: 要有工程…

深入理解Redis:从理论到实践的Java之旅

Redis,这个开源的内存数据结构存储系统,自2009年诞生以来,凭借其丰富的数据结构、快速的读写性能以及高度的可扩展性,迅速成为了分布式系统和高并发应用中的明星组件。本文将带你深入理解Redis,并通过Java语言的实践示…

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录,需借助插件才行,常见的插件如果git history只能查看某页面的改动记录,无法查看某分支的整体提交记录,我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…

Flutter适配HarmonyOS实践

大家在知道纯血鸿蒙到来的时候一定很疑惑,使用跨平台语言的到底该怎么办,不管使用Flutter还是使用原生鸿蒙开发,都会考虑到一个成本问题,特别是一些无法支持鸿蒙开发团队,已经使用跨平台开发已经很成熟的公司或者团队。…

XIAO Esp32S3 播放网络Mp3

本文旨在使用XIAO Esp32S3 播放网络Mp3 所需硬件 max98357 接线 Xiao Esp32 S3Max983574LRC5BCLK 6DIN5VVinGNDGND代码: #include "Arduino.h" #include "WiFiMulti.h" #include "Audio.h"// Digital I/O used #def

智能边缘计算×软硬件一体化:开启全场景效能革命新征程(高校开发者作品)

边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…

ubuntu22 安装CUDA

在Ubuntu系统中,使用nvidia-smi命令可以看到当前GPU信息,在右上角可以看到CUDA Version,意思是最大支持的CUDA版本号。 安装下载 CUDA Toolkit 11.6 Downloads | NVIDIA Developer https://developer.nvidia.com/cuda-downloads?target_osL…

VectorCAST入门指导

文章目录 1. VectorCAST 概述2. 启动 VectorCAST(Windows用户)2. 故障排除3. VectorCAST 界面4. 创建一个 VectorCAST 项目5. 设置工作目录6. 创建一个新项目7. 添加一个单元测试环境8. 添加测试用例9. 执行所有测试1. VectorCAST 概述 VectorCAST是一套测试自动化工具: Vecto…

12.30 linux 文件操作,磁盘分区挂载

ubuntu 在linux 对文件的相关操作【压缩,打包,软链接,文件权限】【head,tail,管道符,通配符,find,grep,cut等】脑图-CSDN博客 1.文件操作 在家目录下创建目录文件&#…

Zabbix 监控平台 添加监控目标主机

Zabbix监控平台是一个企业级开源解决方案,用于分布式系统监视和网络监视。它由Zabbix Server和可选组件Zabbix Agent组成,通过C/S模式(客户端-服务器模型)采集数据,并通过B/S模式(浏览器-服务器模型&#x…

第10章 初等数论

2024年12月27日一稿(P341) 2024年12月28日二稿 2024年12月29日三稿 当命运这扇大门向你打开的时候,不要犹豫和害怕,一直往前跑就是了! 10.1 素数 这里写错了,不能整除应该表示为 10.2 最大公约数与最小公…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…

Ps:将数据组作为文件导出

Ps菜单:文件/导出/数据组作为文件 Export/Data Sets as Files “将数据组作为文件导出” Export Data Sets as Files命令是 Photoshop 数据驱动设计功能的一部分,用于结合可变数据和模板,生成多个文件。 1、自动化批量生成 适用于名片、证书、…

Java基本操作笔记

命令行快速进入指定文件夹 快速切换进入指定文件 文件夹快速切换 idea开发步骤 快捷键 修改模块 选中模块右键依次选择 选择第三个修改模块和文件夹的名称 输入修改后的名字回车 导入模块 找到要导入的模块,ctrc复制该文件夹 打开idea找到工程文件夹ctrv粘贴 点击o…

OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…