学习利用PyTorch做自然语言处理(2)-张量及其运算

2019-12-03  本文已影响0人  公输昊少

所谓的张量,其实也就是多维数组,PyTorch中对张量的操作与mxnet中的非常像,都是类似于NumPy的多维数组。
本文介绍了PyTorch中张量的定义,及张量之间的运算。
本文主要参考了PyTorch官方教程中对Tensor的介绍

首先是引入PyTorch包:

import torch

1.张量的定义

首先,我们定义一个5行3列的未经初始化的矩阵:

x = torch.empty(5, 3)
print(x)

输出的结果如下图所示:

image
我们这里就发现了PyTorch与NumPy的一个区别,就是NumPy在生成一个多维数组时,需要通过传入一个元组或者列表来作为表征数组维度的shape参数,而PyTorch只需要将每个维度作为单独的参数穿进去就行了。再比如,我们要定义一个5×4×3的张量,则直接这样定义:
x = torch.empty(5, 4, 3)

其他的,像torch.zerostorch.ones等函数也类似。与NumPy相同的是,PyTorch的这些定义张量的函数都可以通过dtype参数来指定张量内元素的数据类型(数据类型包括torch.floattorch.doubletorch.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.dtypetorch.device(指定将tensor分配到的设备对象,可以是cpucuda:0等)与之相同但是形状不同(例如新形状为3×3)的tensor,则可用如下代码:

c = x.new_ones(3, 3)

其他的,像x.new_zerosx.new_empty都是类似的。
而如果我们想重新定义一个形状与之相同的tensor,则可以这样:

c = torch.ones_like(x)

同理,torch.ones_liketorch.empty_like也都是一样的。
上述的这三个函数,我们也都可以通过dtype指定数据类型,通过device指定设备。
关于PyTorch中的dtypedevice,可以参考以下链接:
https://ptorch.com/news/187.html#torch-layout

2.张量的运算

2.1 张量间运算

假设我们有形状相同的两个tensor,分别是xy,可以通过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

上一篇 下一篇

猜你喜欢

热点阅读