Pytorch---使用Pytorch实现四种天气分类问题

一、代码中的数据集可以通过以下链接获取

百度网盘提取码:lala

二、代码运行环境

Pytorch-gpu==1.7.1
Python==3.7

三、数据集处理代码如下所示

import torchvision
from torchvision import transforms
import os
from torch.utils.data import DataLoader


def loader_data():
    BATCH_SIZE = 64
    transform = transforms.Compose([
        transforms.Resize((96, 96)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5],
                             std=[0.5, 0.5, 0.5])
    ])
    train_ds = torchvision.datasets.ImageFolder(root=os.path.join('dataset', 'train_weather'), transform=transform)
    test_ds = torchvision.datasets.ImageFolder(root=os.path.join('dataset', 'test_weather'), transform=transform)
    train_dl = DataLoader(dataset=train_ds, batch_size=BATCH_SIZE, shuffle=True)
    test_dl = DataLoader(dataset=test_ds, batch_size=BATCH_SIZE)

    return train_dl, test_dl, test_ds.class_to_idx

四、模型的构建代码如下所示

import torch
from torch import nn


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
        self.bn1 = nn.BatchNorm2d(num_features=16)
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3)
        self.bn2 = nn.BatchNorm2d(num_features=32)
        self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
        self.bn3 = nn.BatchNorm2d(num_features=64)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.drop = nn.Dropout(0.5)
        self.drop2d = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(in_features=64 * 10 * 10, out_features=1024)
        self.bn_f1 = nn.BatchNorm1d(num_features=1024)
        self.fc2 = nn.Linear(in_features=1024, out_features=256)
        self.bn_f2 = nn.BatchNorm1d(num_features=256)
        self.fc3 = nn.Linear(in_features=256, out_features=4)

    def forward(self, x):
        x = self.pool(torch.relu(self.conv1(x)))
        x = self.bn1(x)
        x = self.pool(torch.relu(self.conv2(x)))
        x = self.bn2(x)
        x = self.pool(torch.relu(self.conv3(x)))
        x = self.bn3(x)
        x = self.drop2d(x)
        x = x.view(-1, x.size(1) * x.size(2) * x.size(3))
        x = torch.relu(self.fc1(x))
        x = self.bn_f1(x)
        x = self.drop(x)
        x = torch.relu(self.fc2(x))
        x = self.bn_f2(x)
        x = self.drop(x)
        x = self.fc3(x)
        return x

五、模型的训练代码如下所示

import torch
from data_loader import loader_data
from model_loader import Net
from torch import nn
import tqdm
from sklearn.metrics import accuracy_score
import numpy as np
import os

# 数据的加载
train_dl, test_dl, class_index = loader_data()

# 模型的加载
model = Net()

# 训练的配置
loss_fn = nn.CrossEntropyLoss()
optim = torch.optim.Adam(params=model.parameters(), lr=0.001)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
EPOCHS = 100

# 进行训练
model = model.to(device)
for epoch in range(EPOCHS):
    # 训练部分
    model.train()
    train_tqdm = tqdm.tqdm(iterable=train_dl, total=len(train_dl))
    train_tqdm.set_description_str('Train epoch {:2d}'.format(epoch))
    train_accuracy_sum = []
    train_loss_sum = []
    for images, labels in train_tqdm:
        images, labels = images.to(device), labels.to(device)
        pred = model(images)
        loss = loss_fn(pred, labels)
        optim.zero_grad()
        loss.backward()
        optim.step()
        # 进行训练结果的展示
        train_loss_sum.append(loss.item())
        pred = torch.argmax(input=pred, dim=-1)
        train_accuracy_sum.append(accuracy_score(y_true=labels.cpu().numpy(), y_pred=pred.cpu().numpy()))
        train_tqdm.set_postfix_str(
            'loss is {:14f}, accuracy is {:14f}'.format(np.mean(train_loss_sum), np.mean(train_accuracy_sum)))
    train_tqdm.close()

    # 验证部分
    with torch.no_grad():
        model.eval()
        test_tqdm = tqdm.tqdm(iterable=test_dl, total=len(test_dl))
        test_tqdm.set_description_str('Val epoch {:2d}'.format(epoch))
        test_accuracy_sum = []
        test_loss_sum = []
        for images, labels in test_tqdm:
            images, labels = images.to(device), labels.to(device)
            pred = model(images)
            loss = loss_fn(pred, labels)
            # 进行训练结果的展示
            test_loss_sum.append(loss.item())
            pred = torch.argmax(input=pred, dim=-1)
            test_accuracy_sum.append(accuracy_score(y_true=labels.cpu().numpy(), y_pred=pred.cpu().numpy()))
            test_tqdm.set_postfix_str(
                'loss is {:14f}, accuracy is {:14f}'.format(np.mean(test_loss_sum), np.mean(test_accuracy_sum)))
        test_tqdm.close()

# 模型的保存
if not os.path.exists(os.path.join('model_data')):
    os.mkdir(os.path.join('model_data'))
torch.save(model.state_dict(), os.path.join('model_data', 'model.pth'))

六、模型的预测代码如下所示

import os
import torch
from data_loader import loader_data
from model_loader import Net
import matplotlib.pyplot as plt
import matplotlib

# 数据的加载
train_dl, test_dl, class_index = loader_data()
image, label = next(iter(test_dl))
new_class = dict((v, k) for k, v in class_index.items())

# 模型的加载
model = Net()
model_state_dict = torch.load(os.path.join('model_data', 'model.pth'))
model.load_state_dict(model_state_dict)
model.eval()

# 进行模型的预测
index = 23
with torch.no_grad():
    pred = model(image)
    pred = torch.argmax(input=pred, dim=-1)
    matplotlib.rc("font", family='Microsoft YaHei')
    plt.axis('off')
    plt.title('预测结果为:' + new_class.get(pred[index].item()) + ',标签结果为:' + new_class.get(label[index].item()))
    plt.imshow(image[index].permute(1, 2, 0))
    plt.savefig('result.png')
    plt.show()

七、代码的运行结果如下所示

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pytorch是一种深度学习框架,它可以用来分类不同种类的天气。以下就四种天气分类介绍如下。 第一种天气是晴天。晴天是指无云、阳光明媚的天气。对于这种天气分类,可以使用Pytorch中的卷积神经网络(CNN)模型来进行分类。训练集可以包括不同时间、地点和光照条件下的晴天照片,然后使用Pytorch训练模型来对新的晴天照片进行分类。 第二种天气是雨天。雨天是指天空阴沉,下着雨或者雪的天气。对于这种天气分类,可以使用Pytorch中的循环神经网络(RNN)模型来进行分类。训练集可以包括不同降雨强度、位置和时间的雨天照片,然后使用Pytorch训练模型来对新的雨天照片进行分类。 第三种天气是雾天。雾天是指大气中水汽达到饱和状态时形成的悬浮在空气中的小水滴所形成的一种气象现象。对于这种天气分类,可以使用Pytorch中的卷积神经网络(CNN)模型来进行分类。训练集可以包括不同密度、时间和位置的雾天照片,然后使用Pytorch训练模型来对新的雾天照片进行分类。 第四种天气是多云天气。多云天气是指部分天空被云层覆盖的天气。对于这种天气分类,可以使用Pytorch中的卷积神经网络(CNN)模型来进行分类。训练集可以包括不同云量、高度和位置的多云天气照片,然后使用Pytorch训练模型来对新的多云天气照片进行分类。 综上所述,Pytorch可以用四种神经网络模型分别对晴天、雨天、雾天和多云天气进行分类。这些模型通过大量的训练数据和Pytorch技术的运用可以达到较高的分类准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水哥很水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值