pytorch入门篇

news2024/11/15 20:06:48

文章目录

  • 张量
    • 张量的创建
      • 直接创建
      • 依据数值创建
      • 依概率分布创建张量
    • 张量的操作
      • 张量的拼接与切分
      • 张量索引
      • 张量变换
    • 线性回归模型
  • 神经网络
    • softmax
    • softmax实现
    • 自动求导
    • transforms方法
  • 迁移学习
  • 保存和加载模型

张量

张量(Tensors)类似于NumPy的ndarrays,但张量可以在GPU上进行计算。 所以从本质上来说,PyTorch是一yi个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。
在这里插入图片描述

张量的创建

直接创建

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

data: 数据,可以是list,numpy
dtype: 数据类型,默认与data的一致
device: 所在设备,cuda/cpu
requires_grad: 是否需要梯度
pin_memory: 是否存于锁页内存

依据数值创建

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.ones(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

size: 张量的形状,如(3, 3)、(3, 224, 224)
out: 输出的张量
layout: 内存中布局形式,有strided, sparse_coo等
device: 所在设备,gpu/cpu
requires_grad: 是否需要梯度

torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False)
torch.ones_like(input, dtype=None, layout=None, device=None, requires_grad=False)

input: 创建与input同形状的全0张量
dtype: 数据类型
layout: 内存中布局形式

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.full_like(input, dtype=None, layout=torch.strided, device=None, requires_grad=False)

size: 张量的形状,如(3, 3)
fill_value: 张量的值

torch.arange(start=0, end. step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建等差的1维张量
start: 数列起始值
end: 数列“结束值”
step: 数列公差,默认为1
注意事项:数值区间为 [start,end)

依概率分布创建张量

torch.normal(mean, std, out=None)

功能:生成正态分布(高斯分布)
mean: 均值
std: 标准差
四种模式:
mean为标量,std为标量
mean为标量,std为张量
mean为张量,std为标量
mean为张量,std为张量

torch.normal(mean, std, size, out=None)

功能:生成一定大小的生成正态分布(高斯分布)

在这里插入图片描述

torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:生成标准正态分布
size: 张量的形状

在这里插入图片描述

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:在区间 [0,1) 上,生成均匀分布

在这里插入图片描述

torch.randint(low=0, high, size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:区间 [low,high) 生成整数均匀分布
size:张量的形状

在这里插入图片描述

张量的操作

张量的拼接与切分

torch.cat(tensors, dim=0, out=None)

功能:将张量按维度dim进行拼接
tensors:张量序列
dim:要拼接的维度

在这里插入图片描述

torch.stack(tensors, dim=0, out=None)

功能:在新创建的维度dim上进行拼接
tensors:张量序列
dim:要拼接的维度

torch.split(tensor, split_size_or_sections, dim=0)

返回值:张量列表
tensor:要切分的张量
split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
dim:要切分的维度

在这里插入图片描述

张量索引

torch.index_select(input, dim, index, out=None)

功能:在维度dim上,按index索引数据
返回值:依index索引数据拼接的张量
index:要索引的张量
dim:要索引的维度
index:要索引数据的序号

在这里插入图片描述

torch.masked_select(input, mask, out=None)

功能:按mask中的True进行索引
返回值:一维张量
input:要索引的张量
mask:与input同形状的布尔类型张量

在这里插入图片描述

张量变换

torch.reshape(input, shape)

功能:变换张量形状
注意事项:当张量在内存中是连续时,新张量与input共享数据内存
input:要变换的张量
shape:新张量的形状

在这里插入图片描述

torch.transpose(input, dim0, dim1)

功能:交换张量的两个维度
input:要交换的张量
dim0:要交换的维度
dim1:要交换的维度

在这里插入图片描述

torch.squeeze(input, dim=None, out=None)

功能:压缩长度为1的维度(轴)
dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除

在这里插入图片描述

torch.unsqueeze(input, dim, out=None)

功能:依据dim扩展维度
dim:扩展的维度

在这里插入图片描述

线性回归模型

在这里插入图片描述

# 首先我们得有训练样本X,Y, 这里我们随机生成
x = torch.rand(20, 1) * 10
y = 2 * x + (5 + torch.randn(20, 1))

# 构建线性回归函数的参数
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)   # 这俩都需要求梯度

# 设置学习率lr为0.1
lr = 0.1

for iteration in range(100):
    # 前向传播
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)
 
    # 计算loss
    loss = (0.5 * (y-y_pred)**2).mean()
 
    # 反向传播
    loss.backward()
 
    # 更新参数
    b.data.sub_(lr * b.grad)    # 这种_的加法操作时从自身减,相当于-=
    w.data.sub_(lr * w.grad)

    # 梯度清零
    w.grad.data.zero_()
    b.grad.data.zero_()

print(w.data, b.data)

在这里插入图片描述

神经网络

softmax

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

softmax实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import torch
from torch import nn

# 确定随机数种子
torch.manual_seed(7)
# 自定义数据集
X = torch.rand((7, 2, 2))
print(X)
target = torch.randint(0, 3, (7,))
print(target)


# 自定义网络结构
class LinearNet(nn.Module):
    def __init__(self):
        super(LinearNet, self).__init__()
        # 定义一层全连接层
        self.dense = nn.Linear(4, 3)   # 4 = 2*2  3是target的类别数
        # 定义Softmax
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        y = self.dense(x.view((-1, 4)))   # view 类似于reshape()  -1 表示不确定 自动计算
        y = self.softmax(y)
        return y

net = LinearNet()

loss = nn.CrossEntropyLoss()  # 交叉熵损失函数

optimizer = torch.optim.SGD(net.parameters(), lr=0.1)  # 随机梯度下降法

for epoch in range(70):
    train_l = 0.0
    y_hat = net(X)
    l = loss(y_hat, target).sum()

    # 梯度清零
    optimizer.zero_grad()
    # 自动求导梯度
    l.backward()
    # 利用优化函数调整所有权重参数
    optimizer.step()

    train_l += l
    print('epoch %d, loss %.4f' % (epoch + 1, train_l))

自动求导

torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False)

功能:自动求取梯度
tensors:用于求导的张量,如 loss
retain_graph:保存计算图
create_graph:创建导数计算图,用于高阶求导
grad_tensors:多梯度权重

在这里插入图片描述

torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False)

功能:求取梯度
outputs:用于求导的张量,如 loss
inputs:需要梯度的张量
create_graph:创建导数计算图,用于高阶求导
retain_graph:保存计算图
grad_outputs:多梯度权重

在这里插入图片描述

autograd小贴士:
梯度不自动清零
依赖于叶子节点的节点,requires_grad默认为True
叶子节点不可执行in-place
autograd 包是 PyTorch 中所有神经网络的核心。
首先让我们简要地介绍它,然后我们将会去训练我们的第一个神经网络。该 autograd 软件包为 Tensors 上的所有操作提供自动微分。它是一个由运行定义的框架,这意味着以代码运行方式定义你的后向传播,并且每次迭代都可以不同。
我们从 tensor 和 gradients 来举一些例子。
torch.Tensor是包的核心类。如果将其属性.requires_grad设置为True,则会开始跟踪针对tensor的所有操作。完成计算后,你可以调用.backward()来自动计算所有梯度。该张量的梯度将累积到.grad属性中
要停止tensor历史记录的跟踪,你可以调用.detach(),它将其与计算历史记录分离,并防止将来的计算被跟踪。
要停止跟踪历史记录(和使用内存),你还可以将代码块使用with torch.no_grad():包装起来。在评估模型时,这是特别有用,因为模型在训练阶段具有requires_grad=True的可训练参数有利于调参,但在评估阶段我们不需要梯度。
还有一个类对于autograd实现非常重要那就是Function。Tensor和Function互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个.grad_fn属性保存着创建了张量的Function的引用(如果用户自己创建张量,则grad_fn是None)。
如果你想计算导数,你可以调用Tensor.backward()。如果Tensor是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果它有更多元素,则需要指定一个gradient参数来指定张量的形状。

transforms方法

裁剪
a. transforms.CenterCrop
b. transforms.RandomCrop
c. transforms.RandomResizedCrop
d. transforms.FiveCrop
e. transforms.TenCrop

翻转和旋转
a. transforms.RandomHorizontalFlip
b. transforms.RandomVerticalFlip
c. transforms.RandomRotation

图像变换
a. transforms.Pad
b. transforms.ColorJitter
c. transforms.Grayscale
d. transforms.RandomGrayscale
e. transforms.RandomAffine
f. transforms.LinearTransformation
g. transforms.RandomErasing
h. transforms.Lambda
i. transforms.Resize
j. transforms.Totensor
k. transforms.Normalize

transforms的操作
a. transforms.RandomChoice
b. transforms.RandomApply
c. transforms.RandomOrder

迁移学习

迁移学习就是利用数据、任务或模型之间的相似性,将在旧的领域学习过或训练好的模型,应用于新的领域这样的一个过程。从这段定义里面,我们可以窥见迁移学习的关键点所在,即新的任务与旧的任务在数据、任务和模型之间的相似性。
本节我们介绍迁移学习中的一种常用技术:微调(fine tuning)。微调由以下4步构成。
在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型
创建一个新的神经网络模型,即目标模型。它复制了源模型上除了输出层外的所有模型设计及其参数。我们假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集。我们还假设源模型的输出层跟源数据集的标签紧密相关,因此在目标模型中不予采用。
为目标模型添加一个输出大小为目标数据集类别个数的输出层,并随机初始化该层的模型参数
在目标数据集(如FashionMNIST数据集)上训练目标模型。我们将从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的。

在这里插入图片描述
在这里插入图片描述

class SurfaceDefectResNet(torch.nn.Module):
    def __init__(self):
        super(SurfaceDefectResNet, self).__init__()
        # Downloading: "https://download.pytorch.org/models/resnet18-5c106cde.pth" to /home/admin/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth
        # 加载模型 及其 所有参数
        self.cnn_layers = torchvision.models.resnet18(pretrained=True)	
        # 定义了一个变量 "num_ftrs",表示模型中全连接层(fc)的输入特征数。
        num_ftrs = self.cnn_layers.fc.in_features
        # 修改了模型中的全连接层,将输入特征数设置为 "num_ftrs",输出特征数设置为 10。
        self.cnn_layers.fc = torch.nn.Linear(num_ftrs, 10)

    def forward(self, x):
        # stack convolution layers
        out = self.cnn_layers(x)
        return out

net = SurfaceDefectResNet()

保存和加载模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不同管径地下管线的地质雷达响应特征分析

不同管径地下管线的地质雷达响应特征分析 前言 以混凝土管线为例,建立了不同管径的城市地下管线模型,进行二维地质雷达正演模拟,分析不同管径管线的地质雷达响应特征。 文章目录 不同管径地下管线的地质雷达响应特征分析前言1、管径50cm2、…

【项目开发 | C语言项目 | C语言课程管理系统】

本项目是一个简易的课程管理系统,为了帮助用户管理大学课程信息。用户可以进行课程的添加、删除、查看、搜索和修改等操作。适用于初学者学习c语言,也适用于高校学生课程设计,毕业设计参考。 一,开发环境需求 操作系统&#xff1…

DownloadWithEscaping/下载数据并且转义返回数据, DownloadWithCombine/下载数据并且组合数据 的使用

1. DownloadWithEscaping 下载数据并且转义返回数据 1.1 实现 struct PostDataModel:Identifiable, Codable {let userId: Intlet id: Intlet title: Stringlet body: String }/// ViewModel class DownloadWithEscapingViewModel: ObservableObject{Published var posts: [Po…

【LeetCode-中等题】654.最大二叉树

文章目录 题目方法一:递归 题目 方法一:递归 class Solution {int[] num null; public TreeNode constructMaximumBinaryTree(int[] nums) {num nums;return myTree(0,num.length-1);}public TreeNode myTree( int begin , int end){if(begin > end…

什么是RESTful API?它的设计原则是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是RESTful API?RESTful API的设计原则示例 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感…

【数据结构】直接插入排序 希尔排序(一)

目录 一,排序的概念 二,直接插入排序 1,基本思想 2,基本思路 3,思路实现 三,希尔排序 1,希尔排序的特性总结: 2,思路实现: 一,排序的概念…

基于SpringBoot+Vue 的游戏分享网站

1 简介 基于Java SpringBoot 的游戏分享网站,本系统主要包括管理员和用户两个角色组成;主要包括首页、个人中心、用户管理、游戏类型管理、游戏文章管理、交流论坛、系统管理等功能的管理系统。 文章首发地址 2 技术栈 开发语言:Java 框架…

EV代码签名证书的作用有哪些?如何获取呢?

我们都知道,黑客们往往会通过篡改软件代码来进行各种恶意行为,例如加入病毒、木马、恶意代码等,为了确保软件代码的完整性和可信任性,代码签名证书诞生了。代码签名证书又分为普通代码签名证书和EV代码签名证书,我们在…

P1003 [NOIP2011 提高组] 铺地毯(Arknights!)

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

「私信分析」上线,帮助企业进行私信管理,提升营销线索转化

企业在新媒体矩阵建设过程中会出现各种各样的业务难题,为了更好地服务客户,矩阵通将秉持“为客户带来实际业务价值”的原则不断地优化产品功能。 矩阵通是新榜旗下的新媒体数字化内容资产管理SaaS,可以帮助企业解决跨平台账号运营难题&#x…

django_auth_ldap登录权限

用户登录权限分为三种,通过is_active,is_staff,is_superuser标识。可以对组赋予对应的权限。 设定active组、staff组和superuser组分别对应三种权限。在不同组权限下的登录情况如下: 当用户不属于任何一组: 登录失败,提示如图&a…

k8s如何快速部署tomcat

环境 三台云服务器 步骤 部署tomcat kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre8kubectl get pods -o wide 可以获取到 tomcat 信息暴露端口 kubectl expose deployment tomcat6 --port80 --target-port8080 --typeNodePort查看service端口 kubectl ge…

[ESP32 IDF+Vscode]OLED多级菜单显示(摇杆控制)

ADC介绍 ESP32集成了两个 12位SAR(逐次逼近寄存器)adc ,共支持18个测量通道。 1、两个 ADC 通道简介: ADC1: 支持 8 个通道,包括:GPIO32 - GPIO39(并非按顺序) ADC2: 支持 10 …

DataBinding双向绑定简介

一、简介 在Vue中使用的是MVVM架构。通过ViewModel可以实现M层和V层数据的双向绑定。Model层的数据发生变化后,会自动更新View层UI。UI层数据发生变化(用户输入),可以驱动Model层的数据发生变化,借助于Vue框架中的View…

数学建模国赛/美赛常见赛题类型及建模方案(纯干货)(2)

目录 一,评价类问题 1,建模步骤如下图所示: 2,主客观评价问题的区别 3,如何选择合适的评价方法 二,预测类赛题 1,预测类赛题的基本解题步骤 2,预测类问题的区别 3,…

深兰科技荣获“2023年中国人工智能行业十大创新力企业奖”

近日,以“i时代智创未来”为主题的“CIAI 2023第八届中国国际人工智能大会“在上海普陀区隆重召开。 大会期间,举行了”2023年中国人工智能行业创新力企业评选“的颁奖典礼,深兰科技(上海)有限公司成功荣获“2023年中国人工智能行业十大创新力…

HTTP初识,fiddler的使用,URL各部分介绍,QueryString

目录 一、什么是HTTP 二、抓包工具 三、请求的首行 URL 四、URL的各部分详细介绍 一、什么是HTTP 现在网页上,我们常见的是https,但是在二十年前是以http为主,这个协议也叫超文本传输协议,文本->字符串,“超文本”->图片…

Nginx代理victoriametrics集群配置

1,首先安装nginx yum install -y nginx 2,生成密钥文件 安装htpasswd工具 yum install -y httpd-tools 生成密钥文件,prometheus为用户名 htpasswd -c /etc/nginx/conf.d/passwd prometheus 3,修改nginx配置文件nginx.conf,增加如下内容 upstream vmselect {server 10.…

PyTorch - Dataset 迭代数据接口 __getitem__ 异常处理

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/133378772 在模型训练的过程中,加载数据部分,极其容易出现异常,以及不可控的因素,需要通过异常捕获…

RabbitMQ(15672) 消息中间件 NOTE

目录 1、初识 RabbitMQ 消息队列 1.1 MQ 四大核心概念 1.2 消息的发送(无交换机态) 1.3 关于消息自动重新入队 1.3.1 消息的常见应答方法(R) 1.4 关于 RabbitMQ 的持久化、不公平分发以及预取值 2、RabbitMQ 消息的发布确认…