学习利用PyTorch做自然语言处理(2)-张量及其运算
所谓的张量,其实也就是多维数组,PyTorch中对张量的操作与mxnet中的非常像,都是类似于NumPy的多维数组。
本文介绍了PyTorch中张量的定义,及张量之间的运算。
本文主要参考了PyTorch官方教程中对Tensor的介绍。
首先是引入PyTorch包:
import torch
1.张量的定义
首先,我们定义一个5行3列的未经初始化的矩阵:
x = torch.empty(5, 3)
print(x)
输出的结果如下图所示:
![](https://img.haomeiwen.com/i20257385/01e6ee6e30f03867.png)
我们这里就发现了PyTorch与NumPy的一个区别,就是NumPy在生成一个多维数组时,需要通过传入一个元组或者列表来作为表征数组维度的
shape
参数,而PyTorch只需要将每个维度作为单独的参数穿进去就行了。再比如,我们要定义一个5×4×3的张量,则直接这样定义:
x = torch.empty(5, 4, 3)
其他的,像torch.zeros
、torch.ones
等函数也类似。与NumPy相同的是,PyTorch的这些定义张量的函数都可以通过dtype
参数来指定张量内元素的数据类型(数据类型包括torch.float
、torch.double
、torch.long
等)。
当我们已经有其他形式的数组时,可以利用torch.tensor
将其转换为PyTorch的tensor对象,例如:
a = [1, 2, 3]
x = torch.tensor(a)
b = [[1, 2], [3, 4]]
y = torch.tensor(b)
需要注意的是,如果需要转化的是多维数组,那么多维数组内元素的结构需一致,不能出现如下情况:
b = [[1, 2], [3]]
y = torch.tensor(b)
当我们已经有一个tensor,想重新定义一个torch.dtype
或torch.device
(指定将tensor分配到的设备对象,可以是cpu
、cuda:0
等)与之相同但是形状不同(例如新形状为3×3)的tensor,则可用如下代码:
c = x.new_ones(3, 3)
其他的,像x.new_zeros
、x.new_empty
都是类似的。
而如果我们想重新定义一个形状与之相同的tensor,则可以这样:
c = torch.ones_like(x)
同理,torch.ones_like
、torch.empty_like
也都是一样的。
上述的这三个函数,我们也都可以通过dtype
指定数据类型,通过device
指定设备。
关于PyTorch中的dtype
和device
,可以参考以下链接:
https://ptorch.com/news/187.html#torch-layout
2.张量的运算
2.1 张量间运算
假设我们有形状相同的两个tensor,分别是x
和y
,可以通过x.size()
和y.size()
查看它们的形状,那么我们可以做以下运算:
矩阵相加:
x + y
# 或者
torch.add(x, y)
# 或者
x.add(y)
矩阵相减:
x - y
# 或者
torch.sub(x, y)
# 或者
x.sub(y)
矩阵点乘:
x * y
# 或者
torch.mul(x, y)
# 或者
x.mul(y)
矩阵点除:
x / y
# 或者
torch.div(x, y)
# 或者
x.div(y)
在运算函数名后家下划线可以达到类似+=
或-=
的效果:
x += y
# 等同于
x.add_(y)
如果两个张量形状满足做矩阵乘法的条件,那么可以做矩阵相乘运算:
torch.mm(x, y)
先介绍这么多,以后遇到再添加吧。
2.2 张量与数字之间的运算
这个在mxnet的教程《动手学深度学习》中有介绍,在PyTorch中也适用。
a = 2
b = torch.tensor([1, 2, 3])
print(a+b)
输出的结果为:
tensor([2, 1, 0])
其他的运算也类似。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://ywsun.site/articles/26.html