您的位置:首页 > 汽车 > 新车 > 有哪些好玩的网页游戏_建筑人才市场招聘网_2345网址导航是什么浏览器_抖音关键词排名推广

有哪些好玩的网页游戏_建筑人才市场招聘网_2345网址导航是什么浏览器_抖音关键词排名推广

2025/4/19 6:48:41 来源:https://blog.csdn.net/Hiweir/article/details/147028556  浏览:    关键词:有哪些好玩的网页游戏_建筑人才市场招聘网_2345网址导航是什么浏览器_抖音关键词排名推广
有哪些好玩的网页游戏_建筑人才市场招聘网_2345网址导航是什么浏览器_抖音关键词排名推广

目录

1.导包

 2.加载数据、拼接训练、测试文件夹

3. 查看当前目录下的所有文件名,以列表的形式输出

4.原数据集dataset中存在的数据的目标类别 

5.创建train和test目录 及其需要分类的子文件夹

6.使用torchvision 的transforms进行数据预处理 

6.1数据统一缩放resize、ToTensor 、正则化Normalize

6.2用 torchvision.datasets.ImageFolder()加载数据集

 6.3创建dataloader

6.4从迭代器dataloader中取一批数据 

6.5可视化一张图片数据 

7.搭建cnn对四类天气图片进行多分类

7.1搭建CNN模型

 7.2定义设备

7.3创建模型 

7.4 定义优化器与损失函数

7.5定义训练过程 

7.6测试运行 

8. 在CNN中添加BN层

8.1定义cnn模型

8.2创建模型、将模型拷到GPU上 、定义优化器与损失函数

8.3调用 封装的训练函数 进行测试 

9.保存模型参数 

10.加载保存好的模型 

10.1定义一个新模型

10.2新模型加载已保存的模型参数 

10.3查看模型信息 

10.4 把新的模型拷到GPU上, 进行测试

11.保存最优参数 

12.保存完成模型 

13.跨设备的模型保存和加载 


 

1.导包

import torch  #导入pyTorch模块
import torch.nn as nn     #pyTorch中的神经网络模块
import torch.nn.functional as F   #神经网络方法模块
import torch.optim as optim  #定义优化器的模块
import numpy as np   #数据处理的三剑客之一
import matplotlib.pyplot as plt  #画图的模块
import torchvision   #数据预处理方法组合的模块import os    #目录操作需要用到的模块

 2.加载数据、拼接训练、测试文件夹

base_dir = './dataset/'   # './' 读取当前目录下的数据
#拼接两个文件夹路径,用于分割训练数据和测试数据
train_dir = os.path.join(base_dir, 'train')
test_dir = os.path.join(base_dir, 'test')

3. 查看当前目录下的所有文件名,以列表的形式输出

#查看当前目录下的所有文件名,以列表的形式输出
filenames = os.listdir('./dataset')#列表长度 就代表 文件名的数量
len(filenames)
1125

4.原数据集dataset中存在的数据的目标类别 

#原数据集dataset中存在的数据的目标类别
species = ['cloudy', 'rain', 'shine', 'sunrise']

5.创建train和test目录 及其需要分类的子文件夹

# 判断不存在时,创建train和test目录
if not os.path.exists(train_dir):os.mkdir(train_dir)if not os.path.exists(test_dir):os.mkdir(test_dir)
# 分别在train和test目录下创建4种类别的目录
for train_or_test in ['train', 'test']:for spec in species:path = os.path.join(base_dir, train_or_test, spec)os.mkdir(path)

6.将原始数据拷贝到创建的类别文件夹中 

# python中的自带的拷贝工具
import shutil

# 要判断一个图片属于哪个类别.
#'cloudy' in img

# 要把dataset中的图片全部拷贝到train, test目录下的4个子目录中. 
#enumerate() 将遍历对象产生对应的位置索引
#一般,训练数据多于测试数据
#每隔五个,就把一个原始数据放到test目录下,  即 每5个数据,就产生4个训练数据、1个测试数据,  训练数据:测试数据=4:1   
for i, img in enumerate(filenames):for spec in species:if spec in img:img_path = os.path.join(base_dir, img)if i % 5 == 0:path = os.path.join(base_dir, 'test', spec, img)else: path = os.path.join(base_dir, 'train', spec, img)shutil.copy(img_path, path)
# 打印每个类别训练数据和测试数据分别有多少图片
for train_or_test in ['train', 'test']:for spec in species:print(train_or_test, spec, len(os.listdir(os.path.join(base_dir, train_or_test, spec))))
train cloudy 240
train rain 172
train shine 202
train sunrise 286
test cloudy 60
test rain 43
test shine 51
test sunrise 71

6.使用torchvision 的transforms进行数据预处理 

from torchvision import transforms

6.1数据统一缩放resize、ToTensor 、正则化Normalize

transform = transforms.Compose([# 统一缩放到96 * 96transforms.Resize((96, 96)),transforms.ToTensor(),   #数据变成tensor, 0-1之间均匀分布 ,把图片数据的通道数放到第二维度# 正则化   标准化 : (一个数值-均值 )/ 标准偏差 #彩色图片RGB有三个通道,每个通道(ToTensor()使数都是0-1之间的数)分别减去均值0.5#std标准偏差transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

6.2用 torchvision.datasets.ImageFolder()加载数据集

torchvision.datasets.ImageFolder()用于加载图像数据集。它假设图像数据集的组织方式是按照类别进行文件夹分组,每个文件夹包含属于该类别的图像。这种组织方式使得ImageFolder能够自动识别和分类图像,并生成相应的标签‌ 

#torchvision.datasets.ImageFolder()返回的就是dataset

train_ds = torchvision.datasets.ImageFolder(train_dir, transform=transform)
train_ds
#torchvision.datasets.ImageFolder()输出返回的数据本身就是一个datatset,后续可以直接创建dataloader
Dataset ImageFolderNumber of datapoints: 900Root location: ./dataset/trainStandardTransform
Transform: Compose(Resize(size=(96, 96), interpolation=bilinear, max_size=None, antialias=True)ToTensor()Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]))
test_ds = torchvision.datasets.ImageFolder(test_dir, transform=transform)train_ds.classes  #数据类别,  原数据有多少个文件夹就有多少个类别
['cloudy', 'rain', 'shine', 'sunrise']
train_ds.class_to_idx   #类别对应的索引数字
{'cloudy': 0, 'rain': 1, 'shine': 2, 'sunrise': 3}
len(train_ds)
900
len(test_ds)
225

 6.3创建dataloader

#在Python中没有常量,但全局变量一般会全大写:表示全局通用,值不变,当常量用
#在这里batch_size作为全局变量使用,可以全大写
batch_size = 32
train_dl = torch.utils.data.DataLoader(train_ds, batch_size=batch_size, shuffle=True, )
test_dl = torch.utils.data.DataLoader(test_ds, batch_size=batch_size)

6.4从迭代器dataloader中取一批数据 

imgs, labels = next(iter(train_dl))
imgs.shape
#transforms.ToTensor() 把图片数据的通道数放到第二维度,例如这里的3
# (batch_size, 通道数, 图片大小,图片大小)
torch.Size([32, 3, 96, 96])
labels
#用train_ds.class_to_idx 做了字典数字映射
tensor([3, 0, 3, 0, 2, 3, 1, 3, 0, 0, 2, 3, 3, 2, 0, 3, 3, 0, 3, 3, 3, 3, 1, 0,0, 0, 0, 1, 0, 1, 0, 3])
labels.dtype
torch.int64

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com