一、张量
1.1张量的创建
1.1.1按照数据创建
# 创建一维向量
import paddle
ndim_1_Tensor = paddle.to_tensor([1.0, 2.0, 3.0])
print(ndim_1_Tensor)
# 创建二维向量
ndim_2_Tensor = paddle.to_tensor([
[1.0, 2.0, 3.0],
[2.0, 3.0, 4.0]
])
print(ndim_2_Tensor)
# 创建三维向量
ndim_3_Tensor = paddle.to_tensor([
[[1.0, 2.0, 3.0],
[2.0, 3.0, 4.0]],
[[1.0, 2.0, 3.0],
[2.0, 3.0, 4.0]]
])
print(ndim_3_Tensor)
需要注意的是,张量在任何一个维度上的元素数量必须相等。
一维张量
二维张量
三位张量
1.1.2按照形状创建
如果要创建一个指定形状、元素数据相同的张量,可以使用
paddle.zeros、paddle.ones、paddle.full等API
m, n = 2, 3
# 创建元素全为0、形状为[2,3]
zeros_Tensor = paddle.zeros([m, n])
# 创建元素全为1、形状为[2,3]
ones_Tensor = paddle.ones([m, n])
# 创建元素全为100、形状为[1,2,3],即自定义元素
full_Tensor = paddle.full([1, 2, 3], 100)
print('zeros: ', zeros_Tensor)
print('ones: ', ones_Tensor)
print('full: ', full_Tensor)
1.1.3按照区间创建
可以使用
paddle.arange、paddle.linspace等API
# 创建以步长step均匀分隔数值区间[start, end)的一维Tensor
arange_Tensor = paddle.arange(start=1, end=5, step=1)
# 创建以元素个数num均匀分隔数值区间[start, stop]的Tensor
linspace_Tensor = paddle.linspace(start=1, stop=5, num=5)
print(arange_Tensor)
print(linspace_Tensor)
1.2张量的属性
1.2.1 张量的形状
张量具有如下形状属性:
Tensor.ndim:张量的维度,例如向量的维度为1,矩阵的维度为2。Tensor.shape: 张量每个维度上元素的数量。Tensor.shape[n]:张量第\(n\)维的大小。第\(n\)维也称为轴(axis)。Tensor.size:张量中全部元素的个数。
可以结合下图进行理解
ndim_4_Tensor = paddle.ones([2,3,4,5])
# 维度
print("dimensions: ", ndim_4_Tensor.ndim)
# 形状
print("shape: ", ndim_4_Tensor.shape)
# 第一维
print("axis 0: ", ndim_4_Tensor.shape[0])
# 最后一维
print("axis -1: ", ndim_4_Tensor.shape[-1])
# 张量含有的总元素
print("number of elements in tensor: ", ndim_4_Tensor.size)
1.2.2张量形状的属性
张量形状的改变
一般使用paddle.reshape来改变
# 按照数据创建形状为[2,3,4]的三维向量
ndim_3_Tensor = paddle.to_tensor([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
],
[
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]
]
])
print(ndim_3_Tensor)
# reshape为[3,4,2]
ndim_3_Tensor = paddle.reshape(ndim_3_Tensor, [3, 4, 2])
print(ndim_3_Tensor)
# 查看结果为
Tensor(shape=[2, 3, 4], dtype=int64, place=CUDAPlace(0), stop_gradient=True,
[[[1 , 2 , 3 , 4 ],
[5 , 6 , 7 , 8 ],
[9 , 10, 11, 12]],
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]])
Tensor(shape=[3, 4, 2], dtype=int64, place=CUDAPlace(0), stop_gradient=True,
[[[1 , 2 ],
[3 , 4 ],
[5 , 6 ],
[7 , 8 ]],
[[9 , 10],
[11, 12],
[13, 14],
[15, 16]],
[[17, 18],
[19, 20],
[21, 22],
[23, 24]]])
发现张量的数据并没有改变,只是数据形状发生了改变
使用reshape时存在一些技巧,比如:
- -1表示这个维度的值是从张量的元素总数和剩余维度推断出来的。因此,有且只有一个维度可以被设置为-1。
- 0表示对应的维度的元素个数与原张量在该维度上的元素个数相同
还可以利用paddle.unsqueeze来添加维度
ndim_3_Tensor = paddle.to_tensor([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
],
[
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]
]
])
print(ndim_3_Tensor) #[2,3,4]
ndim_3_Tensor_new1 = paddle.unsqueeze(ndim_3_Tensor, axis=0)
print(ndim_3_Tensor_new1) #[1,2,3,4]
ndim_3_Tensor_new2 = paddle.unsqueeze(ndim_3_Tensor, axis=[1,2])
print(ndim_3_Tensor_new2) #[2,1,1,3,4]
1.2.3张量的数据类型
可以通过Tensor.dtype来查看张量的数据类型,类型支持bool、float16、float32、float64、uint8、int8、int16、int32、int64和复数类型数据。
1)通过Python元素创建的张量,可以通过dtype来指定数据类型,如果未指定:
- 对于Python整型数据,则会创建int64型张量。
- 对于Python浮点型数据,默认会创建float32型张量。
2)通过Numpy数组创建的张量,则与其原来的数据类型保持相同。通过paddle.to_tensor()函数可以将Numpy数组转化为张量。
# 使用paddle.to_tensor通过已知数据来创建一个Tensor
# int64
print("Tensor dtype from Python integers:", paddle.to_tensor(1).dtype)
# float32
print("Tensor dtype from Python floating point:", paddle.to_tensor(1.0).dtype)
# complex64
complex1 = 1+2j
print(paddle.to_tensor(complex1).dtype)
浙公网安备 33010602011771号