DeepLearn-实现天气的识别

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

本次使用的数据集有晴天、雨天、多云和日出。

导入基本的包 包括读取文件、图像处理、科学计算和tensorflow的api包layers是层模块,提供了神经网络的实现。

import  os,PIL,pathlib
import  matplotlib.pyplot as plt
import  numpy as np
from  tensorflow  import  keras
from tensorflow.keras  import  layers,models
import  tensorflow as tf
//加载数据集
data_dir = "E:\jupyter\weather_photos"data_dir = pathlib.Path(data_dir)image_count = len(list(data_dir.glob('*/*.jpg')))print("图片总数为:",image_count)

割分训练集和验证集 bach_size 是每次训练放进去的数据


batch_size = 32
img_height = 180
img_width = 180
#进行图片的处理  指定数据集路径 、比列、种子德等
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)

构建卷积神经网络


num_classes = 4#三个卷积层 和两个池化层  通过dropout来防止过渡拟合model = models.Sequential([#将输入图像的像素值从 [0, 255] 重新缩放到 [0, 1] 范围内。1/255 代表每个像素值都会被缩放。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)),               # 池化层12*2采样layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层2,卷积核3*3layers.AveragePooling2D((2, 2)),               # 池化层22*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()  # 打印网络结构
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=0.001)
#编译模型
model.compile(optimizer=opt,loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])

进行20轮的模型训练

epochs = 20
history = model.fit(train_ds,validation_data=val_ds,epochs=epochs
)
model.save('pre2.h5')

将准确率和丢失精度可视化

拓展

拿到新的图片,对图片进行预测。

import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
import tensorflow as tf
import os
import pathlib
import PIL# 加载保存的模型
model = load_model('pre2.h5')# 类别名称列表,和之前训练时使用的类别名称保持一致class_names = ['cloudy', 'rain', 'shine', 'sunrise']
# 图像预处理函数,与训练时的预处理保持一致
# def preprocess_image(image_path, img_height, img_width):
#     img = image.load_img(image_path, target_size=(img_height, img_width))  # 调整图像大小
#     img_array = image.img_to_array(img)                                    # 将图像转换为 NumPy 数组
#     img_array = np.expand_dims(img_array, axis=0)                          # 增加一维,作为批次输入
#     img_array = img_array / 255.0                                          # 缩放到 [0, 1] 区间
#     return img_array
def preprocess_image(image_path, img_height, img_width):img = image.load_img(image_path, target_size=(img_height, img_width))  # 调整图像大小img_array = image.img_to_array(img)                                    # 转换为NumPy数组img_array = np.expand_dims(img_array, axis=0)                          # 增加一维,作为批次输入return img_array# 预测函数
def predict_image(model, image_path, img_height, img_width, class_names):img_array = preprocess_image(image_path, img_height, img_width)        # 预处理图像predictions = model.predict(img_array)                                 # 使用模型进行预测predicted_class = np.argmax(predictions[0])                            # 获取预测类别索引predicted_class_name = class_names[predicted_class]                    # 获取类别名称confidence = np.max(predictions[0])                                    # 获取预测置信度return predicted_class_name, confidence# 定义图像大小,保持与模型训练时一致
img_height = 180
img_width = 180# 指定要预测的图像路径
image_path = '日出.jpg'  # 替换为你要预测的图像路径# 使用模型进行预测
predicted_class_name, confidence = predict_image(model, image_path, img_height, img_width, class_names)# 打印预测结果
print(f"Predicted class: {predicted_class_name} with confidence: {confidence:.2f}")

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

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

相关文章

pycharm与anaconda下的pyside6的安装记录

一、打开anaconda虚拟环境的命令行窗口,pip install,加入清华源: pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 二、打开pycharm,在文件--设置--工具--外部工具中配置一下三项: 1、 QtDesigner…

Java常用任务调度

JAVA 任务调度技术 前言 在日常开发过程中,我们经常会遇到周期性执行某段代码的场景。比如定期同步订单,定期更新商品信息,定期发送消息等。这些重复执行的代码可以抽象为一个任务(Task)。 一个Task的特点如下: 包含需要执行的业…

将多个commit合并成一个commit并提交

0 Preface/foreword 1 压缩多个commit方法 1.1 git merge --squash 主分支:main 开发分支:test 当前在test分支提交了8个commits,功能已经开发完成,需要将test分支合并到main分支,但是不想在合并时候,看…

开源一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码

大家好,我是一颗甜苞谷,今天分享一款基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码。 前言 在当今快速发展的商业环境中,库存管理对于企业来说至关重要。然而,许多企业仍然依赖于传统的、手动…

【Rust】环境搭建

▒ 目录 ▒ 🛫 导读需求 1️⃣ 安装Chocolatey安装依赖 2️⃣ 安装RustRover安装toolchain(rustup、VS)重启配置生效设置安装插件 📖 参考资料 🛫 导读 需求 重装系统,记录下环境搭建遇到的问题。 1️⃣ …

安装Ubuntu系统

打开vmware,新建一个Ubuntu虚拟机,点击自定义,进入下一步 ,选择Workstation 17.x后,点击下一步 选择稍后安装系统选项,进入选择客户机操作系统页面,客户机操作系统选择Linux,版本选…

rom定制系列------红米note8_miui14安卓13定制修改固件 带面具root权限 刷写以及界面预览

💝💝💝红米note8机型代码:ginkgo。高通芯片。此固件官方最终版为稳定版12.5.5安卓11的版本。目前很多工作室需要高安卓版本的固件来适应他们的软件。并且需要root权限。根据客户要求。修改固件为完全root。并且修改为可批量刷写的…

电脑仅一个C盘如何重装系统?超简单教程分享!

当我们的电脑仅配备一个C盘时,重装系统的过程可能会显得尤为棘手。因为一旦格式化硬盘,安装系统的分区也可能被一并清除,导致安装过程中断。这时候我们完全可以通过对电脑进行分区来解决这一问题。分区不仅能够帮助我们更好地管理硬盘空间&am…

提升网站速度与性能优化的有效策略与实践

内容概要 在数字化快速发展的今天,网站速度与性能优化显得尤为重要,它直接影响用户的浏览体验。用户在访问网站时,往往希望能够迅速获取信息,若加载时间过长,轻易可能导致他们转向其他更为流畅的网站。因此&#xff0…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)

继续上篇介绍,本篇介绍一下封装RTP的数据格式,如何将摄像头采集的码流,音频的码流,封装到rtp里,传输。 有自己私有协议例子,有rtp协议,参考代码。注意不是rtsp协议。 一、私有协议 玩过tcp协议…

构建灵活、高效的HTTP/1.1应用:探索h11库

文章目录 构建灵活、高效的HTTP/1.1应用:探索h11库背景这个库是什么?如何安装这个库?库函数使用方法使用场景常见的Bug及解决方案总结 构建灵活、高效的HTTP/1.1应用:探索h11库 背景 在现代网络应用中,HTTP协议是基础…

利用游戏引擎的优势

大家好,我是小蜗牛。 在当今快速发展的游戏产业中,选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎,为开发者提供了丰富的工具和资源,使他们能够高效地开发出优秀的游戏。本文将探讨如何…

仓颉编程语言官网正式上线 !首个公测版本开放下载 !

今年6月21日,华为开发者大会(HDC)正式公开介绍了华为自研的通用编程语言:仓颉编程语言,并发布了HarmonyOS NEXT仓颉语言开发者预览版,开发者可以使用仓颉开发鸿蒙原生应用。4个月以来,仓颉编程语…

PHP爬虫的奇幻之旅:如何用代码“偷窥”京东商品的SKU信息

开篇:代码界的007 想象一下,你是一名代码界的007,你的任务是潜入京东的数据库,获取商品的SKU信息。不过别担心,我们不是真的去偷数据,而是用PHP编写一个爬虫,合法地获取公开的API数据。这不仅是…

C++初阶(七)--类和对象(4)

目录 ​编辑 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 二、类型转换 1.隐式类型转换 2.explicit关键字 3.类类型之间的对象隐式转换 三、static成员函数 1.概念 2.特性 3.面试题: 四、友元函数 1.基本介绍 2.回顾: 3.友元类&am…

【问题记录】当机器人存在多个串口需要绑定时udevadm的作用

一、正常绑定 输入sudo udevadm info -a /dev/ttyUSBx | grep KERNELS 命令 会出现KERNELS的编号,记录编号。 修改规则文件/etc/udev/rules.d/99-usb.rules 添加以下命令 KERNEL"ttyUSB*", KERNELS"2-1.2:1.0", MODE:"0666", GROU…

kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

大家好,我是锋哥。今天分享关于【kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?】面试题?希望对大家有帮助; kafka 分布式(不是单机)的情况下,如何保证消息的…

微信小程序时间弹窗——年月日时分

需求 1、默认当前时间2、选择时间弹窗限制最大值、最小值3、每次弹起更新最大值为当前时间&#xff0c;默认值为上次选中时间4、 minDate: new Date(2023, 10, 1).getTime(),也可以传入时间字符串new Date(2023-10-1 12:22).getTime() html <view class"flex bb ptb…

【UE5.3 Cesium for Unreal】编译GlobePawn

目录 前言 效果 步骤 一、下载所需文件 二、下载CesiumForUnreal插件 三、处理下载的文件 四、修改代码 “CesiumForUnreal.uplugin”部分 “CesiumEditor.cpp”部分 “CesiumEditor.h”部分 “CesiumPanel.cpp”部分 “IonQuickAddPanel.cpp”部分 “IonQuickAd…

截取一个字符串的一部分赋值给另一个字符串

文章目录 截取一个字符串的一部分赋值给另一个字符串1.string s(s1,pos,len)2.s.substr(pos,n) 返回一个string 截取一个字符串的一部分赋值给另一个字符串 1.string s(s1,pos,len) s是string s1从下标pos开始len个字符的拷贝。如果pos>s1.size()&#xff0c;构造函数未定…