📜  PyTorch 中的张量运算(1)

📅  最后修改于: 2023-12-03 14:46:48.489000             🧑  作者: Mango

PyTorch中的张量运算

PyTorch是一个基于Python的科学计算包,其中最重要的一个功能就是支持张量运算。张量运算是深度学习中最基础的操作,PyTorch为此提供了许多强大的操作和函数。

张量的创建

我们可以使用torch.Tensor()方法来创建张量,这个方法可以接受多种不同的数据类型,比如list,tuple,numpy数组等等。以下是一些示例:

import torch

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

# 从元组创建张量
b = torch.Tensor((1, 2, 3, 4, 5))
print(b)

# 从numpy数组创建张量
import numpy as np
c = np.array([1, 2, 3, 4, 5])
d = torch.Tensor(c)
print(d)

以上代码将输出:

tensor([1., 2., 3., 4., 5.])
tensor([1., 2., 3., 4., 5.])
tensor([1., 2., 3., 4., 5.])

在创建张量时,我们还可以指定张量的形状、数据类型等参数。例如,以下代码创建了一个形状为(2, 3)、数据类型为浮点数的张量:

e = torch.zeros((2, 3), dtype=torch.float32)
print(e)

以上代码将输出:

tensor([[0., 0., 0.],
        [0., 0., 0.]])
张量的形状变换

PyTorch支持多种对张量进行形状变换的操作。其中最常用的是reshape()方法,它可以将张量变换为指定的形状:

import torch

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(a.reshape((2, 3)))

以上代码将输出:

tensor([[1., 2., 3.],
        [4., 5., 6.]])

在进行形状变换时,我们还可以使用view()方法,它与reshape()方法的功能类似,但是速度更快。以下是一个使用view()方法进行形状变换的示例:

import torch

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(a.view((2, 3)))

以上代码将输出:

tensor([[1., 2., 3.],
        [4., 5., 6.]])
张量的运算

PyTorch支持多种对张量进行运算的操作,包括加减乘除、矩阵乘法、逐元素乘法等等。这些操作可以通过使用PyTorch提供的各种函数或者运算符来实现。

以下是一些示例:

import torch

# 加法
a = torch.Tensor([1, 2, 3])
b = torch.Tensor([4, 5, 6])
print(torch.add(a, b))
print(a + b)

# 逐元素乘法
c = torch.Tensor([1, 2, 3])
d = torch.Tensor([4, 5, 6])
print(torch.mul(c, d))
print(c * d)

# 矩阵乘法
e = torch.Tensor([[1, 2], [3, 4]])
f = torch.Tensor([[5, 6], [7, 8]])
print(torch.matmul(e, f))
print(e @ f)

以上代码将输出:

tensor([5., 7., 9.])
tensor([5., 7., 9.])
tensor([ 4., 10., 18.])
tensor([ 4., 10., 18.])
tensor([[19., 22.],
        [43., 50.]])
tensor([[19., 22.],
        [43., 50.]])
张量的广播

当我们对不同形状的张量进行运算时,PyTorch会自动执行广播操作,以满足运算的需求。

以下是一个广播操作的示例:

import torch

a = torch.Tensor([[1, 2, 3], [4, 5, 6]])
b = torch.Tensor([10, 20, 30])
print(a + b)

以上代码将输出:

tensor([[11., 22., 33.],
        [14., 25., 36.]])

在这个示例中,我们对形状为(2,3)的张量a和形状为(3,)的张量b进行加法运算。在进行运算时,PyTorch自动将b扩展为形状为(1,3)的张量,然后再将其广播到形状为(2,3)的张量a上。

张量的转换

PyTorch支持多种对张量进行转换的操作,比如将张量转换为numpy数组,或者将其转换为GPU张量等等。

以下是一些示例:

import torch
import numpy as np

# 将张量转换为numpy数组
a = torch.Tensor([1, 2, 3])
b = a.numpy()
print(b)

# 将numpy数组转换为张量
c = np.array([1, 2, 3])
d = torch.from_numpy(c)
print(d)

# 将张量转换为GPU张量
e = torch.Tensor([1, 2, 3])
f = e.cuda()
print(f)

以上代码将输出:

[1. 2. 3.]
tensor([1, 2, 3])
tensor([1., 2., 3.], device='cuda:0')
总结

到此为止,我们已经介绍了PyTorch中的一些重要的张量运算。当然,这些操作只是冰山一角,PyTorch还提供了更多更强大的操作,我们可以在实际的深度学习中逐渐掌握和应用它们。