0基础深度学习项目13:基于TensorFolw实现天气识别

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

目录

  • 一、创建环境
  • 二、前期准备
    • 2.1 设置GPU
    • 2.2 导入数据
    • 2.3 数据预处理
      • 2.3.1 加载数据
      • 2.3.2 查看图像的标签
    • 2.4 数据可视化
  • 三、构建简单的CNN网络(卷积神经网络)
    • 3.1 网络结构
    • 3.2 编译模型
  • 四、训练模型
  • 五、模型预测
  • 六、总结

一、创建环境

🏡我的环境:
● 语言环境:Python3.8
● 深度学习环境:TensorFlow2
运行环境: colab

二、前期准备

2.1 设置GPU

import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:gpu0 = gpus[0]                                        #如果有多个GPU,仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True)  #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],"GPU")

2.2 导入数据

import os,PIL,pathlib
import matplotlib.pyplot as plt
import numpy             as np
from tensorflow          import keras
from tensorflow.keras    import layers,modelsdata_dir = "/content/drive/MyDrive/k-data/weather_photos"
data_dir = pathlib.Path(data_dir)image_count = len(list(data_dir.glob('*/*.jpg')))
print("图片总数为:",image_count)

输出:
在这里插入图片描述

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

输出:
在这里插入图片描述

2.3 数据预处理

2.3.1 加载数据

image_dataset_from_directory 函数是 TensorFlow 库中的一个工具函数,用于从文件系统中的目录创建图像数据集。这个函数可以自动读取指定目录中的图像文件,并按照一定的规则将它们组织成批次(batch)

batch_size = 32
img_height = 180
img_width = 180# 使用 TensorFlow 库中的 `tf.keras.preprocessing.image_dataset_from_directory()` 函数来创建一个测试图像数据集
train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir, # 图像文件的目录路径validation_split=0.2, # 指定了从数据集中分割出20%的数据用作验证集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)

2.3.2 查看图像的标签

class_names = train_ds.class_names
print(class_names)

输出:
在这里插入图片描述

2.4 数据可视化

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

输出:
在这里插入图片描述

三、构建简单的CNN网络(卷积神经网络)

3.1 网络结构

在这里插入图片描述

⭐卷积层
卷积层是卷积神经网络(CNN)中的基础组件,它通过一组可学习的过滤器(或内核)在输入数据(如图像)上进行卷积操作,以提取局部特征和模式;这些过滤器在整个输入数据上滑动,并通过元素相乘和求和生成特征图,每个特征图代表输入数据在特定过滤器下的特征响应,整个过程通过权值共享和局部连接减少参数数量,使得网络能够高效地学习图像的层次化表示。

⭐池化层
在图像处理中,由于图像中存在较多冗余信息,可用某一区域子块的统计信息(如最大值或均值等)来刻画该区域中所有像素点呈现的空间分布模式,以替代区域子块中所有像素点取值,这就是卷积神经网络中池化(pooling)操作。

池化层可对提取到的特征信息进行降维,实现下采样,同时保留了特征图中主要信息,一方面使特征图变小,简化网络计算复杂度;另一方面进行特征压缩,提取主要特征,增加平移不变性,减少过拟合风险。但其实池化更多程度上是一种计算性能的一个妥协,强硬地压缩特征的同时也损失了一部分信息。

num_classes = 4model = models.Sequential([layers.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*3layers.AveragePooling2D((2, 2)),               # 池化层2,2*2采样layers.Conv2D(64, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3layers.Dropout(0.3),                           # 让神经元以一定的概率停止工作,防止过拟合,提高模型的泛化能力。layers.Flatten(),                       # Flatten层,连接卷积层与全连接层layers.Dense(128, activation='relu'),   # 全连接层,特征进一步提取layers.Dense(num_classes)               # 输出层,输出预期结果
])model.summary()  # 打印网络结构

输出:
在这里插入图片描述

3.2 编译模型

● 损失函数(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'])

四、训练模型

  • history: 用来存储训练过程中的相关信息,比如损失(loss)和准确率(accuracy)等指标。在训练结束后,可以通过这个变量来分析模型的训练效果。

  • model.fit(...): 调用模型的fit方法,用于训练模型。fit方法接收多个参数,其中最重要的包括训练数据和标签,以及一些训练配置。

  • train_imagestrain_labels: 这两个参数分别代表训练数据和对应的标签。train_images是模型训练时使用的特征数据,而train_labels是这些特征数据对应的正确输出标签。

  • epochs=10: 这个参数指定了训练过程中要进行的迭代次数,也就是整个训练数据集要被模型遍历多少次。

  • validation_data=(test_images, test_labels): 这个参数提供了在每个epoch结束后用于验证模型性能的数据。test_imagestest_labels分别代表测试数据和标签。这样,模型在每个epoch训练结束后都会在测试集上评估一次,以监控模型的泛化能力。

epochs = 10history = 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()

输出:
在这里插入图片描述

六、总结

本文将采用CNN实现多云、下雨、晴、日出四种天气状态的识别。较上篇文章,本文为了增加模型的泛化能力,新增了Dropout层并且将最大池化层调整成了平均池化层。

Dropout是一种正则化技术,用于通过在训练过程中随机丢弃(即暂时移除)网络中的一些神经元来减少过拟合。

Dropout的工作原理

  • 随机丢弃:在每次训练迭代中,Dropout以一定的概率(通常是一个超参数,如0.5)随机选择网络中的神经元,并将其暂时从网络中移除。这意味着这些神经元在当前迭代中不会对损失函数的计算和梯度更新产生影响。
  • 保留激活:被保留的神经元将正常参与到前向传播和反向传播过程中。
  • 权重重缩放:由于Dropout在训练过程中减少了神经元的数量,因此通常需要对剩余神经元的权重进行重缩放,以保持网络的表达能力。这通常通过在前向传播过程中对激活值进行缩放来实现。

Dropout的优点

  • 减少过拟合:通过随机丢弃神经元,模型不能过度依赖任何单一的神经元,这迫使网络学习更加鲁棒的特征表示。
  • 模型平均:Dropout可以看作是训练多个不同架构的神经网络并进行集成的一种形式,因为每次迭代中被丢弃的神经元都不同,从而相当于训练了多个不同的模型。
  • 计算效率:尽管Dropout增加了一些计算复杂性,但它不需要额外的参数或存储空间,因此在计算资源有限的情况下仍然是一种实用的技术。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KT来袭,打造沉浸式体验的聚合性web3应用平台

随着步入 2024,漫长的区块链熊市即将接近尾声。纵观产业发展,逆流而上往往会是彰显品牌市场影响力和技术实力的最佳证明。在这次周期中,一个名为KT的web3.0聚合平台吸引了市场关注,无论在市场层面还是技术层面,都广泛赢…

Leetcode 104. 二叉树的最大深度 C++实现

Leetcode 104. 二叉树的最大深度 问题:给定一个二叉树root,返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

培训第三十五天(容器的基础命令使用)

1、创建一个容器并同时执行echo命令 # 快速启动一个容器执行特定的一次性命令并查看输出结果,输出结果后容器直接退出[rootdocker ~]# docker run -it --namea0 centos:latest echo "abc"abc[rootdocker ~]# docker psCONTAINER ID IMAGE COMMAND …

游戏app激励视频广告预加载位置,最大化广告收益

最近收到很多游戏类App开发者咨询激励视频广告,在帮助开发者分析产品的时候,特别是一些初级开发者的App产品,发现用户进入这些App,或者打开某个功能时就弹出激励视频广告,这样是违规的,并且用户看完广告也是…

使用gitee存储项目

gitee地址:Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码:https://blog.csdn.net/m0_65520060/article/details/140091437

数字图像处理【15】特征检测——SIFT特征检测

一、引入SIFT算法 上一篇文章我们重温学习了Harris角点检测算法的基本原理,但在实际生产使用Harris检测角点的时候,会发现一个问题,就是用于检测的输入图像的尺寸大小会直接影响到Harris的检测结果。这是为什么呢?主要是Harris角…

2024最新50道NLP和人工智能领域面试题+答案(中文+英文双版本)

编者按:分享一个很硬核的免费人工智能学习网站,通俗易懂,风趣幽默, 可以当故事来看,轻松学习。 中文版本 自然语言处理 (NLP)已成为语言学、人工智能和计算机科学交叉领域的变革性领域。随着文本数据量的不断增加&…

内网横向移动常用方法

横向移动 #横向移动含义 横向移动是以已经被攻陷的系统为跳板,通过收集跳板机的信息(文档,存储的凭证,ipc连接记录等等信息)来访问其他域内主机。#常见横向手段 1,通过相同的用户名密码批量ipc连接其他域内…

【学习笔记】Day 22

一、进度概述 1、机器学习常识23-24,以及相关代码复现 2、python 补完计划(详见 python 专题) 二、详情 23、U-Net 从宏观结构上来讲(以下摘自常识23): U-Net 就是 U 形状的网络, 前半部分 (左边…

三星计划今年HBM4设计,2025年初开始样品测试

三星计划今年晚些时候完成首款HBM4内存设备的设计定稿,2025年初开始样品测试 根据nN Elec援引行业消息人士的报道,三星计划在今年晚些时候完成首款HBM4内存设备的设计定稿,并预计将于2025年初开始样品测试。该公司预计将采用其最新一代10纳米…

详细分析 el-progress的基本知识以及用法(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 由于实战项目中有所引用,对此记录基本的知识点,并且以Demo的形式呈现 1. 基本知识 el-progress 是 Element Plus UI 库中的一个进度条组件,用于显示任务的完成情况 可以帮助用户了解某个操作或任…

[数据集][目标检测]工程机械车辆检测数据集VOC+YOLO格式3189张10类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3189 标注数量(xml文件个数):3189 标注数量(txt文件个数):3189 标注…

密码生成器(HTML+CSS+JavaScript)

🌏个人博客主页:心.c ​ 前言:前两天写了密码生成器,现在跟大家分享一下,大家如果想使用随便拿,如果哪里有问题还请大佬们给我指出,感谢支持 🔥🔥🔥专题文章&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

Android自定义简单TextView

自定义属性 <declare-styleable name"TextView"><!--name 属性名称format 格式&#xff1a;string 文字 color颜色dimension 宽高 字体大小 integer数字reference 资源引用(drawable)--><attr name"YiRanText" format"string"/&…

torchvision中的数据集使用

1.数据集&#xff1a; 自定义数据集transforms中的类 如何将数据集和transforms结合在一起&#xff1f; 以CIFAR10为列 2.CIFAR10数据集的下载与导入 import torchvisiontrain_settorchvision.datasets.CIFAR10(root"./dataset",trainTrue,downloadTrue) test_set…

判别分析2|Bayes判别分析|Fisher判别分析|软件求解

Bayes判别分析 引入先验信息 距离判别只要求知道总体的数字特征&#xff0c;不涉及总体的分布函数 当均值和协方差未知时&#xff0c;就用样本的均值和协方差矩阵做估计值。距离判别方法简单实用&#xff0c;但没有考虑到每个总体出现的机会大小&#xff0c;即先验概率&#…

Git的使用教程及常用语法03

七.如何从版本库中删除文件 第一种方式&#xff1a;直接在工作区删除文件&#xff0c;然后提交 rm ffile1.txt (注意&#xff1a;这个不是git命令&#xff0c;而是linux命令) 看到状态发现&#xff0c;文件file1.txt已经被删除&#xff0c;提示需要提交到暂存区。 因为我们只…

从开发到集成:视频美颜SDK与直播美颜API详解

在本文中&#xff0c;我们将详细探讨视频美颜SDK的开发过程及其与直播美颜API的集成方案&#xff0c;帮助开发者更好地理解和应用这些技术。 一、视频美颜SDK的开发概述 视频美颜SDK是一个用于实时视频处理的开发工具包&#xff0c;提供了包括磨皮、美白、瘦脸、眼睛放大等多…

盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案

近年来&#xff0c;全球经济的不稳定性&#xff0c;给中小企业的经营和发展带来了巨大的挑战。为提升企业竞争力&#xff0c;中小企业纷纷谋求数字化转型路径&#xff0c;优化生产流程、提高运营效率、降低生产成本&#xff0c;以应对变幻莫测的市场环境。IMS MCM是盘古信息为广…