第P3周:Pytorch实现天气识别

基于PyTorch的CNN网络模型训练与实践


FROM


我的环境

  • 语言环境:Python 3.8.10
  • 开发工具:Jupyter Lab
  • 深度学习环境:
    • torch==1.12.1+cu113
    • torchvision==0.13.1+cu113

1. 准备知识

1.1 检查环境

import torch  # 导入PyTorch库,用于构建深度学习模型
import torch.nn as nn  # 导入torch.nn模块,包含构建神经网络所需的类和函数
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot模块,用于数据可视化
import torchvision  # 导入torchvision库,包含处理图像和视频的工具和预训练模型

# 设置硬件设备,如果有GPU则使用,没有则使用cpu
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # 检查系统是否有可用的GPU,如果有则使用GPU,否则使用CPU
torch.__version__
device  # 打印当前设备,以确认是使用GPU还是CPU

输出:
输出

1.2 数据导入

数据存放位置:
在这里插入图片描述
编写代码获取/data/weather_photos文件夹下的文件夹名称,即数据集的分类

# 设置数据目录的路径为当前目录下的'data/weather_photos'文件夹
data_dir = './data/weather_photos/'

# 将字符串路径转换为pathlib.Path对象,这样可以更方便地进行路径操作
data_dir = pathlib.Path(data_dir)
print(data_dir)
# 使用glob方法获取data_dir下的所有文件和文件夹的路径,并将它们存储在data_paths列表中
# '*'表示匹配所有文件和文件夹
data_paths = list(data_dir.glob('*'))
print(data_paths)
# 使用列表推导式创建一个新列表classeNames,其中包含data_paths中每个路径的第一个部分
# 这里假设路径分隔符为'/',适用于Unix/Linux系统
# 如果在Windows系统上运行,应该使用'\\'作为分隔符
# classeNames = [str(path).split("/")[1] for path in data_paths]
classeNames = [path.name for path in data_paths if path.is_dir()]
# 打印classeNames列表,这个列表包含了所有子目录的名称
classeNames

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

编写可视化代码,查看cloudy文件夹下的图片

# 导入matplotlib的pyplot模块,用于绘图
import matplotlib.pyplot as plt
# 从PIL库导入Image模块,用于图像处理
from PIL import Image

# 指定图像文件夹的路径
image_folder = './data/weather_photos/cloudy/'

# 获取文件夹中的所有图像文件,支持jpg、png和jpeg格式
# os.listdir列出目录下的所有文件和文件夹,endswith检查文件扩展名
# 列表推导式用于创建一个包含所有图像文件名的列表
image_files = [f for f in os.listdir(image_folder) if f.endswith((".jpg", ".png", ".jpeg"))]

# 创建一个3行8列的子图网格,figsize设置图像的大小
fig, axes = plt.subplots(3, 8, figsize=(16, 6))

# 使用for循环和zip函数同时迭代子图轴对象和图像文件名
# axes.flat将二维的轴数组展平成一维,方便迭代
for ax, img_file in zip(axes.flat, image_files):
    # 构造完整的图像文件路径
    img_path = os.path.join(image_folder, img_file)
    # 使用PIL的Image模块打开图像
    img = Image.open(img_path)
    # 在对应的轴上显示图像
    ax.imshow(img)
    # 关闭轴的边框,使图像显示更清晰
    ax.axis('off')

# 使用tight_layout自动调整子图参数,使之填充整个图像区域
plt.tight_layout()
# 显示图像
plt.show()

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

使用transforms库中的函数,对数据集中的图片进行预处理

# 设置数据目录的路径为当前目录下的'data/weather_photos/'文件夹
total_datadir = './data/weather_photos/'

# 提供一个链接,用于获取关于transforms.Compose的更多信息
# transforms.Compose用于串联多个图像变换操作
# 关于transforms.Compose的更多介绍可以参考:https://blog.youkuaiyun.com/qq_38251616/article/details/124878863 
train_transforms = transforms.Compose([
    transforms.Resize([224, 224]),  # 使用Resize变换将输入图片调整为统一的尺寸224x224
    transforms.ToTensor(),          # 使用ToTensor变换将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间
    transforms.Normalize(           # 使用Normalize变换进行标准化处理,转换为标准正态分布(高斯分布),使模型更容易收敛
        mean=[0.485, 0.456, 0.406], # 标准化的均值,这些值通常是从数据集中计算得到的
        std=[0.229, 0.224, 0.225])  # 标准化的标准差,这些值也是从数据集中计算得到的
])

# 使用datasets.ImageFolder类加载图像数据集
# 指定数据目录和预处理变换
total_data = datasets.ImageFolder(total_datadir, transform=train_transforms)
total_data

输出:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值