pytorch教程

文章目录

  • 1 pytorch的安装
  • 2 PyTorch基础知识
    • 2.1 张量简介
    • 2.2 初始化
    • 2.3 张量的属性
    • 2.4 ndarray与tensor互转
    • 2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置
  • 3 pytorch自动微分
  • 4 线性回归
  • 5 分类
    • 5.1 写法一
    • 5.2 写法二

1 pytorch的安装

  • pytorch官网
    https://pytorch.org/get-started/locally/
  • 个人学习因此,选择CPU安装。
    在这里插入图片描述
  • 使用国内阿里云镜像安装
库名作用
torchvision图像视频处理
torchaudio音频处理
torchtext自然语言处理
pip install -i https://mirrors.aliyun.com/pypi/simple/ torch torchvision torchaudio torchtext
  • 出现以下界面说明安装成功
    在这里插入图片描述
  • 验证是否安装成功
    在这里插入图片描述

2 PyTorch基础知识

2.1 张量简介

  • 分类:0维张量(标量)、1维张量(向量)、2维张量(矩阵)、3维张量(时间序列)、4维张量(图像)、5维张量(视频)
  • 概念:一个数据容器,可以包含数据、字符串等
  • 常见的构造Tensor的函数
函数功能
Tensor(*sizes)基础构造函数
tensor(data)类似于np.array
ones(*sizes)全1
zeros(*sizes)全0
eye(*sizes)对角为1,其余为0
arange(s,e,step)从s到e,步长为step
linspace(s,e,steps)从s到e,均匀分成step份
rand/randn(*sizes)rand是[0,1)均匀分布;randn是服从N(0,1)的正态分布
normal(mean,std)正态分布(均值为mean,标准差是std)
randperm(m)随机排列
  • Tensor的运算
函数作用
torch.abs(A)绝对值
torch.add(A,B)相加,A和B既可以是Tensor也可以是标量
torch.clamp(A,max,min)裁剪,A中的数据若小于min或大于max,则变成min或max,即保证范围在[min,max]
torch.div(A,B)相除,A%B,A和B既可以是Tensor也可以是标量
torch.mul(A,B)点乘,A*B,A和B既可以是Tensor也可以是标量
torch.pow(A,n)求幂,A的n次方
torch.mm(A,B.T)矩阵叉乘,注意与torch.mul之间的区别
torch.mv(A,B)矩阵与向量相乘,A是矩阵,B是向量,这里的B需不需要转置都是可以的
A.item()将Tensor转化为基本数据类型,注意Tensor中只有一个元素的时候才可以使用,一般用于在Tensor中取出数值
A.numpy()将Tensor转化为Numpy类型
A.size()查看尺寸
A.shape查看尺寸
A.dtype查看数据类型
A.view()重构张量尺寸,类似于Numpy中的reshape
A.transpose(0,1)行列交换
A[1:]A[-1,-1]=100切面,类似Numpy中的切面
A.zero_()归零化
torch.stack((A,B),sim=-1)拼接,升维
torch.diag(A)取A对角线元素形成一个一维向量
torch.diag_embed(A)将一维向量放到对角线中,其余数值为0的Tensor

2.2 初始化

  • 张量可以直接从数据中创建。数据类型是自动推断的
import torch# 直接从数据创建张量
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
print(f"Tensor from Data:\n {x_data} \n")
  • 从 NumPy 数组创建
import numpy as np# 从numpy创建张量
data = [[1, 2], [3, 4]]
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
print(f"Tensor from Numpy:\n {x_np} \n")
  • 根据另一个张量创建
import torch# 根据另一个张量创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)x_ones = torch.ones_like(x_data)  # 保留原有张量的形状和数据类型
print(f"Ones Tensor: \n {x_ones} \n")x_rand = torch.rand_like(x_data, dtype=torch.float)  # 显式更改张量的数据类型
  • 使用随机或恒定值创建.
import torchshape = (2, 3,)  # 创建2行3列的张量
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

2.3 张量的属性

  • 张量属性包括形状、数据类型和存储设备等
import torchtensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

2.4 ndarray与tensor互转

import numpy as np
import torchprint(np.__version__)
print(torch.__version__)print("tensor转ndarray")
a = torch.ones(5)
print(type(a))
b = a.numpy()
print(type(b))print("ndarray转tensor")
a1 = np.ones(5)
print(type(a1))
b2 = torch.from_numpy(a1)
print(type(b2))

2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置

import torch
import numpy as np# 随机生成0-10的形状为4行5列的tensor
t = torch.randint(0, 10, (4, 5))
print(t)# 查看形状
print(t.shape)# 一 索引和切片
# 取第0行0列的数据
print(t[0, 0])# 取第0行的数据
print(t[0])# 取中间两行的数据
print(t[1:3])# 取中间两列的数据
print(t[:, 1:3])# 取中间两行和两列的数据
print(t[1:3, 1:3])# 增加维度 变为 (4,5,1)
# 方法一
print(t.reshape(4, 5, 1))
# 方法二 None表示占个位置
print(t[:, :, None])
# 方法三 ...代表前面所有维度,None代表最后一个维度
print(t[..., None])
# 方法四 在中间插一个维度 (4,1,5)
print(t[:, None, :])# 去除空白的维度
print(t.reshape(4, 5, 1).squeeze())
print(t[:, None, :].squeeze())# 拉伸维度
print(t.unsqueeze(dim=0).shape)tensor = torch.tensor([[1], [2], [3]])
print(tensor.expand(3, 4))# 模拟卷积神经网络只取宽度和高度
# 32个通道,224宽,224高,3个卷积核(batch_size,W,H,C)
# numpy操作
n = np.random.random((32, 224, 224, 3))
print(n[0, :, :, 0].shape)
# torch操作
t = torch.tensor(n)
print(t.shape)
print(t[0, :, :, 0].shape)# 二、变形 reshape和view
t = torch.randint(0, 10, (4, 5))
print(t)
# print(t.reshape(5,4))
# print(t.view(5,4))# 三、聚合
# pytorch聚合的时候不指定维度和numpy表现是一样的,回把所有的维度聚合成一个数字
print(t.sum())
# dim(dimension)指定维度
# 行相加
print(t.sum(dim=0))
# 保持聚合掉的维度继续存在
print(t.sum(dim=0,keepdim=True))
# 列相加
print(t.sum(dim=1))
# 保持聚合掉的维度继续存在
print(t.sum(dim=1,keepdim=True))
# 聚合函数 max,min,mean,median,sum,argmin(最小值索引),argmax(最大值索引),std(标准偏差)
# 第一个维度最大值得索引(每列的最大值的索引)
print(t.argmax(dim=0))
# 第二个维度最大值得索引(每行的最大值的索引)
print(t.argmax(dim=1))# 四、矩阵的拼接
t1 = torch.randint(0,10,size=(4,5))
t2 = torch.randint(0,10,size=(4,5))
print(t1)
print(t2)
# pytorch也有dot,但是,仅限于向量(一维)之间的运算。(numpy中不限于一维)
# 一维向量的点乘
# t1[0,0]*t2[0,0] + t1[0,1]*t2[0,1] + t1[0,2]*t2[0,2] + t1[0,3]*t2[0,3] + t1[0,4]*t2[0,4]
print(t1[0].dot(t2[0]))
# 默认也是按照dim=0,增加了行数
print(torch.concat((t1,t2)))
# 同样增加行数
print(torch.vstack((t1,t2)))
# 增加列
print(torch.concat((t1,t2),dim=1))
# 同样增加列数
print(torch.hstack((t1,t2)))# 五、切割
print("--------------切割----------------")
t = torch.randint(0,10,size=(4,5))
print(t)
# 1+2+1=4,必须等于维度
print(t.split([1,2,1]))# 六、转置
# 0维度和1维度互换
print(torch.permute(t,[1,0]).shape)
print(t.transpose(1,0).shape)

3 pytorch自动微分

  • 自动微分其实就是求导
import torch# requires_grad=True 表示对x求导
x = torch.ones(1, 1, requires_grad=True)# 写一个计算公式,倒数是2
y = 2 * x + 2# 反向传播求导
y.backward()# 这里也是2
print(x.grad)

4 线性回归

from torch import nn, optim, tensor# y = 2*x + 1
X = tensor([[1.0], [2.0], [3.0], [4.0]])
Y = tensor([[3.0], [5.0], [7.0], [9.0]])# 训练模型(线性),可以获得预测结果。
model = nn.Linear(1, 1)# 定义损失函数(均方误差损失(Mean Square Error Loss)),传入实际值和预测值,就可以获得损失函数。
# 这是常用于回归问题的损失函数
loss_fn = nn.MSELoss()# 需要更新的参数-这里是一个生成器,可以节约内存
# model.parameters()# 优化器(训练器) lr是学习率,可以梯度清零和更新参数。
optimizer = optim.SGD(model.parameters(), 0.001)# 训练
for epoch in range(1000):for x, y in zip(X, Y):# 获得预测结果y_pred = model(x)# 获得损失函数,使用损失函数做反向传播loss = loss_fn(y, y_pred)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()# w的值
weight = model.weight
print(weight)
# b的值
bias = model.bias
print(bias)

5 分类

5.1 写法一

import torch
from torch import nn,float# 1代表基数 2代表偶数
data = [[1, 3, 5, 7, 9, 1],[2, 4, 6, 8, 10, 0],[11, 13, 15, 17, 19, 1],[12, 14, 16, 18, 20, 0],[21, 23, 25, 27, 29, 1],[22, 24, 26, 28, 30, 0],[31, 33, 35, 37, 39, 1],[32, 34, 36, 38, 40, 0],[41, 43, 45, 47, 49, 1],[42, 44, 46, 48, 50, 0], ]
t_data = torch.tensor(data,dtype=float)# 行都要,列不要最后一行
X = t_data[:, :-1]
print(type(X))
print(X)
# 行都要,列只要最后一样
Y = t_data[:, -1]
Y = Y.reshape(-1, 1)
print(type(X))
print(Y)# 查看特征数,也就是有多少列
print(X.shape)# 建一个两层的模型
model = nn.Sequential(# 输入是5个特征(X的列数),输出50个神经元nn.Linear(5, 50),# 输如的神经元数就是上一层的输出50个,输出就是Y的列数nn.Linear(50, 1),# 激活函数(分类),将这个输出转化为一个在0和1之间的值。这个值可以看作是模型对输入数据的预测结果。nn.Sigmoid()
)state_dict = model.state_dict()
print(state_dict)# 二分类交叉熵(适用于二分类问题的一种损失函数)
loss_fn = nn.BCELoss()# 优化器-梯度下降的优化算法,传入模型的参数为权重(w)和偏执(b),学习率为0.001
optim_sgd = torch.optim.SGD(model.parameters(), 0.001)# 正常神经网络是一批一批跑的
batch_size = 2
# 整除 根据批次大小计算步长,一共10行数据,每次跑两行,正好步长是5
steps = 10 // 2# 开始训练
# 训练100次
for epoch in range(100):# 防止数据量过大,按照步长跑,把大数据切成一段一段的跑。for batch in range(steps):# 每一批的起始位置start = batch * batch_sizeend = start + batch_sizex = X[start:end]y = Y[start:end]# 拿到预测结果y_pred = model(x)# 获取损失函数loss = loss_fn(y_pred, y)# 梯度清零optim_sgd.zero_grad()# 反向传播loss.backward()# 更新optim_sgd.step()# 查看权重
print(model.state_dict())# 计算准确率
# >=0.5 就是正样本
acc_rate = ((model(X).data.numpy() >= 0.5) == Y.numpy()).mean()

5.2 写法二

import torch
from torch import nn, float
import numpy as np# 1代表基数 2代表偶数
data = [[1, 1],[2, 0],[11, 1],[12, 0],[21, 1],[22, 0],[31, 1],[32, 0],[41, 1],[42, 0], ]
t_data = torch.tensor(data, dtype=float)# 行都要,列不要最后一行
X = t_data[:, :-1]# 行都要,列只要最后一样
Y = t_data[:, -1]
Y = Y.reshape(-1, 1)# 查看特征数,也就是有多少列
print(X.shape)class DemoModl(nn.Module):def __init__(self):super().__init__()# 定义网络中会用到的东西# 输入是5个特征(X的列数),输出50个神经元self.lin_1 = nn.Linear(1, 50)# 输如的神经元数就是上一层的输出50个,输出就是Y的列数self.lin_2 = nn.Linear(50, 1)# 激活函数(分类),将这个输出转化为一个在0和1之间的值。这个值可以看作是模型对输入数据的预测结果。self.sigmod = nn.Sigmoid()# 拐弯函数self.activate = nn.ReLU()def forward(self, input):# forward中写前向传播x = self.lin_1(input)x = self.activate(x)x = self.lin_2(x)x = self.sigmod(x)return x# 学习率
lr = 0.001# 获取模型函数
def get_model():model = DemoModl()# 返回模型和优化器return model, torch.optim.Adam(model.parameters(),lr=lr)# 损失函数
loss_fn = nn.BCELoss()# 获取模型和优化器
model,opt = get_model()
# 超参数初始化
batch_size = 2
steps = 10 // 2# 训练100次
for epoch in range(1000):# 防止数据量过大,按照步长跑,把大数据切成一段一段的跑。for batch in range(steps):# 每一批的起始位置start = batch * batch_sizeend = start + batch_sizex = X[start:end]y = Y[start:end]# 拿到预测结果y_pred = model(x)# 获取损失函数loss = loss_fn(y_pred, y)# 梯度清零opt.zero_grad()# 反向传播loss.backward()# 更新opt.step()print('loss=========',loss_fn(model(X),Y))acc_rate = ((model(X).data.numpy() >= 0.5) == Y.numpy()).mean()
print(acc_rate)print(np.unique(model(X).data.numpy()))
  • 参考
    https://www.bilibili.com/video/BV1hs4y1B7vb/?p=43&spm_id_from=333.880.my_history.page.click&vd_source=c15794e732e28886fefab201ec9c6253

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

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

相关文章

【C++程序员必修第一课】C++基础课程-12:std::array 固定数组

1 本课主要内容&#xff1a; std::array 固定数组的声明基本使用&#xff1a;赋值、访问数组、遍历等 2 主要知识点&#xff1a; std::array 固定数组的声明 #include <array>// std::array 固定数组例子 std::array<int, 5> array1; // 未…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述&#xff1a; 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能&#xff0c;支持5G终端的产线高速校准及终端发射机…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的&#xff0c;在设计的时候&#xff0c;只要能做到比较好的抽象&#xff0c;这两部的实现…

Linux高性能服务器编程——ch5笔记

第5章 Linux网络编程基础API 5.1 socket地址API 主机字节序&#xff08;小端字节序&#xff09;&#xff1a;整数的高位字节存储在内存的高地址处&#xff0c;而低位字节则存储在内存的低地址处。 网络字节序&#xff08;大端字节序&#xff09;&#xff1a;相反。 void byt…

全光谱护眼灯有哪些?2023全光谱护眼台灯推荐

随着电子设备的不断普及&#xff0c;手机、平板电脑、显示器、电视机等几乎是家家户户的必备品&#xff0c;也正因为眼睛有那么多时间、那么多机会去盯着屏幕&#xff0c;所以如今近视低龄化现象也越来越严重了。随着科技的不断发展&#xff0c;台灯的发展也越来越多样化&#…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

关于yield你只需要知道这2点

1.yield是放在函数里面的&#xff0c;且带有yield的函数就叫做生成器&#xff0c;这时函数就成了一个对象&#xff0c;而不能把它作为函数来对待 def foo(num):print("introduction:")while:if num < 10:num 1yield num g foo()看上面的代码&#xff0c;我们把…

Python 基础问题

文章目录 python 中有哪些类型或数据结构什么是有序和无序什么是可变和不可变字典中&#xff0c;什么类型可以当做key去使用闭包是什么装饰器是什么 python 中有哪些类型或数据结构 在 Python 中&#xff0c;有多种类型和数据结构可用于存储和组织数据。以下是一些常见的类型和…

golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)

logrus 介绍一个golang 日志框架logrus 支持文本与JSON数据格式支持结构化记录支持hook 文档介绍 logrus文档 std 官方案例介绍了如何配置std打印 package mainimport ("os"log "github.com/sirupsen/logrus" )func init() {// Log as JSON instead…

Unoconv入门介绍和问题汇总

简介&#xff1a;Unoconv是一款基于LibreOffice/ Openoffice开发的命令行工具&#xff0c;可以将不同格式的文件&#xff08;如DOC、PPT、PDF等&#xff09;在不同的操作系统上通过Libreoffice/Openoffice转换为PDF、ODT、DOC、PNG、PPTX等格式&#xff0c;并支持在命令行中指定…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组&#xff08;类似于sql group by以后的数据&#xff09;metric&#xff1a;对bucket执行的某种聚合分析的操作&#xff0c;比如说求平均值&#xff0c;最大值&#xff0c;最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…

【lesson13】进程控制初识

文章目录 进程创建 进程创建 请你描述一下&#xff0c;fork创建子进程操作系统都做了什么&#xff1f; fork创建子进程&#xff0c;系统里多了一个进程&#xff0c;进程 内核数据结构 进程代码数据&#xff0c;内核数据结构由OS维护&#xff0c;进程代码数据一般由磁盘维护。…

位运算相关笔记

位运算 Part 1&#xff1a;基础 左移&#xff1a;左移一位&#xff0c;相当于某数乘以 2 2 2。左移 x x x位,相当于该数乘以 2 x 2^x 2x。 右移&#xff1a;右移一位&#xff0c;相当于某数除以 2 2 2。右移 x x x位&#xff0c;相当于该数除以 2 x 2^x 2x。 与运算&…

【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds

【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds math numbers Instructions Write a function that takes an integer minutes and converts it to seconds. Examples convert(5) // 300 convert(3) // 180 convert(2) // 120Notes Don’t forge…

markdown语法(更新中)

a ⃗ \vec{a} a 向量 a ‾ \overline{a} a 平均值 a ‾ \underline{a} a​下横线 a ^ \widehat{a} a (线性回归&#xff0c;直线方程) y尖 a ~ \widetilde{a} a 颚化符号 等价无穷小 a ˙ \dot{a} a˙ 一阶导数 a \ddot{a} a 二阶导数 $\vec{a}$ 向量 $\overline{a}$ …

【三维重建】DreamGaussian:高斯splatting的单视图3D内容生成(原理+代码)

文章目录 摘要一、前言二、相关工作2.1 3D表示2.2 Text-to-3D2.3 Image-to-3D 三、本文方法3.1生成式 高斯 splitting3.2 高效的 mesh 提取3.3 UV空间的纹理优化 四. 实验4.1实施细节4.2 定性比较4.3 定量比较4.4 消融实验 总结&#xff08;特点、局限性&#xff09; 五、安装与…

【框架源码篇 01】Spring源码-手写IOC

Spring源码手写篇-手写IoC 一、IoC分析 1.Spring的核心 在Spring中非常核心的内容是 IOC和 AOP. 2.IoC的几个疑问? 2.1 IoC是什么&#xff1f; IoC:Inversion of Control 控制反转&#xff0c;简单理解就是&#xff1a;依赖对象的获得被反转了。 2.2 IoC有什么好处? IoC带…

[ROS2系列] ORBBEC(奥比中光)AstraPro相机在ROS2进行rtabmap 3D建图

目录 背景&#xff1a; 一、驱动AstraPro摄像头 二、安装rtabmap error1&#xff1a;缺包 三、尝试 四、参数讲解 五、运行 error2: Did not receive data since 5 seconds! 六、效果​编辑 error4: 背景&#xff1a; 1、设备&#xff1a;pc&#xff1b;jeston agx …

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片&#xff0c;输出方式&#xff0c;无外乎两种&#xff0c;即dac输出&#xff0c;或者PWM输出 其中dac的输出&#xff0c;一般应用场景都是外挂功放芯片&#xff0c;实现声音的放大&#xff0c;比如常用的音箱…