深度学习训练营之天气识别P3

news2025/1/23 12:56:21

深度学习训练营之天气识别

  • 原文链接
  • 环境介绍
  • 前置工作
    • 设置GPU
    • 导入数据
    • 数据查看
  • 数据预处理
    • 加载数据
    • 可视化数据
    • 检查数据
    • 配置数据集
      • `prefetch()`功能详细介绍:
  • 构建CNN网络
  • 编译
  • 模型训练
  • 结果可视化

原文链接

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍦 参考文章:365天深度学习训练营-第P3周:天气识别
  • 🍖 原作者:K同学啊|接辅导、项目定制

环境介绍

  • 语言环境:Python3.9.13
  • 编译器:jupyter notebook
  • 深度学习环境:TensorFlow2

前置工作

设置GPU

如果使用的是CPU就不用设置了

import tensorflow as tf

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")

导入数据

对数据进行导入,首先是导入需要的包

import matplotlib.pyplot as plt
import os,PIL

# 设置随机种子尽可能使结果可以重现
import numpy as np
np.random.seed(1)

# 设置随机种子尽可能使结果可以重现
import tensorflow as tf
tf.random.set_seed(1)

from tensorflow import keras
from tensorflow.keras import layers,models

import pathlib

调整数据集所在的位置
在这里插入图片描述

data_dir = "D:/BaiduNetdiskDownload/fiveday/fiveday-3/weather_photos/"
data_dir = pathlib.Path(data_dir)

数据查看

数据集一共分为cloudyrainshinesunrise四类,分别存放于weather_photos文件夹中以各自名字命名的子文件夹中。

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

图片总数为: 1125

roses = list(data_dir.glob('sunrise/*.jpg'))
PIL.Image.open(str(roses[3]))

在这里插入图片描述

数据预处理

加载数据

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

batch_size = 32
img_height = 180
img_width = 180

"""
关于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)

在这里插入图片描述
通过class_names输出数据集的标签,标签按照字母顺序对应于目录名称

class_names = train_ds.class_names
print(class_names)

在这里插入图片描述

可视化数据

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")

在这里插入图片描述

检查数据

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

在这里插入图片描述

  • Image_batch是形状的张量(32,180,180,3)。这是一批形状180x180x3的32张图片(最后一维指的是彩色通道RGB)。
  • Label_batch是形状(32,)的张量,这些标签对应32张图片

配置数据集

  • shuffle():打乱数据,关于此函数的详细介绍可以参考:https://zhuanlan.zhihu.com/p/42417456
  • prefetch():预取数据,加速运行

prefetch()功能详细介绍:

CPU 正在准备数据时,加速器处于空闲状态。相反,当加速器正在训练模型时,CPU 处于空闲状态。因此,训练所用的时间是 CPU 预处理时间和加速器训练时间的总和。prefetch()将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第 N 个训练步时,CPU 正在准备第 N+1 步的数据。这样做不仅可以最大限度地缩短训练的单步用时(而不是总用时),而且可以缩短提取和转换数据所需的时间。如果不使用prefetch(),CPU 和 GPU/TPU 在大部分时间都处于空闲状态
使用该函数的作用就在于尽可能的提高CPU等的使用性能,提高模型训练时候的速度
在这里插入图片描述
使用该函数可以减少空闲时间
在这里插入图片描述

  • cache():将数据集缓存到内存当中,加速运行
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网络

卷积神经网络(CNN)的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了图像高度、宽度及颜色信息。不需要输入batch size。color_channels 为 (R,G,B) 分别对应 RGB 的三个颜色通道(color channel)。在此示例中,我们的 CNN 输入,fashion_mnist 数据集中的图片,形状是 (28, 28, 1)即灰度图像。我们需要在声明第一层时将形状赋值给参数input_shape

num_classes = 5

"""
关于卷积核的计算不懂的可以参考文章: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.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()  # 打印网络结构

在这里插入图片描述

编译

在准备对模型进行训练之前,还需要再对其进行一些设置。以下内容是在模型的编译步骤中添加的:

  • 损失函数(loss):用于衡量模型在训练期间的准确率。
  • 优化器(optimizer):决定模型如何根据其看到的数据和自身的损失函数进行更新。
  • 指标(metrics):用于监控训练和测试步骤。以下示例使用了准确率,即被正确分类的图像的比率。
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=0.001)

model.compile(optimizer=opt,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

模型训练

epochs = 10

history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

在这里插入图片描述

结果可视化

对模型进行评估

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.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()

在这里插入图片描述

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

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

相关文章

卫龙上市首日破发:高瓴、红杉、腾讯等账面亏损,刘卫平为董事长

12月15日,卫龙美味全球控股有限公司(下称“卫龙”,HK:09985)在港交所上市。本次上市,卫龙的发行价格为10.56港元/股,募资总额约为10.18亿港元,募资净额约为8.99亿港元。 上市首日,卫…

Web3中文|NFT如何助力项目进入Web3?

自NFT流行以来,一直有人将这些由区块链驱动的代币视作贯彻人类精神的最终疗法。 但是NFT真的都存储在区块链上了吗?如果是这样的话,怎么还会出现百万NFT被盗的事件呢? 如果你也想过这些问题,那么请相信我&#xff0c…

在现有项目里面添加 TSX 并编写组件过程记录

首先需要安装编译支持和 vite 支持插件 ## babel 基础插件 yarn add vue/babel-plugin-jsx -D## 项目用 vite 构建的就需要按照这个 yarn add vitejs/plugin-vue-jsx -D 使用插件 按照 babel-plugin-jsx 的指引在 babel 配置项中启用插件: {"plugins":…

Linux操作系统常见问题汇总

1.系统启动流程。 uboot -> kernel -> 根文件系统。 uboot第一阶段属于汇编阶段: 定义入口(start.S):uboot中因为有汇编阶段参与,因此不能直接找main.c。 设置异常向量:当硬件发生故障的时候CPU会…

K8s Dashboard 部署

1、下载 Dashboard 的 yaml 文件 点击链接下载 YAML 文件 2、源码包中 yaml 文件在哪里 3、修改 yaml 文件 vim recommended.yaml... kind: Service apiVersion: v1 metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard…

Java web 2022跟学尚硅谷(十) 后端基础 书城

Java web 2022跟学尚硅谷十 后端基础 书城验证码kaptcha和缓存cookie简单了解cookie步骤简单创建cookie的样例代码CookieServlet01hello.html页面结果Cookie保存结果第二次请求cookie的APIKaptcha验证码使用步骤显示效果验证码的校验相关类KaptchaServlet01书城1.2正则表达式正…

C语言经典题目—单链表求和

练习的题目<单链表求和>题目难度较小。 1、题目描述 小明输入了一个长度为 n 的数组&#xff0c;他想把这个数组转换成链表&#xff0c;链表上每个节点的值对应数组中一个元素的值&#xff0c;然后遍历链表并求和各节点的值。输入描述&#xff1a; 第一行输入一个正整数…

Linux下内存空间分配、物理地址与虚拟地址映射

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页&#xff0c;可以使用此函数&#xff0c;这是内核中内存分配的常用方式&#xff0c;也是大多数情况下应该使用的内存分配方式。 传递给函数的最常用的标志是GTP_A…

火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

近日&#xff0c;火山引擎A/B测试平台—— DataTester 对产品内A/B实验的“可视化编辑器”进行了新的升级&#xff0c;对交互、预览、Xpath的层次结构视图等能力均做了优化。 据介绍&#xff0c;火山引擎DataTester的可视化编辑器&#xff0c;可以让用户无需编写任何代码&#…

基于java+springboot+mybatis+vue+mysql的CSGO游戏比赛赛事管理系统

项目介绍 CSGO赛事管理系统利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上&#xff0c;能够得到极大地提高&#xff0…

基于JAVA+SpringMVC+Mybatis+Vue+MYSQL的大健康老年公寓管理系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。 管理员后台页面&#xff1a; 功能&#xff1a;主页、个人中心、护理人员管理、收费标准管理、接待登记管理、房间信息管理、床位信息管理…

ASEMI肖特基二极管MBR30200FCT封装,MBR30200FCT体积

编辑-Z ASEMI肖特基二极管MBR30200FCT参数&#xff1a; 型号&#xff1a;MBR30200FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;140V 最大直流阻断电压&#xff08;VDC&#xff09…

Android 相机预览 横屏竖屏 -- 显示

相机在设备上处于固定位置&#xff0c;无论设备是否 是手机、平板电脑或计算机。当设备方向更改时&#xff0c; 相机方向更改。常见的布局显示比率是 4:3。 对于前置摄像头&#xff0c;图像缓冲区逆时针旋转&#xff08;从 传感器的自然方向&#xff09;对于后置摄像头&#xf…

机械硬盘如何克隆至固态硬盘,如何把硬盘系统克隆到固态硬盘

由于电脑的磁盘空间是既定的&#xff0c;随着使用年限越来越长&#xff0c;电脑磁盘空间已经不满足实际的需求了。为了拓展磁盘空间&#xff0c;就可以使用磁盘克隆的方法来扩展磁盘空间。因此&#xff0c;在本文中&#xff0c;易我小编将讲解硬盘克隆的相关理论知识&#xff0…

非零基础自学Golang 第7章 函数 7.5 匿名函数和闭包

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.5 匿名函数和闭包7.5.1 定义和使用匿名函数7.5.2 闭包的定义7.5.3 闭包的“记忆力”第7章 函数 7.5 匿名函数和闭包 匿名函数即在需要函数时定义函数&#xff0c;匿名函数能以变量方式传递&#xff0c;它常常被用于…

【图像评价】图像质量评价【含GUI Matlab源码 1373期】

⛄一、简介 理论知识参考文献&#xff1a;图像印刷质量的客观评价——以报纸印刷为例 ⛄二、部分源代码 function varargout IQA(varargin) % Begin initialization code - DO NOT EDIT gui_Singleton 1; gui_State struct(‘gui_Name’, mfilename, … ‘gui_Singleton…

C++模板(初阶)

本章主要讲解三个部分&#xff1a;泛型编程、函数模板、类模板 目录 泛型编程 函数模板 函数模板概念 函数模板的格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化 模板参数的匹配原则 类模板 泛型编程 先来大致说一下什么是泛型编程. 在计算机程序设计领…

如何安装第三方的Python包?

目录 什么是第三方包 常见的第三方包 如何安装 方法1&#xff1a;命令行 方法2&#xff1a;在IDE中用图形界面操作 什么是第三方包 我们知道&#xff0c;在Python中包就是把一些同类型的功能封装到一处&#xff0c;包含了函数、类、变量等可供外界使用。使用的方法就是在文…

肠道微生物群、营养与长期疾病风险:母婴视角

谷禾健康 怀孕的母亲与体内的胎儿是息息相关的。由于婴儿接触母体微生物群&#xff0c;母亲和孩子之间的微生物联系在怀孕期间形成。而宿主与微生物群的联系在出生后成熟&#xff0c;并进化成为个体生命中最重要的共生关系之一&#xff0c;对响应营养和环境刺激的稳态调节至关重…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…