Neural Network学习笔记3

news/2024/11/24 19:42:55/

损失函数和反向传播网络

在进行损失函数计算后,再进行.backward()反向传播。

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("dataset_transform",train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=1)class Zrf(nn.Module):def __init__(self):super(Zrf, self).__init__()self.model1 = Sequential(Conv2d(3, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 64, 5, padding=2),MaxPool2d(2),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model1(x)return x# 分类问题适合用交叉熵
loss = nn.CrossEntropyLoss()
zrf = Zrf()
for data in dataloader:imgs, targets = dataoutputs = zrf(imgs)# print(outputs)# print(targets)result_loss = loss(outputs, targets)result_loss.backward()

优化器

  以Adadelta为例,torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

params: 模型的参数,让优化器知道我们的模型长什么样子。

lr: Learning rate, 学习率

其他的参数可以采用默认,并且优化算法不同,参数也会有很大不同。

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("dataset_transform",train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=1)class Zrf(nn.Module):def __init__(self):super(Zrf, self).__init__()self.model1 = Sequential(Conv2d(3, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 64, 5, padding=2),MaxPool2d(2),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):x = self.model1(x)return x# 分类问题适合用交叉熵
loss = nn.CrossEntropyLoss()
zrf = Zrf()
# 设置优化器
# SGD 随机梯度下降
# lr的设不可以太大也不可以太小,一般情况下我们采用训练开始时lr大,之后的训练中lr小的方式
optim = torch.optim.SGD(zrf.parameters(), lr=0.01)
for epoch in range(20) :running_loss = 0.0for data in dataloader:imgs, targets = dataoutputs = zrf(imgs)result_loss = loss(outputs, targets)# 在进行反向传播来计算梯度时,要先将梯度置为0,防止之前计算出来的梯度的影响optim.zero_grad()result_loss.backward()# 根据梯度对卷积核参数进行调优optim.step()running_loss = running_loss + result_lossprint(running_loss)

现有网络模型的使用及修改

torchvision.modles中的VGG为例。VGG常用VGG16和VGG19。

weights: 可选,要使用的预训练权重。默认情况下,不使用预先训练的权重。

progress: true时,会展示一个进度条

此外,pytorch在下载模型时会把模型下载到C盘,下面语句可以修改下载位置:

os.environ['TORCH_HOME'] = '/path/to/torch_home'

import torchvision
from torch import nn
from torchvision.models import VGG16_Weights
import os# train_data = torchvision.datasets.ImageNet(root="data_image_net", split="train", download=True,
#                                            transform=torchvision.transforms.ToTensor())# 最新版本默认是没有预训练的,需要使用预训练设置weights='DEFAULT'os.environ['TORCH_HOME'] = '/path/to/torch_home'vgg16_noPre = torchvision.models.vgg16()
vgg16_pre = torchvision.models.vgg16(weights=VGG16_Weights.DEFAULT)
print(vgg16_pre)# 微调网络模型
train_data = torchvision.datasets.CIFAR10("dataset_transform",train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 添加一层
# 在vgg整体层面上加
vgg16_pre.add_module('add_linear', nn.Linear(1000, 10))
print(vgg16_pre)
# 只在某一部分加(classifier部分)
vgg16_pre.classifier.add_module('add_linear', nn.Linear(1000, 10))
print(vgg16_pre)# 修改
vgg16_noPre.classifier[6] = nn.Linear(4096, 10)
print(vgg16_noPre)

网络模型的保存与读取

保存方法演示:model_save.py

import torch
import torchvision
from torch import nn# 使用未经过训练的,初始化的参数
vgg16 = torchvision.models.vgg16()
# 保存方式1
# 这样不仅保存了网络模型的结构,也保存了网络模型的参数
torch.save(vgg16, "vgg16_method1.pth")# 保存方式2
# 不保存网络的结构,只是把网络的参数保存成数据字典,也就是保存了网络的状态
# (官方推荐!!!)占用空间更小
torch.save(vgg16.state_dict(), "vgg16_method2.pth")# 陷阱1
class Zrf(nn.Module):def __init__(self):super(Zrf, self).__init__()self.conv1 = nn.Conv2d(3, 64, kernel_size=3)def forward(self, x):x = self.conv1(x)return xzrf = Zrf()
torch.save(zrf, "zrf_method1.pth")

读取方法演示:model_load.py

import torch
import torchvision
from torch import nn# 方式1 ----> 对应保存方式1,来加载模型
model = torch.load("vgg16_method1.pth")
# print(model)# 方式2 ---> 对应保存方式2
vgg16 = torchvision.models.vgg16() # 新建网络模型结构
model = torch.load("vgg16_method2.pth")
# print(model)
vgg16.load_state_dict(model) # 加载网络模型的状态
print(vgg16)# 陷阱1
# 在使用自己创建的网络时,注意要有网络的这个类在本文件(程序可以访问到网络),只是不需要zrf = Zrf()再创建网络了
# 方法1
# class Zrf(nn.Module):
#     def __init__(self):
#         super(Zrf, self).__init__()
#         self.conv1 = nn.Conv2d(3, 64, kernel_size=3)
#
#     def forward(self, x):
#         x = self.conv1(x)
#         return x
# 方法2
from model_save import *model = torch.load("zrf_method1.pth")
print(model)


http://www.ppmy.cn/news/224644.html

相关文章

1060: 回文数

时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 回文是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“上海自来水来自海上”等。在数学中也有这样一类数字有这样的特征,称为回文数。 设n是一任意自然数。若…

1060- 礼物的最大价值

题目如下 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值&…

1650显卡能带动144hz吗_1060能带动144hz吗

为了获得更好的游戏体验,很多小伙伴除了关注显卡的性能外,对显示器要求也很高。很多人在问1060能带动144hz吗?下面给大家带来详细的解答。 想要弄清楚1060能带动144hz这个问题,先要明白刷新率和帧率的关系。1060一般情况下可以带动…

1060: 最高分

时间限制: 1 Sec 内存限制: 30 MB 题目描述 输入一批学生的成绩(整数),输出最高分。 输入 输入包含多个非负整数和一个负整数。该负数不作为有效成绩,只表示输入结束。 输出 输出一个整数,即最高分。单独占一行。 …

1060:均值

1060:均值 时间限制: 1000 ms 内存限制: 65536 KB【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100)&a…

ZZULIOJ-1060,逆序数字(Python)

题目描述: 输入一个正整数,将其逆序输出,每个数字后有一个空格。 输入: 输入一个正整数n,你可以假设n在int范围内 输出: 将n按其逆序输出,每个数字后有一个空格,输出占一行。…

【C++】1060:均值 (信息学奥赛)

好了,今天的内容就是均值了,内容的详细意思也就是给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。(博主正在冲200粉丝,喜欢的赶紧关注!!!&am…

GTX1060和RTX2060的差距 哪个好

GTX1060和RTX2060显卡参数对比,两者在显存容量与位宽保持一致,RTX2060升级至全新图灵架构,芯片面积更大,达到了445平方毫米,流处理器数量相比GTX1060提升了640个,显存类型由GDDR5升级为全新GDDR6&#xff0…