当前位置: 首页>编程语言>正文

timm库适配pytorch pytorch常用库

PyTorch学习(一)

  • 前言
  • 一、PyToch工具包
  • 二、代码测试
  • 1.张量(Tensor)初始化
  • 2.Operators张量操作
  • 3.Tensor与Numpy的转化
  • 总结

前言

Pytorch框架

  • 无缝替换NumPy,并且通过利用GPU的算力来实现神经网络的加速。
  • 通过自动微分机制,来让神经网络的实现变得更加容易。

一、PyToch工具包

torch :类似 NumPy 的张量库,强 GPU 支持 ;   
 torch.autograd :基于 tape 的自动区别库,支持 torch 之中的所有可区分张量运行;   
 torch.nn :为最大化灵活性未涉及、与 autograd 深度整合的神经网络库;   
 torch.optim:与 torch.nn 一起使用的优化包,包含 SGD、RMSProp、LBFGS、Adam 等标准优化方式;
 torch.multiprocessing: python 多进程并发,进程之间 torch Tensors 的内存共享;   
 torch.utils:数据载入器。具有训练器和其他便利功能;   
 torch.legacy(.nn/.optim) :处于向后兼容性考虑,从 Torch 移植来的 legacy 代码;

二、代码测试

1.张量(Tensor)初始化

代码如下(示例):

import torch
# Tensors(张量)的概念可以类比Numpy中的ndarrays,本质上就是一个多维数组,是任何运算和操作间数据流动的最基础形式。

# 构建一个未初始化的5*3的空矩阵(张量)
x = torch.empty(5,3)
print(type(x))  # <class 'torch.Tensor'>
print(x)

# Tensor初始化函数:torch.zeros(); torch.ones()
tensor_ones = torch.ones(2,3)
print(tensor_ones)
tensor_zeros = torch.zeros(2,3)
print(tensor_zeros)

# 可以通过dtype属性来指定tensor的数据类型
# 构建一个使用0填充的tensor,将dtype属性设置为长整型,并打印结果的数据类型
print(tensor_zeros.dtype)  # torch.float32
tensor_zeros_int = torch.zeros(2,3,dtype=torch.long)
print(tensor_zeros_int.dtype)  # torch.int64

# 随机初始化函数:torch.rand 和 torch.randn
# torch.rand用于生成服从区间[0,1)均匀分布的随机张量
x = torch.rand(5, 3)  # 5行3列
print(x)

# torch.randn用于生成服从均值为0、方差为1正太分布的随机张量
x = torch.randn(4, 4)  # 4*4
print(x)

# 直接用现有数据进行张量的初始化,例如python的列表List
x = torch.tensor([5.5, 3])
print(x)

# 可以基于已有的tensor来创建新的tensor,为了复用已有tensor的一些属性,包括shape和dtype
x = torch.tensor([5.5, 3], dtype=torch.double)
print(x.dtype)
x = x.new_ones(5, 3)      # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float)    # override dtype!
print(x)                                      # result has the same size

# new_ones函数复用了x的dtype属性,randn_like函数复用了x的shape同时通过手动指定数据类型覆盖了原有的dtype属性
x_size = x.size()
print(x_size)
row, col = x_size
print(row, col)

# torch.Size本质上是一个tuple
# torch.arange用于生成一定范围内等间隔的一维数组。参数有三个,分别是范围的起始值、范围的结束值和步长
new = torch.arange(1,10,1)
print(new)

2.Operators张量操作

代码如下(示例):

import torch
# Operations(操作)涉及很多的语法和函数
# 张量间的元素级的四则运算,加减乘除的用法

# 1.加法
x = torch.randn(5,3)
y = torch.rand(5,3)
z1 = x + y
print(z1)

# 2.add()函数
z2 = torch.add(x,y)
print(z2)

# 3.通过参数的形式进行输出tensor的保存
z3 = torch.empty(5, 3)
torch.add(x, y, out=z3)
print(z3)

# 4.通过in-place操作直接将计算结果覆盖到y上
# 在Pytorch中,我们约定凡是会覆盖函数调用主体的in-place操作,都以后缀_结束
y.add_(x)
print(y)

# 张量之间的减法、点乘和点除的用法
a =torch.randn(2,3)
print(a)
b =torch.randn(2,3)
print(b)

c =torch.sub(a, b)  # 减法
print(c)
d =torch.mul(a, b)  # 点乘
print(d)
e =torch.div(a, b)  # 点除
print(e)

# 张量和常数间的基本运算也是支持的
# torch.mul用来计算张量间的点乘,而进行矩阵乘法计算需要用到torch.mm函数
a =torch.randn(2, 3)
print(a)
b =torch.randn(3, 2)
print(b)
c =torch.mm(a, b)  # 矩阵乘法
print(c)

# torch.abs函数可以用来计算张量的绝对值
a =torch.randn(2, 3)
print(a)
b =torch.abs(a)
print(b)

# torch.pow函数用于进行求幂操作
a = torch.randn(2, 3)
print(a)
b = torch.pow(a, 2)  # 求幂
print(b)

# 在Pytorch中,我们可以使用标准的Numpy-like的索引操作
print(x[:,1])

# resize操作,对tensor进行类似resize/reshape的操作,你可以使用torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)   # 使用-1时pytorch将会自动根据其他维度进行推导
print(x.size(), y.size(), z.size())

# 如果有一个tensor,只包含一个元素,你可以使用.item()来获得它对应的Python形式的取值
x = torch.randn(1)
print(x)
print(x.size())  # torch.Size([1])
print(x.item())  # 取值
print(type(x.item()))  # <class 'float'>

# 在需要控制张量的取值范围不越界时,需要用到torch.clamp函数,它可以对输入参数按照自定义的范围进行裁剪,最后将参数裁剪的结果作为输出
# 输入参数一共有三个,分别是需要进行裁剪的Tensor变量、裁剪的下边界和裁剪的上边界
a =torch.randn(2,3)
print(a)
b =torch.clamp(a, -0.5, 0.5)
print(b)

# Tensor运算,包括转置,索引,切片,数学运算,线性代数,随机数等

3.Tensor与Numpy的转化

# 将Torch的Tensor同Numpy的ndarray进行互相转换
# 注:Torch Tensor 和 Numpy ndarray 底层是分享内存空间的,也就是说改变其中之一会同时改变另一个(前提是你是在CPU上使用Torch Tensor)
# 将Torch Tensor 转化为 Numpy Array
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)

a.add_(1)
print(a)
print(b)

# 将一个 Numpy Array 转换为 Torch Tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)


https://www.xamrdz.com/lan/5nf1962757.html

相关文章: