【入门深度学习】Pytorch基础知识(一)

目录

1、Tensor基本定义

2、Tensor属性

3、Tensor算术运算

4、Tensor其他常用运算及函数


1、Tensor基本定义

"tensor"(张量)是基于标量、向量、矩阵更加泛化的概念,是一种表示和处理多维数据的数据结构。例如,张量可以具有不同的阶(也称为维度或轴数):

  • 0阶张量:标量,即单个数值。
  • 1阶张量:向量,表示一维数组。
  • 2阶张量:矩阵,表示二维数组。
  • 以此类推,3阶张量表示三维数组,4阶张量表示四维数组,以此类推。

Tensor常用函数及功能如下:

编程示例:

import torch

# 创建张量
a = torch.Tensor([[1,2],[3,4]])
print(a)
print(a.type())

# 指定shape
a = torch.Tensor(2,3) # 随机的值
print(a)
print(a.type())

# 定义特殊的Tensor
a = torch.ones(2,2)  # 全1
print(a)
print(a.type())

a = torch.eye(2,2) # 对角线为1
print(a)
print(a.type())

a = torch.zeros(2,2) #全0
print(a)
print(a.type())

# 随机
a = torch.rand(2,2)
print(a)
print(a.type())

# 正态分布
a = torch.normal(mean=0.0,std=torch.rand(5)) # mean=0.0代表float类型,5代表生成5组
print(a)
print(a.type())

# 均匀分布
a = torch.Tensor(2,2).uniform_(-1,1)
print(a)
print(a.type())

# 序列
a = torch.arange(0,11,3) # 输出0-10,等长为3
print(a)
print(a.type())

# 等差数列
a = torch.linspace(2,11,3) # 拿到等间隔的n个数字
print(a)
print(a.type())

2、Tensor属性

每一个Tensor有torch.dtype、torch.device、torch.layout三种属性。torch.device标识了torch.Tensor对象在创建之后所存储在的设备名称,包括CPU/GPU(cuda0,1,2)。torch.layout标识torch.Tensor内存布局的对象。

编程示例:

import torch

dev = torch.device("cpu") # 将tensor放在cpu上进行计算(默认)
dev = torch.device("cuda") # 将tensor放在cuda上进行计算

a = torch.tensor([2,2],dtype=torch.float32,   # 定义tensor类型
                 device=dev)
print(a)

# 定义稀疏张量(默认稠密张量)
i = torch.tensor([[0,1,2],[0,1,2]]) # 传入非零元素坐标
v = torch.tensor([1,2,3]) # 具体的值
a = torch.sparse_coo_tensor(i, v, (4,4)) # size=4x4
print(a)

a = torch.sparse_coo_tensor(i, v, (4,4)).to_dense() # 转为稠密的张量
print(a)

3、Tensor算术运算

首先介绍两个概念,分别是"in-place"和广播机制。

"in-place" 操作是指在原地直接修改或转换数据结构,而不需要额外创建新的副本或数据结构。比如下面算术运算中的下划线"_"、x=x+y等。

当两个张量进行运算时,如果它们的shape、size不一致,那么通过广播机制可以将两个张量自动扩展到相同大小。广播机制需要满足的条件有:

  • 保证每个张量至少有一个维度。
  • 满足右对齐。假设数组 a的形状是 (3,),而数组 b 的形状是 (3, 1),根据右对齐的原则,数组 a 的形状会在左侧补1,变为 (1, 3),然后与数组 b 的形状 (3, 1) 匹配。

编程示例:

import torch

# 定义随机tensor
a = torch.rand(2,3)
b = torch.rand(2,3)

print(a)
print(b)

# add
print(a+b)
print(a.add(b))
print(torch.add(a,b))
print(a)
print(a.add_(b))
print(a) # a的值发生改变,a = a+b

# sub
print('==== sub res ====')
print(a - b)
print(torch.sub(a,b))
print(a.sub(b))
print(a.sub_(b))
print(a) # a = a-b

# mul
print('==== mul ====')
print(a * b)
print(torch.mul(a,b))
print(a.mul(b))
print(a.mul_(b))
print(a) # a = a*b

# div
print("==== div ====")
print(a/b)
print(torch.div(a,b))
print(a.div(b))
print(a.div_(b))
print(a)

# matmul(矩阵运算)
a = torch.ones(2,1)
b = torch.ones(1,2)

print(a @ b)
print(a.matmul(b))
print(torch.matmul(a,b))
print(torch.mm(a,b))
print(a.mm(b))

# 高维tensor运算
a = torch.ones(1,2,3,4)
b = torch.ones(1,2,4,3)  # 必须保证最后两个维度可以进行矩阵运算 3x4 4x3

print(a.matmul(b))

# 指数运算
print("==== 指数运算 ====")
a = torch.tensor([1,2])

print(torch.pow(a,3))
print(a.pow(3))
print(a**3)
print(a.pow_(3))
print(a) # a = a**3

# exp
print("==== exp ====")
a = torch.tensor([1,2],dtype=torch.float32) # exp不支持Long类型
print(a.type())

print(torch.exp(a))
print(torch.exp_(a))  # a = a^e

print(a.exp())
print(a.exp_())

# log
print("==== log ====")
a = torch.tensor([10,2],dtype=torch.float32)

print(torch.log(a)) # 以e为底
print(torch.log_(a)) # a = loge(a)
print(a.log())
print(a.log_())

# sqrt
print("==== sqrt ====")
a = torch.tensor([10,2],dtype=torch.float32)
print(torch.sqrt(a))
print(torch.sqrt_(a)) # a的值被修改
print(a.sqrt())
print(a.sqrt_())

# 取余取整
print("==== 取余取整 ====")
a = torch.rand(2,2)
a = a * 10
print(a)

print(torch.floor(a)) # 向下取整
print(torch.ceil(a)) # 向上取整
print(torch.round(a)) # 四舍五入
print(torch.trunc(a)) # 只取整数
print(torch.frac(a)) # 只取小数部分
print(a % 2) # 取余


# 广播机制
print("==== 广播机制 ====")
a = torch.rand(2, 1, 1, 3)
b = torch.rand(4, 2, 3)

# a, 2*1*1*3
# b, 4*2*3*1
# c, 2*4*2*3

c = a + b
print(a)
print(b)
print(c)
print(c.shape)

4、Tensor其他常用运算及函数

编程示例:

import torch

a = torch.rand(2,3)
b = torch.rand(2,3)

print(a)
print(b)

# 比较运算
print(torch.eq(a,b))
print(torch.equal(a,b))

# 大于等于
print(torch.ge(a,b)) # 大于等于
print(torch.gt(a,b)) # 大于
print(torch.le(a,b)) # 小于等于
print(torch.lt(a,b)) # 小于
print(torch.ne(a,b)) # 不等于

# 排序
print("==== 排序 ====")
a = torch.tensor([[1, 4, 4, 3, 5],
                  [2, 3, 1, 3, 5]])
print(a.shape)
print(torch.sort(a, dim=1,
                 descending=False)) # dim沿着哪个维度进行 ,升序/降序


# topk
print("==== topk ====")
a = torch.tensor([[2, 4, 3, 1, 5],
                  [2, 3, 5, 1, 4]])
print(a.shape)

print(torch.topk(a, k=2, dim=1, largest=False)) # 在dim=1维度上取最小的2个数
print(torch.topk(a, k=2, dim=1, largest=True))  # 在dim=1维度上取最大的2个数

print(torch.kthvalue(a, k=2, dim=0)) # 对0维上返回第2小的数 -- 4和3,最小的是3,第二小的是4
print(torch.kthvalue(a, k=2, dim=1)) # 对1维上返回第2小的数 -- [1,2,3,4,5]

# 有界无界
print("==== 有界无界判断 ====")
a = torch.rand(2, 3)
print(a)
print(a/0)
print(torch.isfinite(a)) # 是否有界
print(torch.isfinite(a/0))

print(torch.isinf(a/0)) # 是否无界
print(torch.isnan(a)) # 是否NAN

# 三角函数
a = torch.zeros(2, 3)
b = torch.cos(a) # 余弦
print(a)
print(b)

Tensor三角函数如下:

Tensor其他数学函数如下:

绝对值函数abs()不能直接求导,因此可以采用二次函数逼近,即L1 loss,在后面的文章再进行详细。符号函数sign()可以类比分段函数,当x<0,输出结果-1;当x>0,输出结果1;当x=0,输出结果0。而激活函数sigmoid()能够将数据映射到0-1之间的区间,并且数据大多数分布在0和1附近,是sign()函数连续化的呈现,经常用于二分类问题中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值