首页 > 其他分享 >【Pytorch】小土堆笔记(未完成)

【Pytorch】小土堆笔记(未完成)

时间:2023-10-09 10:37:36浏览次数:42  
标签:loss torchvision 笔记 Pytorch train test 土堆 total data

transforms

在训练的过程中,神经网络模型接收的数据类型是 Tensor,而不是 PIL 对象,因此我们还需要对数据进行预处理操作,比如图像格式的转换。

同时我们可以对图片进行一系列图像变换与增强操作,例如裁切边框、调整图像比例和大小、标准化等,以便模型能够更好地学习到数据的特征。

这些操作都可以通过torchvision.transforms来完成,所以transforms可以理解为图像预处理工具包。

transforms具体用法可以参照:3.2 PyTorch_Torchvision-02:transforms - 知乎 (zhihu.com)

dataset_transform = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()])

train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=dataset_transform, download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=dataset_transform, download=True)

Compose可以将各种操作组合在一起,在数据里量足够的情况下我们一般使用ToTensor足够,不需要进行图片增强操作,所以我们可以简写:

test_data = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor())

dataloader

① Dataset只是去告诉我们程序,我们的数据集在什么位置,数据集第一个数据给它一个索引0,它对应的是哪一个数据。

② Dataloader就是把数据加载到神经网络当中,Dataloader所做的事就是每次从Dataset中取数据,至于怎么取,是由Dataloader中的参数决定的。

test_data = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)

这里的四个参数,分别解释一下:

batch_size 就是每批次大小

shuffle 是否打乱数据,推荐设置为True

num_workers 这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0)

drop_last 如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了…
如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点(也有可能会报错)

在加载数据集后,我们可以使用以下结构来访问每一批数据的内容。

writer = SummaryWriter("logs/11_dataloader")
# 测试数据集使用dataLoder后的结果
step = 0
for data in test_loader:
    imgs, targets = data
    # print(imgs.shape)
    # print(targets)
    writer.add_images("Epoch:{}".format(), imgs, step)
    step = step+1
writer.close()

加载、修改、保存模型

import torchvision
from torch import nn

vgg16 = torchvision.models.vgg16(weights= torchvision.models.VGG16_Weights.DEFAULT)

train_data = torchvision.datasets.CIFAR10("../dataset", train=True, transform=torchvision.transforms.ToTensor(),
                                          download=True)

# x下面的几种常见的修改方式,效果都一样

# vgg16.add_module('add_linear', nn.Linear(1000, 10))
# print(vgg16)
#
# vgg16.classifier.add_module('add_linear', nn.Linear(1000, 10))
# print(vgg16)

vgg16.classifier[6] = nn.Linear(4096, 10)
import torch
import torchvision

vgg16 = torchvision.models.vgg16()

# 保存方式 1 模型结构+模型参数
torch.save(vgg16, "vgg16_method1.pth")
# 读取方式
model1 = torch.load("vgg16_method1.pth")
#print(model1)

# 保存方式 2 模型参数(官方推荐)
torch.save(vgg16.state_dict(), "vgg16_method2.pth")
# 读取方式
vgg16_new = torchvision.models.vgg16()
vgg16_new.load_state_dict(torch.load("vgg16_method2.pth"))
# vgg16_new = torch.load("vgg16_method2.pth")
print(vgg16_new)

模型的训练(cpu)

import torch.optim.optimizer
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

from model import MyModel
# 准备数据集

train_data = torchvision.datasets.CIFAR10("../dataset", train=True, transform=torchvision.transforms.ToTensor(),
                                          download=True)
test_data = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                         download=True)

# 查看数据集的大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print(f"测试数据集的长度为:{test_data_size}")

# 利用 DataLoader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

# 创建网络
myModel = MyModel()

# 损失函数
loss_fn = nn.CrossEntropyLoss()

# 优化器
# learning_rate = 0.01
# 1e-2 = 1 * 10^-2 = 1/100 = 0.01
learning_rate = 1e-2 # 0.01
optimizer = torch.optim.SGD(myModel.parameters(), lr=learning_rate)

# 设置训练网络的一些参数
# 训练训练的次数
total_train_step = 0
# 记录训练的次数
total_test_step = 0
# 训练的轮数
epoch = 10

# 添加tensorboard
writer = SummaryWriter("./logs/27_model_train")


for i in range(epoch):
    print("------------------第{}轮训练------------------".format(i+1))
    myModel.train()
    # 训练步骤开始
    for data in train_dataloader:
        imgs, targets = data
        outputs = myModel(imgs)
        loss = loss_fn(outputs, targets)
        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 记录训练次数
        total_train_step = total_train_step + 1
        if total_train_step % 100 ==0:
            print("训练次数:{}, Loss:{}".format(total_train_step, loss.item()))
            writer.add_scalar("train_loss", loss.item(), total_train_step)
    # 测试步骤开始
    myModel.eval()
    total_test_loss = 0
    total_accuracy = 0
    with torch.no_grad():
        for data in test_dataloader:
            imgs, targets = data
            outputs = myModel(imgs)
            loss = loss_fn(outputs, targets)
            total_test_loss = total_test_loss + loss.item()
            accuracy = (outputs.argmax(1) == targets).sum()
            total_accuracy = total_accuracy + accuracy
    print("整体测试集上的Loss : {}".format(total_test_loss))
    print("整体测试集上的正确率: {}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_accuracy", total_accuracy/test_data_size)
    total_test_step = total_test_step + 1
    torch.save(myModel, "MyModel_{}.pth".format(i))
    print("模型已保存")
writer.close()

模型训练(GPU)

import torch.optim.optimizer
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

from model import MyModel
import time
# 准备数据集

train_data = torchvision.datasets.CIFAR10("../dataset", train=True, transform=torchvision.transforms.ToTensor(),
                                          download=True)
test_data = torchvision.datasets.CIFAR10("../dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                         download=True)

# 查看数据集的大小
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print(f"测试数据集的长度为:{test_data_size}")

# 利用 DataLoader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64, drop_last=True)
test_dataloader = DataLoader(test_data, batch_size=64, drop_last=True)

# 创建网络
myModel = MyModel()
myModel = myModel.cuda()  # 使用GPU训练

# 损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.cuda()  # 使用GPU训练
# 优化器
# learning_rate = 0.01
# 1e-2 = 1 * 10^-2 = 1/100 = 0.01
learning_rate = 1e-2  # 0.01
optimizer = torch.optim.SGD(myModel.parameters(), lr=learning_rate)

# 设置训练网络的一些参数
# 训练训练的次数
total_train_step = 0
# 记录训练的次数
total_test_step = 0
# 训练的轮数
epoch = 10

# 添加tensorboard
writer = SummaryWriter("./logs/27_model_train")
start_time = time.time()
for i in range(epoch):
    print("------------------第{}轮训练------------------".format(i + 1))
    myModel.train()
    # 训练步骤开始
    for data in train_dataloader:
        imgs, targets = data
        imgs = imgs.cuda()  # GPU加速
        targets = targets.cuda()
        outputs = myModel(imgs)
        loss = loss_fn(outputs, targets)
        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 记录训练次数
        total_train_step = total_train_step + 1
        if total_train_step % 100 == 0:
            end_time = time.time()
            print("用时:{}".format(end_time - start_time))
            print("训练次数:{}, Loss:{}".format(total_train_step, loss.item()))
            writer.add_scalar("train_loss", loss.item(), total_train_step)
    # 测试步骤开始
    myModel.eval()
    total_test_loss = 0
    total_accuracy = 0
    with torch.no_grad():
        for data in test_dataloader:
            imgs, targets = data
            imgs = imgs.cuda()  # GPU加速
            targets = targets.cuda()
            outputs = myModel(imgs)
            loss = loss_fn(outputs, targets)
            total_test_loss = total_test_loss + loss.item()
            accuracy = (outputs.argmax(1) == targets).sum()
            total_accuracy = total_accuracy + accuracy
    print("整体测试集上的Loss : {}".format(total_test_loss))
    print("整体测试集上的正确率: {}".format(total_accuracy / test_data_size))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_accuracy", total_accuracy / test_data_size)
    total_test_step = total_test_step + 1
    torch.save(myModel, "MyModel_{}.pth".format(i))
    print("模型已保存")
writer.close()

 

标签:loss,torchvision,笔记,Pytorch,train,test,土堆,total,data
From: https://www.cnblogs.com/robotpaul/p/17750870.html

相关文章

  • Vue学习笔记(七):绑定css样式
      1绑定class样式¶vue为HTML绑定css中的class样式是通过v-bind实现的。  1.1绑定单个class¶把需要绑定的样式class名赋值给一遍变量,然后通过变量v-bind绑定class属性,绑定后的class并不会覆盖原来的class属性,而是与原来的class进行叠加。如下所示,d......
  • 《动手学深度学习 Pytorch版》 8.2 文本预处理
    importcollectionsimportrefromd2limporttorchasd2l解析文本的常见预处理步骤:将文本作为字符串加载到内存中。将字符串拆分为词元(如单词和字符)。建立一个词表,将拆分的词元映射到数字索引。将文本转换为数字索引序列,方便模型操作。8.2.1读取数据集本文......
  • windows下安装conda和安装GPU版本的tensorflow和pytorch
    windows下安装conda和安装GPU版本的tensorflow和pytorch驱动下载查看自己电脑的独立显卡型号如:NVIDIAGeForceRTX3060在查看自己电脑是否已经安装了显卡驱动,如果显卡可用,那么就是安装了驱动;否则就要到NVIDIA官网下载驱动NVIDIA驱动程序下载找到自己对应型号的显卡驱动下载......
  • LVGL双向链表学习笔记
    LVGL双向链表学习笔记1、LVGL链表数据类型分析对于LVGL双向链表的使用,我们需要关注lv_ll.h和lv_ll.c两个文件,其中lv_ll.h里面包含了链表结构类型定义,以及相关API的声明,首先介绍链表的结构类,如下图所示:一开始看到这个类型声明我是懵的,怎么链表的一个结点的类型是uint8_t,那是不......
  • 《动手学深度学习 Pytorch版》 8.1 序列模型
    到目前为止,我们遇到的数据主要是表格数据和图像数据,并且所有样本都是独立同分布的。然而,大多数的数据并非如此。比如语句中的单词、视频中的帧以及音频信号,都是有顺序的。简言之,如果说卷积神经网络可以有效地处理空间信息,那么本章的循环神经网络(recurrentneuralnetwork,RNN)则可......
  • openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw
    openGauss学习笔记-93openGauss数据库管理-访问外部数据库-oracle_fdwopenGauss的fdw实现的功能是各个openGauss数据库及远程服务器(包括数据库、文件系统)之间的跨库操作。目前支持的远程服务器类型包括Oracle、MySQL(MariaDB)、openGauss(postgres_fdw)、file_fdw、dblink。oracle......
  • Kruskal 重构树学习笔记
    模拟赛突然出了这个,,,被创死了定义我们先回顾最基本的Kruskal算法。Kruskal算法是一种常见并且好写的最小生成树算法,由Kruskal发明。该算法的基本思想是从小到大加入边,是个贪心算法。那什么事Kruskal重构树呢?就是用类似Kruskal的方法来把一个图重构成一颗树。实现方法......
  • pytorch(8-1) 循环神经网络 序列模型
    https://zh.d2l.ai/chapter_recurrent-neural-networks/sequence.html     #%matplotlibinlineimporttorchfromtorchimportnnfromd2limporttorchasd2lfromAPI_Drawimport*T=1000#总共产生1000个点#time[0,1...,999]time=torch.arange(......
  • 模糊测试原理(学习笔记)
    目录0x01什么是模糊测试0x02基本原理和组成1.基本原理基本思想基本概念2.系统组成值得一提:有关状态监控模块的处理0x03基础方法技术数据生成方法1.基本类型数据生成方法2.复合类型数据生成方法3.多阶段交互类型数据生成方法环境控制技术1.运行环境控制技术2.程序运行控制技术3.......
  • 《代码大全》阅读笔记04
    关键的“构建”决策,阅读了第四章之后,收获很多,具体内容如下:在真正构建之前,需要进行一些决策,首先是要选择语言,这貌似是一个难题,而且很有争议,其实对于具体程序员来说却不是一个问题,你几乎没啥选择权,老板让你用啥你就用啥吧,对新手来说,你会什么就找什么样的工作就是了,对于老手来说,公司......