本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/PyTorch
在PyTorch中,创建Tensor的方法有很多种,每种方法都有其特定的使用场景,以下是一些主要的方法和它们的使用场景,以及示例代码。
从numpy数组创建:
# 创建一个 NumPy 数组
>>> a = np.array([2,3.3])
# 转换为 Tensor
>>> torch.from_numpy(a)
tensor([2.0000, 3.3000], dtype=torch.float64)
# 创建一个 NumPy 数组
>>> b = np.array([[1,2,3,4],
... [5,6,7,8]])
# 转换为 Tensor
>>> torch.from_numpy(b)
tensor([[1, 2, 3, 4],
[5, 6, 7, 8]], dtype=torch.int32)
从python的list创建:
-
torch.tensor():
因此,推荐使用torch.tensor()来从数据创建新的张量,因为它提供了更清晰、更可预测的语义。
需要注意的是,torch.tensor()总是复制输入的数据,因此新创建的张量与输入数据在内存中不是同一个对象。
# 会尝试推断数据的类型
>>> torch.tensor([2,3])
tensor([2, 3])
>>> torch.tensor([2,3]).type()
'torch.LongTensor'
>>> torch.tensor([[2,3.3],[5,6.6]])
tensor([[2.0000, 3.3000],
[5.0000, 6.6000]])
>>> torch.tensor([[2,3.3],[5,6.6]]).type()
'torch.FloatTensor'
# 输入数据也可以是ndarray
>>> torch.tensor(np.array([2,3.3]))
tensor([2.0000, 3.3000], dtype=torch.float64)
>>> torch.tensor(np.array([2,3.3])).type()
'torch.DoubleTensor'
-
torch.Tensor():
# 默认数据类型为FloatTensor
>>> torch.Tensor([2,3])
tensor([2., 3.])
>>> torch.Tensor([2,3]).type()
'torch.FloatTensor'
>>> torch.Tensor([[2,3.3],[5,6.6]])
tensor([[2.0000, 3.3000],
[5.0000, 6.6000]])
>>> torch.Tensor([[2,3.3],[5,6.6]]).type()
'torch.FloatTensor'
# 输入数据也可以是ndarray
>>> torch.Tensor(np.array([2,3.3]))
tensor([2.0000, 3.3000])
>>> torch.Tensor(np.array([2,3.3])).type()
'torch.FloatTensor'
创建未初始化的Tensor:
# empty()方法接收的是shape
>>> torch.empty(2,3)
tensor([[1.0286e-38, 9.0919e-39, 8.9082e-39],
[9.2755e-39, 8.4490e-39, 1.0194e-38]])
# Tensor()方法接收的也是shape
>>> torch.Tensor(2,3)
tensor([[1.4013e-45, 0.0000e+00, 1.4013e-45],
[0.0000e+00, 1.4013e-45, 0.0000e+00]])
将Tensor赋值为同一个元素:
# 创建一个形状为 (2, 3) 的 tensor,并填充值 7
>>> torch.full([2,3],7)
tensor([[7, 7, 7],
[7, 7, 7]])
>>> torch.full([],7)
tensor(7)
>>> torch.full([1],7)
tensor([7])
随机生成:
-
torch.rand(size): 产生[0,1] 均匀分布的数据;
-
torch.rand_like(input, dtype): 接收tensor读取shape再用rand生成;
-
torch.randint(low = 0, high, size) :随机生成整数值tensor,范围 [min,max) 左闭右开;
-
torch.randn(size) :N(0,1),即均值为0,方差为1的正态分布(N(u,std));
-
torch.normal(means,std,out = None) :返回一个张量,包含从给定参数means,std的离散正态分布中抽取随机数。均值means是一个张量,包含每个输出元素相关的正态分布的均值。std是一个张量,包含每个输出元素相关的正态分布的标准差。均值和标准差的形状不须匹配,但每个张量的元素个数须相同。
# .rand()方法随机的使用[0,1)的均值分布进行随机生成
>>> torch.rand(3,3)
tensor([[0.1379, 0.9675, 0.7739],
[0.0617, 0.1093, 0.4735],
[0.8028, 0.6730, 0.0587]])
# .rand_like()方法接收的是一个tensor,它是将tensor的shape读出来之后在未给rand()
>>> a = torch.rand(3,3)
>>> torch.rand_like(a)
tensor([[0.8711, 0.6817, 0.4961],
[0.7291, 0.2573, 0.6875],
[0.2378, 0.4857, 0.0768]])
# .randint(min,max,shape)方法使用自定义的数据空间,其中取值范围为[min,max),shape接收的是一个列表
>>> torch.randint(1,10,[3,3])
tensor([[8, 7, 3],
[7, 7, 5],
[1, 4, 2]])
# .randn()为N(0,1),即均值为0,方差为1
>>> torch.randn(3,3)
tensor([[-1.1194, -0.7181, 0.7337],
[ 0.1946, -0.8891, -0.0226],
[-0.0397, 0.5664, -0.1898]])
# .normal(u,std)方法可以自定义取值和方差,但是使用起来不是很方便
>>> torch.normal(mean=torch.full([10],0.),std=torch.arange(1,0,-0.1))
tensor([ 2.4278, 1.5845, -0.2471, -0.4362, 0.0557, 0.3101, 0.3443, -0.0106,
-0.2804, 0.0955])
序列生成:
在PyTorch中,torch.arange(), torch.linspace(), 和 torch.logspace() 是用于创建具有特定数值序列的tensor的函数。
-
torch.arange(start, end, step):返回一个1维tensor,其中包含从start到end(不包含end)的等差序列,步长为step。如果没有提供start和step,则默认为0和1;
-
torch.range(start, end, step) :会被弃用,使用arange()方法替代;
-
torch.linspace(start, end, steps) :返回一个1维tensor,其中包含从start到end的等间隔数值。steps参数定义了tensor中的元素数量,而不是步长。steps默认值为100;
-
torch.logspace(start, end, steps,base):返回一个1维tensor,其中包含在对数尺度上均匀间隔的数字。start和end是序列的起始和结束点的对数值(以10为底),steps是生成的数字的数量,base是对数的底数,默认为10。
# 创建一个从0到10(不包含10)的等差序列,步长为1
>>> torch.arange(0,10)
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 创建一个从0到10(不包含10)的等差序列,步长为2
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
# .range()方法会被弃用,使用.arange()方法替代
>>> torch.range(0,10)
<stdin>:1: UserWarning: torch.range is deprecated and will be removed in a future release because its behavior is inconsistent with Python's range builtin. Instead, use torch.arange, which produces values in [start, end).
tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
# 创建一个从0到10的等间隔数值序列,包含5个元素
>>> torch.linspace(0,10,steps=5)
tensor([ 0.0000, 2.5000, 5.0000, 7.5000, 10.0000])
# 创建一个从0到10的等间隔数值序列,包含10个元素
>>> torch.linspace(0,10,steps=10)
tensor([ 0.0000, 1.1111, 2.2222, 3.3333, 4.4444, 5.5556, 6.6667, 7.7778,
8.8889, 10.0000])
# 创建一个从10^0到10^1的均匀间隔数字序列,包含4个元素
>>> torch.logspace(0,1,steps=4)
tensor([ 1.0000, 2.1544, 4.6416, 10.0000])
# 创建一个从2^0到2^3的序列,包含4个元素
>>> torch.logspace(0,1,steps=4,base=2)
tensor([1.0000, 1.2599, 1.5874, 2.0000])
全0、全1、单位矩阵:
-
torch.zeros(size):返回一个形状由size参数定义的全零张量; -
torch.zeros_like(input, dtype):返回一个与input张量形状相同且元素全为零的张量; -
torch.ones(size):返回一个形状由size参数定义的全1张量; -
torch.ones_like(input, dtype):返回一个与input张量形状相同且元素全为1的张量; -
torch.eye(size):返回一个形状为(n, m)的单位矩阵,其中n是行数,m是列数。如果m未指定,则默认为n,即生成一个n x n的方阵。单位矩阵是对角线元素为1,其他元素为0的矩阵。
# 创建一个3x3的全零张量
>>> torch.zeros(3,3)
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
# 创建一个3x2的全为1的张量
>>> torch.ones(3,3)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 创建一个与a形状相同的全一张量
>>> a = torch.rand(3,3)
>>> torch.ones_like(a)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 创建一个3x3的单位矩阵
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# eye()方法当给定的shape不对应时,多余的会以0填充
>>> torch.eye(3,4)
tensor([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]])
# eye()方法只能接受一个或两个数据,也就是说不能生产更高维的数据
>>> torch.eye(4)
tensor([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
随机排列:
torch.randperm(n):返回一个0到n-1的n个整数的随机排列张量。
>>> torch.randperm(10)
tensor([5, 8, 7, 6, 3, 2, 4, 9, 0, 1])
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师