torch中创建张量

 

1.张量的概念
概念: Pytorch 或者 Tensorflow 中的 Tensor 类型(张量),可以理解成是数学中的 n维数组,与 NumPy 中的 ndarray 类型类似。

区别是:

Pytorch 或者 Tensorflow 中的 Tensor,GPU可以很好的支持它的加速计算,而 NumPy 中的 ndarray 只能支持CPU计算。
Tensor 类型支持自动微分。
张量表示由一个数值组成的数组,这个数组可能有多个维度。具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix); 具有两个轴以上的张量没有特殊的数学名称。

1.1.torch.arange(12)
torch.arange可以用来创建行向量,默认创建的是整数(也可以指定创建类型为浮点型)。
张量中的每个值都成为张量的元素(element)。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

代码:

# 导入pytorch
import torch

# 创建一个行向量x,向量中有12个元素(整数),元素是从0-11
x = torch.arange(12)
print(x)

# 输出:
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

# 查看张量中元素的个数
y = x.numel()
print(y)

# 输出:
12

1.2.reshape(3,4)
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。

# 将向量x变成3行4列的张量z
z = x.reshape(3, 4)
print(z)

# 输出:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

1.3.torch.zeros(2,3,4)
我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。

注意:具有两个轴以上的张量没有特殊的数学名称,可以理解为它是由2个3行4列的张量组成,知道是这样的一个形状就可以。

# 使用zeros,表示该张量中的所有元素都为0(zero)
torch.zeros((2,3,4))

# 输出:
tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],

[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])

1.4.torch.ones((2, 3, 4))
我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。

# 使用ones,表示该张量中的所有元素都为1(one)
torch.ones((2,3,4))

# 输出:
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],

[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])

1.5.torch.randn(2,3,4)
创建一个形状为(2,3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。

torch.randn(2,3,4)

# 输出:
tensor([[[ 0.2409, -0.1582, 0.4382, -1.0087],
[-0.3676, 0.3038, -0.9411, 0.0746],
[ 1.7080, -0.7177, -0.4913, 0.7167]],

[[-0.2134, -0.3533, 0.0383, -1.6476],
[ 0.6329, -0.4788, -0.8633, -0.8998],
[ 1.6637, -1.3705, 0.6495, 0.0498]]])

1.6.torch.tensor([[2,3,4],[3,4,5]])

使用torch.tensor()手动创建张量,如:

torch.tensor([[2,3,4],[4,5,6],[7,8,9]])

# 输出:
tensor([[2, 3, 4],
[4, 5, 6],
[7, 8, 9]])

技巧: 可以根据[的数量来判断是几维的张量,如:

# 1个[,1维张量
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

# 2个[,2维张量
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

# 3个[,3维张量
tensor([[[ 0.2409, -0.1582, 0.4382, -1.0087],
[-0.3676, 0.3038, -0.9411, 0.0746],
[ 1.7080, -0.7177, -0.4913, 0.7167]],

[[-0.2134, -0.3533, 0.0383, -1.6476],
[ 0.6329, -0.4788, -0.8633, -0.8998],
[ 1.6637, -1.3705, 0.6495, 0.0498]]])

2.运算符
在数学表示法中,用f : R → R 来表示一元标量运算符,意味着该函数从任何一个实数 R 映射到了另一个实数 R。

其中,

f :表明这是一个函数,函数自变量和因变量之间存在映射关系,类似于数学的 f(x)。
R :表示实数 R \mathbb{R}R。
→:箭头左侧是函数 f 的自变量,右侧是函数 f 的因变量。
所以上式表示一个一元函数,而 f : R , R → R  则表示一个二元函数(即:有两个自变量,有一个因变量)。

注意: 张量的运算符,是指张量中,元素与元素之间的运算。

x = torch.tensor([1, 2, 4, 8])
y = torch.tensor([2, 3, 4, 5])

print(x+y)
# 输出:
tensor([ 3, 4, 8, 13])
#即: 3 = 1+2 第一个tensor中的
4 = 2+3
8 = 4+4
13= 8+5

3.广播机制
广播机制:通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状(两个张量就可以进行运算了)。

a = torch.arange(3).reshape((3, 1)) # 创建一个3行1列的张量
b = torch.arange(2).reshape((1, 2)) # 创建一个1行2列的张量
print(a)
print(b)
print(a+b)

# 输出:
tensor([[0],
[1],
[2]])
tensor([[0, 1]])

tensor([[0, 1],
[1, 2],
[2, 3]])

理解: 一个是3行1列,一个是1行2列,二者没法直接进行运算。所以需要将3行1列的广播成3行2列,1行2列的广播成3行2列,即:2个张量维度相同时再进行运算。广播机制整个过程如下所示。

# 第一步:两个张量触发广播机制,进行转换
[0] [0, 0]
[1] => [1, 1] # 3行1列,变成3行2列
[2] [2, 2]

[0, 1]
[0, 1] => [0, 1] # 1行2列,变成3行2列
[0, 1]

# 第二步:两个张量进行运算
[0, 1] [0, 0] [0, 1]
[0, 1] + [1, 1] = [1, 2]
[0, 1] [2, 2] [2, 3]

————————————————

原文链接:https://blog.csdn.net/m0_38068876/article/details/127928856

posted @ 2024-08-27 16:06  持与恒  阅读(29)  评论(0)    收藏  举报