一、PyTorch基础

一、PyTorch基本操作

1,导包

import torch

2,查看版本号

torch.__version__
"""
'2.0.1+cpu'
"""

3,初始化(全零)矩阵

x = torch.empty(3,2)
x
"""
tensor([[7.2868e-44, 8.1275e-44],
        [6.7262e-44, 7.5670e-44],
        [8.1275e-44, 6.7262e-44]])
"""

4,随机创建初始化矩阵

4.1 符合正态分布

x_1 = torch.randn(3,4)
x_1
"""
tensor([[ 0.1605, -0.9290, -0.0501, -0.0723],
        [ 0.6792,  0.1977, -0.7773,  0.6927],
        [ 0.7576, -1.4204,  0.1976, -2.2545]])

"""

4.2 符合均匀分布

x_2 = torch.rand(3,4)
x_2
"""
tensor([[0.5876, 0.5991, 0.9678, 0.8188],
        [0.2934, 0.4345, 0.1316, 0.8469],
        [0.0042, 0.3754, 0.3141, 0.8362]])
"""

5,初始化全零矩阵

x1 = torch.zeros(5,2,dtype=torch.long)
x1
"""
tensor([[0, 0],
        [0, 0],
        [0, 0],
        [0, 0],
        [0, 0]])
"""

6,初始化全一矩阵

x2 = torch.ones(3,4)
x2
"""
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
"""

7,查看矩阵大小规格

x2.size()
"""
torch.Size([3, 4])
"""

8,改变矩阵维度

y = torch.randn(3,4)
y
"""
tensor([[-1.3152,  0.2621, -0.7739,  0.1728],
        [-1.3887,  1.0964,  0.7797,  2.0587],
        [ 0.4726, -0.2367,  0.8845,  0.9405]])
"""

y1 = y.view(12)
y1
"""
tensor([-1.3152,  0.2621, -0.7739,  0.1728, -1.3887,  1.0964,  0.7797,  2.0587,  0.4726, -0.2367,  0.8845,  0.9405])
"""


y2 = y.view(2,6)
y2
"""
tensor([[-1.3152,  0.2621, -0.7739,  0.1728, -1.3887,  1.0964],
        [ 0.7797,  2.0587,  0.4726, -0.2367,  0.8845,  0.9405]])
"""


y3 = y.view(6,-1)
y3
"""
tensor([[-1.3152,  0.2621],
        [-0.7739,  0.1728],
        [-1.3887,  1.0964],
        [ 0.7797,  2.0587],
        [ 0.4726, -0.2367],
        [ 0.8845,  0.9405]])
"""

9,Numpy和Tensor格式互转

9.1 Numpy转Tensor

z1 = torch.ones(2,5)
z1
"""
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
"""

z2 = z1.numpy()
z2
"""
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]], dtype=float32)
"""

9.2 Tensor转Numpy

import numpy as np
a1 = np.ones([2,4])
a1
"""
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]])
"""

a2 = torch.from_numpy(a1)
a2
"""
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.]], dtype=torch.float64)
"""

10,Tensor常见形式

import torch
from torch import tensor

10.1 scalar

只要是个或者单一的值,就成为scalar

x = tensor(22)
x
"""
tensor(22)
"""

x.dim() # 0
2*x # tensor(44)
x.item() # 22

10.2 vector

vector向量,表示某一个特征。例如:[年龄,身高,体重],[25,178,60]
向量不是一个值,而实多个值的集合

我的理解是:多个scalar构成了vector

y = tensor([25,178,60])
y
"""
tensor([ 25, 178,  60])
"""

y.dim() # 1
y.size() # torch.Size([3])

10.3 matrix

matrix矩阵,通常是多个维度的。
例如:有三个学生,张三、李四、王二麻子,他们也都有各自的特征([年龄,身高,体重]),[[25,178,60], [22,180,62], [21,177,61]],组合到一块就成了matrix矩阵。

我的理解是:多个vector构成了matrix
在这里插入图片描述

m = tensor([[1,2,3], [2,1,3], [3,1,2]])
m
"""
tensor([[1, 2, 3],
        [2, 1, 3],
        [3, 1, 2]])
"""

m.matmul(m)
"""
tensor([[14,  7, 15],
        [13,  8, 15],
        [11,  9, 16]])
"""

tensor([1,0,1]).matmul(m)
"""
tensor([4, 3, 5])
"""

tensor([1,2,1]).matmul(m)
"""
tensor([ 8,  5, 11])
"""

m*m
"""
tensor([[1, 4, 9],
        [4, 1, 9],
        [9, 1, 4]])
"""

10.4 n-dimensional tensor

pytorch在处理图像中常用到[N,C,H,W]四维tensor进行处理
N:每一个batch中的图像数量
C:每一张图像中的通道数
H:每一张图像垂直维度的像素数个数(高)
W:每一张图像水平维度的像素数个数(宽)
在这里插入图片描述

11,Model Zoo

调用别人训练好的网络架构以及权重参数,最终通过一行代码就可以搞定。
方便懒人进行调用,Pytorch中成为hub模块
Github上相关链接
pytorch官网API链接

例如,打开pytorch官网中的随便一个项目,复制粘贴即可运行,下载相关权重参数文件的时候需要科学上网。

二、autograd自动求导机制

案例一:反向传播求导,函数表达式为y = w*x*x + b*x + c其中w=2,x=3,b=5,c=4
在这里插入图片描述

import torch
w = torch.tensor(2, dtype = torch.float32, requires_grad = True)
x = torch.tensor(3, dtype = torch.float32, requires_grad = True)
b = torch.tensor(5, dtype = torch.float32, requires_grad = True)
c = torch.tensor(4, dtype = torch.float32, requires_grad = True)
w,x,b,c
"""
(tensor(2., requires_grad=True),
 tensor(3., requires_grad=True),
 tensor(5., requires_grad=True),
 tensor(4., requires_grad=True))
"""

y = w * x**2 + b * x + c
y
"""
tensor(37., grad_fn=<AddBackward0>)
"""

y.backward() #反向传播

w.grad
"""
tensor(9.)
"""
x.grad
"""
tensor(17.)
"""
b.grad
"""
tensor(3.)
"""
c.grad
"""
tensor(1.)
"""

三、最基础的模型训练完整步骤演示

需求:监督学习,训练模型符合y = 2*x + 5

import torch
import numpy as np

1,标签数据准备

① x样本

Ⅰ、0-9,10个数

这里为了简单起见,x样本为0-9,10个数,用列表存储

x = [i for i in range(10)]
x # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Ⅱ、转换成array格式方便操作

x_arr = np.array(x,dtype=np.float32)
x_arr # array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)

Ⅲ、转换成一列数据,方便后续操作

x_train = x_arr.reshape(-1,1)
x_train
"""
array([[0.],
       [1.],
       [2.],
       [3.],
       [4.],
       [5.],
       [6.],
       [7.],
       [8.],
       [9.]], dtype=float32)
"""

x_train.shape # (10, 1)

② y样本

Ⅰ、通过函数y=2*x+5生成对应的结果y

y = [2*x+5 for x in range(10)]
y # [5, 7, 9, 11, 13, 15, 17, 19, 21, 23]

Ⅱ、转换成array格式方便操作

y_arr = np.array(y,dtype=np.float32)
y_arr # array([ 5.,  7.,  9., 11., 13., 15., 17., 19., 21., 23.], dtype=float32)

Ⅲ、转换成一列数据,方便后续操作

y_train = y_arr.reshape(-1,1)
y_train
"""
array([[ 5.],
       [ 7.],
       [ 9.],
       [11.],
       [13.],
       [15.],
       [17.],
       [19.],
       [21.],
       [23.]], dtype=float32)
"""

y_train.shape # (10, 1)

2,设计模型

这里使用一个最简单的两层线性层进行搭建模型,训练的数据都是单一一个
第一层输入维度为1,输出维度为2
第二层输入维度是2,输出维度是1

class Linear_yy(torch.nn.Module):
    def __init__(self,in_dim,media_dim,out_dim):
        super(Linear_yy,self).__init__()
        self.linear_1 = torch.nn.Linear(in_dim,media_dim)
        self.linear_2 = torch.nn.Linear(media_dim,out_dim)
        
    def forward(self,x):
        x = self.linear_1(x)
        x = self.linear_2(x)
        return x
in_dim = 1
media_dim = 2
out_dim = 1

model = Linear_yy(in_dim=in_dim,media_dim=media_dim,out_dim=out_dim)
model
"""
Linear_yy(
  (linear_1): Linear(in_features=1, out_features=2, bias=True)
  (linear_2): Linear(in_features=2, out_features=1, bias=True)
)
"""

3,指定epoch、学习率、优化器、损失函数等参数

epochs = 1000 #epoch
learning_rate = 0.0001 # 学习率
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate) # 优化器选择Adam
loss_faction = torch.nn.MSELoss() # 损失函数选择MSE

4,训练模型

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 = loss_faction(outputs, labels)

    # 返向传播
    loss.backward()

    # 更新权重参数
    optimizer.step()
    if epoch % 50 == 0: # 每50次输出一次损失值
        print('epoch {}, loss {}'.format(epoch, loss.item()))

5,模型预测

predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
predicted
"""
array([[0.6956282 ],
       [0.75930536],
       [0.82298255],
       [0.88665974],
       [0.9503369 ],
       [1.014014  ],
       [1.0776913 ],
       [1.1413685 ],
       [1.2050457 ],
       [1.2687228 ]], dtype=float32)
"""

6,模型权重保存

torch.save(model.state_dict(), 'model.pth')

在这里插入图片描述

7,模型权重加载

模型权重加载一般用于模型训练中断,需要使用上次的权重参数接着训练,此时就需要先保存模型,然后再加载权重参数即可

model.load_state_dict(torch.load('model.pth'))

8,完整代码(CPU)

当然,这只是训练模型的完整代码,最后的测试和保存模型权重,参考5,6,7即可

import torch
import torch.nn as nn
import numpy as np

class Linear_yy(torch.nn.Module):
    def __init__(self,in_dim,media_dim,out_dim):
        super(Linear_yy,self).__init__()
        self.linear_1 = torch.nn.Linear(in_dim,media_dim)
        self.linear_2 = torch.nn.Linear(media_dim,out_dim)
        
    def forward(self,x):
        x = self.linear_1(x)
        x = self.linear_2(x)
        return x
    
in_dim = 1
media_dim = 2
out_dim = 1

model = Linear_yy(in_dim=in_dim,media_dim=media_dim,out_dim=out_dim)

epochs = 1000
learning_rate = 0.0001
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)
loss_faction = torch.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 = loss_faction(outputs, labels)

    # 返向传播
    loss.backward()

    # 更新权重参数
    optimizer.step()
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))

9,完整代码(GPU)

使用GPU训练只需要把训练数据模型放入GPU中即可

指定是否使用GPU训练模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

模型放入GPU中
model.to(device)

数据放入GPU中
inputs = torch.from_numpy(x_train).to(device)
labels = torch.from_numpy(y_train).to(device)

import torch
import torch.nn as nn
import numpy as np

class Linear_yy(torch.nn.Module):
    def __init__(self,in_dim,media_dim,out_dim):
        super(Linear_yy,self).__init__()
        self.linear_1 = torch.nn.Linear(in_dim,media_dim)
        self.linear_2 = torch.nn.Linear(media_dim,out_dim)
        
    def forward(self,x):
        x = self.linear_1(x)
        x = self.linear_2(x)
        return x
    
in_dim = 1
media_dim = 2
out_dim = 1

model = Linear_yy(in_dim=in_dim,media_dim=media_dim,out_dim=out_dim)

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

epochs = 1000
learning_rate = 0.0001
optimizer = torch.optim.Adam(model.parameters(),lr=learning_rate)
loss_faction = torch.nn.MSELoss()

for epoch in range(epochs):
    epoch += 1
    # 注意转行成tensor
    inputs = torch.from_numpy(x_train).to(device)
    labels = torch.from_numpy(y_train).to(device)
    
    # 梯度要清零每一次迭代
    optimizer.zero_grad() 

    # 前向传播
    outputs = model(inputs)

    # 计算损失
    loss = loss_faction(outputs, labels)

    # 返向传播
    loss.backward()

    # 更新权重参数
    optimizer.step()
    if epoch % 50 == 0:
        print('epoch {}, loss {}'.format(epoch, loss.item()))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AST使用(二)

//在此之前&#xff0c;先了解下path和node/*path指的是路径 其常用的方法当前路径所对应的源代码 : path.toString判断path是什么type&#xff0c;使用path.isXXX 这个方法 : if(path.isStringLiteral()){}获取path的上一级路径 : let parent path.parentPath;获取path的子…

ARM基础(3):MPU内存保护单元详解及例子

MPU(Memory Protection Unit)是ARM处理器中的一个特性&#xff0c;它提供了内存保护和访问控制的功能&#xff0c;通常用于实现操作系统的内存隔离和保护。比如我们可以设置所有的RAM为不可执行&#xff0c;这样就可以避免代码注入攻击。最近做项目过程中&#xff0c;使用的几个…

中空百叶玻璃隔断怎么组装

以下是中空百叶玻璃隔断的组装步骤&#xff1a; 1. 准备材料&#xff1a;中空百叶玻璃、接头、U型槽、挂件、固定螺钉等。 2. 根据实际需要&#xff0c;将中空百叶玻璃按照尺寸进行切割。 3. 在地面上铺上一张软垫&#xff0c;将切好的玻璃放置在垫子上&#xff0c;然后在两侧标…

管理类联考——逻辑——真题篇——阅读新题型真题

阅读新题型真题 Part B-2010- Part B Directions: Read the following text and decide whether each of the statements is true or false. Choose T if the statement is true or F if the statement is not true. Mark your answers on ANSWER SHEET. (10 points) Copying…

之江实验室: 如何基于 JuiceFS 为超异构算力集群构建存储层 ?

今天&#xff0c;高性能计算结合人工智能技术正在推动科研创新。例如通过破解水稻基因密码推动作物育种从“试验选优”向“计算选优”发展&#xff0c;在医药领域快速分析分子与蛋白之间的相互作用&#xff0c;发现潜在的能够有效干预疾病发生的药物分子。 之江实验室就是上述科…

大学生实习周记总结

大学生实习周记总结1 经过两个月的实习&#xff0c;我收获了很多&#xff0c;也懂得了许多&#xff0c;同时也成熟了不少。下面我将把我两个月的实习生活分成五个部分进行总结&#xff1a;教学经验、班主任工作、做事态度、学生友谊、感恩的心。 教学经验&#xff1a;如何上好一…

4.4网络模型 4.5协议 4.6网络通信的过程

4.4网络模型 OSI七层参考模型 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;参考模型&#xff0c;即开放式系统互联。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;…

【三维视觉】空间点集的最小包围盒计算

0 问题描述 假设有一个空间点集&#xff0c;不重合的点数有N个。 N1时&#xff0c;最小包围盒是一个点&#xff1a;中心为其本身&#xff0c;半径无穷小 N2时&#xff0c;最小包围盒是一个圆&#xff1a;中心为连线中点&#xff0c;半径为边长一半 N3时&#xff0c;不共线的三…

番茄工作法图解——简单易行的时间管理方法

ISBN: 978-7-115-24669-1 作者&#xff1a;【瑞典】诺特伯格&#xff08;Staffan Noteberg&#xff09; 页数&#xff1a;136页 阅读时间&#xff1a;2023-06-10 推荐指数&#xff1a;★★★★★ 番茄工作法&#xff08;意大利语&#xff1a;Pomodoro Technique&#xff09;是一…

如何选择到最合适的DDoS缓解服务?

DDoS缓解服务提供商的数量可能很多&#xff0c;但只有一些提供商提供高效服务的所有必要功能&#xff0c;因此如果要选择正确的 DDoS保护解决方案&#xff0c;必须考虑以下因素&#xff1a; 1.缩小风险范围 选择DDoS缓解服务的第一步&#xff0c;确定您组织的特定需求&#…

使用SQL语句创建存储过程

前言: 本篇文章是记录学校学习SQL server中知识,可用于复习资料. 目录 前言:一、存储过程的创建1、创建简单存储过程2、创建带参数的存储过程3、创建带输出参数的存储过程 二 、使用T一SQL语句管理和维护存储过程2.1 使用sp_helptext查看存储过程student_sc的定义脚本2.2 使用…

AI 绘画(1):生成一个图片的标准流程

文章目录 文章回顾感谢人员生成一个图片的标准流程前期准备&#xff0c;以文生图为例去C站下载你需要的绘画模型导入参数导入生成结果&#xff1f;可能是BUG事后处理 图生图如何高度贴合原图火柴人转角色 涂鸦局部重绘 Ai绘画公约 文章回顾 AI 绘画&#xff08;0&#xff09;&…

在Django项目中的各个应用中分别编写路由配置文件urls.py

目录 01-通过命令建立三个应用02-配置路由 /index/、/app1/index/、/app2/index/02-1-配置路由 /index/ 并将各个应用的urls.py文件包含进主路由目录中02-02-配置路由/app1/index/02-03-配置路由/app2/index/ 03-编写各个应用的视图views.py 文件04-注册模板文件所在目录05 创建…

一文吃透低代码平台的衍生历程、优势及未来趋势

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台&#xff0c;通过可视化进行应用程序开发的方法&#xff0c;让不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

【统计模型】缺失数据处理方法

目录 一、缺失数据定义 二、缺失数据原因 三、缺失数据处理步骤 四、数据缺失机制 1.完全随机缺失&#xff08;MCAR&#xff09; 2.随机缺失&#xff08;MAR&#xff09; 3.非随机、不可忽略缺失&#xff08;NMAR&#xff09; 五、缺失数据处理方法 1.直接删除 2.缺失值…

从零开始理解Linux中断架构(2)-朴素的中断管理设计理念

既然是从零开始,我们先从最为简单的中断逻辑处理架构开始,这个逻辑结构跟CPU架构没有关系,纯逻辑上的。纯逻辑是跨越系统和应用的,不管对于应用程序员还是系统程序员,逻辑推导是基本的工具,设计原型是基本的出发点。 中断发起的时候,PC指针被设置为中断向量表中相对应的…

SpringBoot 中使用 JWT 案例分享详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Qt6.5.1+WebRTC学习笔记(十二)环境搭建流媒体服务器(ubuntu22.04+SRS)

前言 若只是实现一对一通信&#xff0c;仅使用webrtc就足够了。但有时间需要进行多个人的直播会议&#xff0c;当人比较多时&#xff0c;建议使用一个流媒体服务器&#xff0c;笔者使用的是SRS。 这个开源项目资料比较全&#xff0c;笔者仅在此记录下搭建过程 一、准备 1.操…

这些方法可以手写扫描识别

小伙伴们知道有一项技术是可以将我们手写的东西识别出来吗&#xff1f;这一项创新的技术就是手写识别功能&#xff0c;它能够将手写内容快速转换为数字或文本格式&#xff0c;并提高信息处理和管理的效率。而且相比传统的手工记录方式&#xff0c;手写识别功能具有较高的准确性…

多行文本溢出显示省略号

1.css 实现单行省略 .ellipsis{white-space: nowrap;text-overflow: ellipsis; overflow: hidden;}2.在WebKit浏览器或移动端&#xff08;绝大部分是WebKit内核的浏览器&#xff09;的页面&#xff0c;直接使用WebKit的CSS扩展属性(WebKit是私有属性)-webkit-line-clamp 。 -w…