Pytorch 学习路程

news2025/2/23 18:20:49

目录

下载Pytorch

入门尝试

几种常见的Tensor

Scalar

Vector

Matrix

AutoGrad机制

线性回归尝试

使用hub模块


Pytorch是重要的人工智能深度学习框架。既然已经点进来,我们就详细的介绍一下啥是Pytorch

PyTorch

  • 希望将其代替 Numpy 来利用 GPUs 的威力;

  • 一个可以提供更加灵活和快速的深度学习研究平台。

下载Pytorch

不必着急担心我们下啥版本,Pytorch官网已经给出了一个良好的解决方案:

请根据自己的网站给出的方案进行选择!不要抄我的!

可以复制到Pycharm中,确定好自己的虚拟环境之后,就可以愉快的在终端执行网站推介的配置.

可以在Package包中选择自己的包管理:如果你的环境是conda环境,我个人推介使用conda来下(方便管理)

等待半个小时,我们下好了之后,,就可以使用这个代码跑一下:

在Pycharm的Python控制台上

import torch
torch.__version__

之后我们将会在控制台上尝试我们的代码,这里就不赘述了

入门尝试

我们随意的试一试一些API:

我们可以很轻松的创建一个矩阵:

torch.empty — PyTorch 2.2 documentation

x = torch.empty(5, 3)
x
tensor([[1.4767e+20, 1.6816e-42, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 0.0000e+00]])

我们就会创建一个给定大小的torch:他的值是未初始化的(你可以反复执行查看结果,你会发现结果可能每一次都会发生变化)

我们可以很轻松的创建一个随机矩阵:

torch.rand — PyTorch 2.2 documentation

x = torch.rand(5, 3)
x
tensor([[0.7140, 0.1131, 0.6945],
        [0.8082, 0.6078, 0.5954],
        [0.9646, 0.6500, 0.8988],
        [0.4161, 0.1819, 0.3053],
        [0.1953, 0.3988, 0.9033]])

由此可见,他会随机的生成一些介于0和1之间的随机值

torch.zeros — PyTorch 2.2 documentation

x = torch.zeros(5, 3, dtype=torch.long)
x

将返回给我们一个全0的矩阵

我们还可以升级已有的数组结构:

torch.tensor — PyTorch 2.2 documentation

x = torch.tensor([5.5, 3])
x
tensor([5.5000, 3.0000])

当然可以使用size查看torch的大小

x.size()

还可以对之进行简单的操作:

y = torch.rand(5, 3)
x + y
# 等价操作:torch.add(x, y)
tensor([[1.1685, 1.4813, 1.1385],
        [1.4541, 1.4664, 1.4721],
        [1.5987, 1.1817, 1.3344],
        [1.2923, 1.8951, 1.8134],
        [1.8740, 1.7830, 1.7349]], dtype=torch.float64)

还可以同一般的Python那样进行索引

print(x)
x[:, 1]
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

还可以变换维度

torch.Tensor.view — PyTorch 2.2 documentation

PyTorch中的view( )函数相当于numpy中的resize( )函数,都是用来重构(或者调整)张量维度的,用法稍有不同。

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) 
print(x.size(), y.size(), z.size())

还支持同其他库的协同操作:

a = torch.ones(5)
b = a.numpy()
b
array([1., 1., 1., 1., 1.], dtype=float32)
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
b
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

几种常见的Tensor

torch.Tensor — PyTorch 2.2 documentation

我们的Tensor叫张量,回忆线性代数,我们的张量有维度,我们的维度可以从0上升到:

0: scalar       # 标量
1: vector       # 向量
2: matrix
3: n-dim tensor

Scalar

通常就是一个数值:

x = tensor(42.)
x

你就会发现结果实际上就是封装起来的一个数字:

tensor(42.)

使用dim方法可以查看这个张量的维度:

x.dim()
0

可以简单使用标量乘法,跟线性代数定义的乘法完全一致:

2 * x
tensor(84.)

对于标量,我们可以使用item方法提取里面的值

x.item()

但是建议判断item的维度选用这个方法,因为对于向量,这个方法会抛error

y = torch.tensor([3, 4])
y.item()
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[9], line 2
      1 y = torch.tensor([3, 4])
----> 2 y.item()
​
RuntimeError: a Tensor with 2 elements cannot be converted to Scalar

Vector

例如: [-5., 2., 0.],在深度学习中通常指特征,例如词向量特征,某一维度特征等

Matrix

我们深度学习的计算多涉及矩阵:

M = tensor([[1., 2.], [3., 4.]])
M
tensor([[1., 2.],
        [3., 4.]])

矩阵可以进行矩阵乘法,但是要求满足线性代数下矩阵的乘法规则:

N = tensor([1, 2, 3])
M.matmul(N)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[12], line 2
      1 N = tensor([1, 2, 3])
----> 2 M.matmul(N)
​
RuntimeError: size mismatch, got input (2), mat (2x2), vec (3)

5cd99a73f8ce4494ad86852e_arraychart.jpg (3540×3187) (webflow.com)

AutoGrad机制

深度解析 PyTorch Autograd:从原理到实践 - 知乎 (zhihu.com)

Pytorch autograd,backward详解 - 知乎 (zhihu.com)

参考这两个博客,我来写写我的理解。我们构建的是基于张量的函数算子:

$$
f = f(X, Y, Z, ...)
$$

现在,我们需要求导,首先就要思考,对于多张量的函数,跟多变量函数一样,一些变量是我们这次运算中需要被求导的,一些不是,这样,我们就需要使用Tensor的required_grad参数机制:

x = torch.randn(3,4,requires_grad=True)
x

这样我们的x在后续参与函数运算的时候,在我们反向传播的时候就会参与求导运算。

一些参数的解释

  • data: 即存储的数据信息

  • requires_grad: 设置为True则表示该Tensor需要求导

  • grad: 该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加,这个会在后面讲到。

  • grad_fn: 叶子节点通常为None,只有结果节点的grad_fn才有效,用于指示梯度函数是哪种类型。例如上面示例代码中的y.grad_fn=<PowBackward0 at 0x213550af048>, z.grad_fn=<AddBackward0 at 0x2135df11be0>

  • is_leaf: 用来指示该Tensor是否是叶子节点。

现在我们引入函数算子:

b = torch.randn(3,4,requires_grad=True)
# print(b)
t = x + b
t

我们实际上完成的是两个张量的相加,现在我们就知道,t作为一个结果,发生了两个张量的相加:

tensor([[ 1.2804, -1.8381,  0.0068, -0.3126],
        [-0.4901,  1.5733, -1.1383,  1.4996],
        [ 1.9931, -0.7548, -1.1527, -1.1703]], grad_fn=<AddBackward0>)# 看后面这个,这个说明稍后我们反向传播的时候使用AddBackward算子

使用y.backward()进行反向传播,这个时候,我们如何查看参与运算的张量的梯度呢,答案是:

print(x.grad)
print(b.grad)

可以注意到:我们求一次y.backward(),这个结果就会累加一次。

注意到,一些张量不是我们定义出来的而是算出来的,代表性的就是t,反之剩下的是参与基础运算的x和b

print(x.is_leaf, b.is_leaf, t.is_leaf)
True True False

这样我们就不会对叶子向量求导了!他们就是基础的变量。

线性回归尝试

啥是线性回归呢,我的理解是:使用线性的函数(如果不理解,那就是y = kx + b)拟合数据。我们从简单的线性拟合来。

生成一组(x, y)

import numpy as np
x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype=np.float32)
x_train = x_train.reshape(-1, 1)
x_train.shape
x_train
array([[ 0.],
       [ 1.],
       [ 2.],
       [ 3.],
       [ 4.],
       [ 5.],
       [ 6.],
       [ 7.],
       [ 8.],
       [ 9.],
       [10.]], dtype=float32)
y_values = [2*i + 1 for i in x_values]
y_train = np.array(y_values, dtype=np.float32)
y_train = y_train.reshape(-1, 1)
y_train.shape
y_train
array([[ 1.],
       [ 3.],
       [ 5.],
       [ 7.],
       [ 9.],
       [11.],
       [13.],
       [15.],
       [17.],
       [19.],
       [21.]], dtype=float32)

现在我们使用torch框架下的线性回归:

import torch
import torch.nn as nn
class LinearRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)  
​
    def forward(self, x):
        out = self.linear(x) # 向前传播
        return out

这样我们就完成了一个最简单的模型

input_dim = 1
output_dim = 1
​
model = LinearRegressionModel(input_dim, output_dim)
model
LinearRegressionModel(
  (linear): Linear(in_features=1, out_features=1, bias=True)
)
epochs = 1000           # 训练论数
learning_rate = 0.01    # 学习速率
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)   # 随机梯度下降
criterion = nn.MSELoss()    # 正则化惩罚系数

在这里我们进行训练

for epoch in range(epochs):
    epoch += 1
    # 注意转行成tensor
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
​
    # 梯度要清零每一次迭代
    optimizer.zero_grad() 
​
    # 前向传播
    outputs = model(inputs)
​
    # 计算损失
    loss = criterion(outputs, labels)
​
    # 返向传播
    loss.backward()
​
    # 更新权重参数
    optimizer.step()
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))

我们可以这样得到预测的值:

predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
predicted

如何存取模型呢:

torch.save(model.state_dict(), 'model.pkl')
model.load_state_dict(torch.load('model.pkl'))

也可以使用GPU训练

import torch
import torch.nn as nn
import numpy as np
​
​
class LinearRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)  
​
    def forward(self, x):
        out = self.linear(x)
        return out
​
input_dim = 1
output_dim = 1
​
model = LinearRegressionModel(input_dim, output_dim)
​
# 在这里,直接扔到GPU就行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
​
​
criterion = nn.MSELoss()
​
​
learning_rate = 0.01
​
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
​
epochs = 1000
for epoch in range(epochs):
    epoch += 1
    inputs = torch.from_numpy(x_train).to(device)
    labels = torch.from_numpy(y_train).to(device)
​
    optimizer.zero_grad() 
​
    outputs = model(inputs)
​
    loss = criterion(outputs, labels)
​
    loss.backward()
​
    optimizer.step()
​
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))

使用hub模块

torch.hub — PyTorch 2.2 documentation

Pytorch Hub是一个帮助研究者实现模型再现、快速推理验证的预训练模型库与一套相关的API框架。支持远程从github上下载指定模型、上传与分享训练好的模型、支持从本地加载预训练模型、自定义模型。支持模型远程加载与本地推理、当前Pytorch Hub已经对接到Torchvision、YOLOv5、YOLOv8、pytorchvideo等视觉框架

人话:我们可以直接在操作这些API直接嫖设置好的模型直接用。

我们可以前往Pytorch Hub尝试,搜索你感兴趣的模型:来个例子,我们对deeplabv3_resnet101,就可以搜索到Tutorial:

Deeplabv3 | PyTorch

import torch
model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_resnet50', pretrained=True)
# or any of these variants
# model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_resnet101', pretrained=True)
# model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_mobilenet_v3_large', pretrained=True)
model.eval()

这个时候他会下载模型(默认保存在用户文件夹下的C:/User/.cache/torch/下)

之后下载数据集:

# Download an example image from the pytorch website
import urllib
url, filename = ("https://github.com/pytorch/hub/raw/master/images/deeplab1.png", "deeplab1.png")
try: urllib.URLopener().retrieve(url, filename)
except: urllib.request.urlretrieve(url, filename)

如果网络不好,请手动到地址下载!放到指定位置

然后处理它:

# sample execution (requires torchvision)
from PIL import Image
from torchvision import transforms
# 定义transform算子
input_image = Image.open(filename)
input_image = input_image.convert("RGB")
preprocess = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 预处理
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
​
# move the input and model to GPU for speed if available
if torch.cuda.is_available():
    input_batch = input_batch.to('cuda')
    model.to('cuda')
​
with torch.no_grad():
    output = model(input_batch)['out'][0]
output_predictions = output.argmax(0)

查看效果如何

# create a color pallette, selecting a color for each class
palette = torch.tensor([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1])
colors = torch.as_tensor([i for i in range(21)])[:, None] * palette
colors = (colors % 255).numpy().astype("uint8")
​
# plot the semantic segmentation predictions of 21 classes in each color
r = Image.fromarray(output_predictions.byte().cpu().numpy()).resize(input_image.size)
r.putpalette(colors)
​
import matplotlib.pyplot as plt
plt.imshow(r)
plt.show()

分类成功。

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

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

相关文章

23年新算法,SAO-SVM,基于SAO雪消融算法优化SVM支持向量机回归预测(多输入单输出)-附代码

SAO-SVM是一种基于SAO雪消融算法优化的支持向量机&#xff08;SVM&#xff09;回归预测方法&#xff0c;适用于多输入单输出的情况。下面是一个简要的概述&#xff0c;包括如何使用SAO-SVM进行回归预测的步骤&#xff1a; 步骤&#xff1a; 1. 数据准备&#xff1a; 收集并准…

Python获取上市公司报告,AI分析助力投资决策

折腾了几天&#xff0c;通过从巨潮信息网上获取上市公司的报告&#xff0c;然后实现调用大语言模型的API去分析报告内容&#xff0c;下面把相应的代码和过程分享给对这个感兴趣的兄弟姐妹们&#xff0c;希望能帮到大家。 1&#xff0c;首先去巨潮信息网首页&#xff0c;右上角…

ProgressFlowmon的confluence接口存在任意命令执行漏洞(CVE-2024-2389)

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 ProgressFlowmon是一整套用于网络映射、应用程序性能…

2024年学浪的缓存怎么导出来

在自我成长的道路上&#xff0c;越来越多的朋友选择通过精选课程来提升自己。然而&#xff0c;面对那些服务期限有限的课程&#xff0c;怎样才能把握住知识的光芒&#xff0c;让它照亮未来的每一个角落&#xff1f;本文就教大家如何利用工具下载学浪app平台的课程 工具我已经打…

Java对象克隆-浅拷贝与深拷贝

目录 1、对象的克隆 1.1 对象的浅拷贝 1.2 对象深拷贝 1、对象的克隆 1.1 对象的浅拷贝 在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能会需要一个和A完全相同新对象B&am…

PHP定时任务框架taskPHP3.0学习记录4宝塔面板bash定时任务(轮询指定json文件字段后确定是否执行、环境部署、执行日志、文件权限)

一 需求说明 宝塔面板中,读取指定 /www/wwwroot/lockdata/cron/webapp.json文件&#xff1b;配置定时任务脚本task.sh&#xff1b;当读取webapp.json中&#xff0c;如果cron_task1&#xff0c;则执行任务php start.php start命令行&#xff1b;完成命令后&#xff0c;执行cron…

AJAX——图书管理案例

1.渲染列表 自己的图书数据&#xff1a;给自己起个外号&#xff0c;并告诉服务器&#xff0c;默认会有三本书&#xff0c;基于这三本书做数据的增删改查。 // 目标1&#xff1a;渲染图书列表 // 1.1 获取数据 // 1.2 渲染数据const creator 哈哈 // 封装-获取并渲染图书列表函…

使用共振峰提取元音因素/从声音生成口型动画

视频效果 我前段时间研究了下从声音提取共振峰的方法。今天测试了下实际效果。 我使用一段33秒的女声视频&#xff0c;提取原因后使用静态视位图序列生成了一个视频&#xff0c;效果如下&#xff1a; b站视频&#xff1a;https://www.bilibili.com/video/BV1JD421H7m9/?vd_s…

前端开发与html学习笔记

一、前端开发概述 前端开发&#xff1a;也叫做web前端开发&#xff0c;它指的是基于web的互联网产品的页面(也可叫界面)开发及功能开发互联网产品&#xff1a;指网站为满足用户需求而创建的用于运营的功能及服务&#xff0c;百度搜索、淘宝、QQ、微博、网易邮箱等都是互联网产…

Postman调用OpenApi接口

首先你需要科学上网。。。。。 请求方式&#xff1a;post 请求地址&#xff1a;https://api.openai.com/v1/chat/completions 请求头&#xff1a; Authorization : Bearer key Content-Type : application/json Body : { "messages": [{ "role": &quo…

基于SSM+Jsp+Mysql的房屋租赁系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【C++打怪之路】-- C++开篇

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &…

得物sign参数逆向分析与Python算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. Python算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚…

C++修炼之路之继承<二>

目录 一&#xff1a;子类的六大默认成员函数 二&#xff1a;继承与友元 三&#xff1a;继承与静态成员 四&#xff1a;复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承&#xff1b;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

Spectre-v1 简介以及对应解决措施

文章目录 前言一、Variant 1: Exploiting Conditional Branches.二、 BACKGROUND2.1 Out-of-order Execution2.2 Speculative Execution2.3 Branch Prediction2.4 The Memory Hierarchy2.5 Microarchitectural Side-Channel Attacks2.6 Return-Oriented Programming 三、 ATTAC…

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个&#xff0c;点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架&#xff1f;二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli&#xff0c;并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT&#xff0c;makefile构建工具CMake&#xff0c;编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel&#xff0c;因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

门禁管理系统服务器如何内网映射让外网访问?

禁管理系统整体解决方案,可实现请假出入联动、门状态监控、电子地图、非法闯入报警、远程开门、红外防夹、智能统计等功能&#xff0c;应用非常广泛。 如果门禁管理系统部署在没有公网IP的本地服务器上&#xff0c;如何设置&#xff0c;能让外网互联网上也能登录访问内部的管理…

亚马逊云科技AWS CloudUp for Her送亚马逊认证考试50%优惠券活动

最近总有小伙伴问小李哥&#xff0c;有没有送AWS考试50%优惠券的活动&#xff1f;这次送云从业者(cloud practitioner)、助理级架构师(SAA)考试50%优惠券活动就来了&#xff01; 本次活动叫AWS CloudUp for Her&#xff0c;完成免费在线培训课程即可获得AWS证书考试50%折扣券&a…