卷积神经网络实现天气图像分类 - P3

这篇具有很好参考价值的文章主要介绍了卷积神经网络实现天气图像分类 - P3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍦 参考文章:Pytorch实战 | 第P3周:彩色图片识别:天气识别
  • 🍖 原作者:K同学啊 | 接辅导、项目定制
  • 🚀 文章来源:K同学的学习圈子


环境

  • 系统: Linux
  • 语言: Python3.8.10
  • 深度学习框架: Pytorch2.0.0+cu118

步骤

环境设置

首先是包引用

import torch # pytorch主包
import torch.nn as nn # 模型相关的包,创建一个别名少打点字
import torch.optim as optim # 优化器包,创建一个别名
import torch.nn.functional as F # 可以直接调用的函数,一般用来调用里面在的激活函数

from torch.utils.data import DataLoader, random_split # 数据迭代包装器,数据集切分
from torchvision import datasets, transforms # 图像类数据集和图像转换操作函数

import matplotlib.pyplot as plt # 图表库
from torchinfo import summary # 打印模型结构

查询当前环境的GPU是否可用

print(torch.cuda.is_available())

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
创建一个全局的设备对象,用于使各类数据处于相同的设备中

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 当GPU不可用时,使用CPU

# 如果是Mac系统可以多增加一个if条件,启用mps
if torch.backends.mps.is_available():
	device = torch.device('mps')

数据准备

这次的天气图像是由K同学提供的,我提前下载下来放在了当前目录下的data文件夹中
加载文件夹中的图像数据集,要求文件夹按照不同的分类并列存储,一个简要的文件树为

data
	cloudy
	rain
	shine
	sunrise

使用torchvisio.datasets中的方法加载自定义图像数据集,可以免除一些文章中推荐的自己创建Dataset,个人感觉十分方便,而且这种文件的存储结构也兼容keras框架。

首先我们使用原生的PythonAPI来遍历一下文件夹,收集一下分类信息

import pathlib

data_lib = pathlib.Path('data')
class_names = [f.parts[-1] for f in data_lib.glob('*')] # 将data下级文件夹作为分类名
print(class_names)

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
在所有的图片中随机选择几个文件打印一下信息。

import numpy as np
from PIL import Image
import random

image_list = list(data_lib.glob('*/*'))
for _ in range(10):
	print(np.array(Image.open(random.choice(image_list))).shape)

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
通过打印图像信息,发现图像的大小并不一致,需要在创建数据集时对图像进行缩放到统一的大小。

transform = transforms.Compose([
	transforms.Resize([224, 224]), # 将图像都缩放到224x224
	transforms.ToTensor(), # 将图像转换成pytorch tensor对象
]) # 定义一个全局的transform, 用于对齐训练验证以及测试数据

接下来就可以正式从文件夹中加载数据集了

dataset = datasets.ImageFolder('data', transform=tranform)

现在把整文件夹下的所有文件加载为了一个数据集,需要根据一定的比例划分为训练和验证集,方便模型的评估

train_size = int(len(dataset) *0.8) # 80% 训练集 20% 验证集
eval_size = len(dataset) - train_size

train_dataset, eval_dataset = random_split(dataset, [train_size, eval_size])

创建完数据集,打印一下数据集中的图像

plt.figure(figsize=(20, 4))
for i in range(20):
	image, label = train_dataset[i]
	plt.subplot(2, 10, i+1)
	plt.imshow(image.permute(1,2,0)) # pytorch的tensor格式为N,C,H,W,在imshow展示需要将格式变成H,W,C格式,使用permute切换一下
	plt.axis('off')
	plt.title(class_names[label])

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
最后用DataLoader包装一下数据集,方便遍历

batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
eval_loader = DataLoader(eval_loader, batch_size=batch_size)

模型设计

使用一个带有BatchNorm的卷积神经网络来处理分类问题

class Network(nn.Module):
	def __init__(self, num_classes):
		super().__init__()
		self.conv1 = nn.Conv2d(3, 12, kernel_size=5, strides=1)
		self.conv2 = nn.Conv2d(12, 12, kernel_size=5, strides=1)
		self.conv3 = nn.Conv2d(12, 24, kernel_size=5, strides=1)
		self.conv4 = nn.Conv2d(24, 24, kernel_size=5, strides=1)

		self.maxpool = nn.MaxPool2d(2)

		self.bn1 = nn.BatchNorm2d(12)
		self.bn2 = nn.BatchNorm2d(12)
		self.bn3 = nn.BatchNorm2d(24)
		self.bn4 = nn.BatchNorm2d(24)

		# 224 [-> 220 -> 216 -> 108] [-> 104 -> 100 -> 50]
		self.fc1 = nn.Linear(50*50*24, num_classes)
	
	def forward(self, x):
		x = F.relu(self.bn1(self.conv1(x)))
		x = F.relu(self.bn2(self.conv2(x)))
		x = self.maxpool(x)
		x = F.relu(self.bn3(self.conv3(x)))
		x = F.relu(self.bn4(self.conv4(x)))
		x = self.maxpool(x)
	
		x = x.view(x.size(0), -1)
		
		x = self.fc1(x)

		return x

model = Network(len(class_names)).to(device) # 别忘了把定义的模型拉入共享中
summary(model, input_size=(32, 3, 224, 224))

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能

模型训练

首先定义一下每个epoch内训练和评估的逻辑

def train(train_loader, model, loss_fn, optimizer):
	train_size = len(train_loader.dataset)
	num_batches = len(train_loader)

	train_loss, train_acc = 0, 0
	for x, y in train_loader:
		x, y = x.to(device), y.to(device)
		
		preds = model(x)
		loss = loss_fn(preds, y)

		optimizer.zero_grad()
		loss.backward()
		optimizer.step()

		train_loss += loss.item()
		train_acc += (preds.argmax(1) == y).type(torch.float).sum().item()
	train_loss /= num_batches
	train_acc /= train_size
	return train_loss, train_acc
	
def eval(eval_loader, model, loss_fn):
	eval_size = len(eval_loader.dataset)
	num_batches = len(eval_loader)
	eval_loss, eval_acc = 0, 0
	for x, y in eval_loader:
		x, y = x.to(device), y.to(device)

		preds = model(x)
		loss = loss_fn(preds, y)

		eval_loss += loss.item()
		eval_acc += (preds.argmax(1) == y).type(torch.float).sum().item()
	eval_loss /= num_batches
	eval_acc /= eval_size

	return eval_loss, eval_acc

然后编写代码进行训练

loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
epochs = 10

train_loss, train_acc = [], []
eval_loss, eval_acc =[], []
for epoch in range(epochs):
	model.train()
	epoch_train_loss, epoch_train_acc = train(train_loader, model, loss_fn, optimizer)
	model.eval()
	model.no_grad():
		epoch_eval_loss, epoch_eval_acc = test(eval_loader, model, loss_fn)

结果展示

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
基于训练和测试数据展示结果

range_epochs = range(len(train_loss))
plt.figure(figsize=(12, 4))
plt.subplot(1,2,1)
plt.plot(range_epochs, train_loss, label='train loss')
plt.plot(range_epochs, eval_loss, label='validation loss')
plt.legend(loc='upper right')
plt.title('Loss')

plt.subplot(1,2,2)
plt.plot(range_epochs, train_acc, label='train accuracy')
plt.plot(range_epochs, eval_acc, label='validation accuracy')
plt.legend(loc='lower right')
plt.title('Accuracy')

卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能

总结与心得体会

通过对训练过程的观察,训练过程中的数据波动很大,并且验证集上的最好正确率只有82%。
目前行业都流行小卷积核,于是我把卷积核调整为了3x3,并且每次卷积后我都进行池化操作,直到通道数为64,由于天气识别时,背景信息也比较重要,高层的卷积操作后我使用平均池化代替低层使用的最大池化,加大了全连接层的Dropout惩罚比重,用来抑制过拟合问题。最后的模型如下:

class Network(nn.Module):
    def __init__(self, num_classes):
        super().__init__()
        
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3)
        self.conv3 = nn.Conv2d(32, 64, kernel_size=3)
        self.conv4 = nn.Conv2d(64, 64, kernel_size=3)
        
        self.bn1 = nn.BatchNorm2d(16)
        self.bn2 = nn.BatchNorm2d(32)
        self.bn3 = nn.BatchNorm2d(64)
        self.bn4 = nn.BatchNorm2d(64)
        
        self.maxpool = nn.MaxPool2d(2)
        self.avgpool = nn.AvgPool2d(2)
        self.dropout = nn.Dropout(0.5)
        
        # 224 -> 222-> 111 -> 109 -> 54 -> 52 -> 50 -> 25
        self.fc1 = nn.Linear(25*25*64, 128)
        self.fc2 = nn.Linear(128, num_classes)
        
    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = self.maxpool(x)
        x = F.relu(self.bn2(self.conv2(x)))
        x = self.avgpool(x)
        x = F.relu(self.bn3(self.conv3(x)))
        x = F.relu(self.bn4(self.conv4(x)))
        x = self.avgpool(x)
        
        
        x = x.view(x.size(0), -1)
        x = self.dropout(x)
        x = F.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

然后增大训练的epochs为30,学习率降低为1e-4

optimizer = optim.Adam(model.parameters(), lr=1e-4)
epochs = 30

训练结果如下
卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能
可以看到,验证集上的正确率最高达到了95%以上
卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能

在数据集中随机选取一个图像进行预测展示

image_path = random.choice(image_list)
image_input = transform(Image.open(image_path))
image_input = image_input.unsqueeze(0).to(device)
model.eval()
pred = model(image_input)

plt.figure(figsize=(5, 5))
plt.imshow(image_input.cpu().squeeze(0).permute(1,2,0))
plt.axis('off')
plt.title(class_names[pred.argmax(1)])

结果如下
卷积神经网络实现天气图像分类 - P3,深度学习,cnn,分类,人工智能文章来源地址https://www.toymoban.com/news/detail-654888.html

到了这里,关于卷积神经网络实现天气图像分类 - P3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 项目实战解析:基于深度学习搭建卷积神经网络模型算法,实现图像识别分类

    随着人工智能的不断发展,深度学习这门技术也越来越重要,很多人都开启了学习机器学习,本文将通过项目开发实例,带领大家从零开始设计实现一款基于深度学习的图像识别算法。 学习本章内容, 你需要掌握以下基础知识: Python 基础语法 计算机视觉库(OpenCV) 深度学习

    2024年02月03日
    浏览(63)
  • 互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

    🔥 优质竞赛项目系列,今天要分享的是 基于人工智能的图像分类技术 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失

    2024年02月02日
    浏览(56)
  • 【毕业设计】深度学习图像分类算法研究与实现 - python OpenCV 卷积神经网络

    🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定

    2024年02月08日
    浏览(52)
  • 图像分类卷积神经网络模型综述

    图像分类:核心任务是从给定的分类集合中给图像分配一个标签任务。 输入:图片 输出:类别。 MNIST数据集是用来识别手写数字,由0~9共10类别组成。 从MNIST数据集的SD-1和SD-3构建的,其中包含手写数字的二进制图像: MNIST数据集将SD-3作为训练集,将SD-1作为测试集,但SD-3比

    2023年04月14日
    浏览(35)
  • 基于卷积神经网络的高光谱图像分类

    近年来深度学习的技术在计算机视觉领域中大放异彩,使得对多光谱数据分类的研究迅速发展,结合2D-CNN,3D-CNN,注意力机制,PCA降维等方法均可使得对多光谱图像的分类精度得以提升。目前CNN网络大量用于传统的CV领域,而对于高光谱图像的分类仍比较缺乏,本文章基于C

    2024年02月10日
    浏览(39)
  • 竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

    🔥 优质竞赛项目系列,今天要分享的是 深度学习卷积神经网络垃圾分类系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 近年来,随着我国经济的快速发展,国家各项建设都蒸蒸日上,成绩显著。

    2024年02月08日
    浏览(43)
  • 竞赛选题 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

    🔥 优质竞赛项目系列,今天要分享的是 深度学习卷积神经网络垃圾分类系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 近年来,随着我国经济的快速发展,国家各项建设都蒸蒸日上,成绩显著。

    2024年02月07日
    浏览(46)
  • AI:89-基于卷积神经网络的遥感图像地物分类

    🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,

    2024年02月04日
    浏览(43)
  • MATLAB卷积神经网络——基于ResNet-50进行图像分类

    一、ResNet50工具箱安装 (1)下载工具箱 https://ww2.mathworks.cn/matlabcentral/fileexchange/64626-deep-learning-toolbox-model-for-resnet-50-network (2)在matlab打开下载的resnet50.mlpkginstall文件 (3)使用下面代码进行测试,出现结果说明安装成功 二、训练猫狗数据集 (1)数据集下载链接:    http

    2024年02月21日
    浏览(47)
  • 计算机竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

    🔥 优质竞赛项目系列,今天要分享的是 深度学习卷积神经网络垃圾分类系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 近年来,随着我国经济的快速发展,国家各项建设都蒸蒸日上,成绩显著。

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包