1. pytorch数据操作
- pytorch与tensorflow中的Tensor类似于numpy的ndarray
- pytorch中的Tensor可以在GPU上运行
- pytorch中的Tensor可以用于自动求导
1.1 张量
- 创建张量
1 | # 1. 导入torch,不是pytorch |
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
tensor([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.])
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.]]])
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.]]])
tensor([[-0.0847, -0.2406, 0.1735, -1.5543],
[-0.2820, -0.6689, 0.0565, 0.4746],
[ 0.9841, -1.6116, -0.1587, -1.5121]])
tensor([[1, 2, 3],
[4, 5, 6]])
- 张量的属性
1 | # 3. 查看张量的形状 |
x的规模: torch.Size([12])
x中元素个数: 12
改变x的形状: tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
自动计算的形状: tensor([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
1.2 运算符
1 | x=torch.arange(4) |
按元素加法: tensor([0, 2, 4, 6])
按元素减法: tensor([0, 0, 0, 0])
按元素乘法: tensor([0, 1, 4, 9])
按元素除法: tensor([nan, 1., 1., 1.])
按元素幂运算: tensor([ 1, 1, 4, 27])
按元素开方: tensor([0.0000, 1.0000, 1.4142, 1.7321])
求幂运算: tensor([ 1.0000, 2.7183, 7.3891, 20.0855])
沿行合并: tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
沿列合并: tensor([[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.]])
tensor([[False, False, False, False],
[False, False, False, False],
[False, False, False, False]])
求和: tensor(12.)
1.3 广播机制
- 对两个形状不同的张量按元素运算时,可能会触发广播机制:先适当复制元素使这两个张量形状相同后再按元素运算
- 如果两个张量的维度数不同,可以在较小的张量的形状前面补1,直到两者的维度数相同。
- 如果两个张量在某个维度上的大小不同,但其中一个张量在该维度上的大小为1,那么可以通过在该维度上重复扩展该张量,使得两个张量在该维度上的大小相同。
- 如果两个张量在某个维度上的大小都不为1,且大小不同,那么会发生形状不匹配,导致无法进行广播
1 | a=torch.arange(3).reshape(3,1) |
a: tensor([[0],
[1],
[2]])
b: tensor([[0, 1]])
a+b: tensor([[0, 1],
[1, 2],
[2, 3]])
1.4 索引和切片
1 | print('x:',x) |
x: tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
x[-1]: tensor([0., 0., 0., 0.])
x[1:3]: tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
x[1,2]=9后 x: tensor([[0., 0., 0., 0.],
[0., 0., 9., 0.],
[0., 0., 0., 0.]])
x[0:2,:]=12后 x: tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 0., 0., 0., 0.]])
1.5 节省内存
1 | z=torch.zeros(1) |
z: tensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 0., 0., 0., 0.]])
id(z)==before: False
id(z)==before: True
1.6 转换为其他python对象
- tensor与numpy数组
1 | A=x.numpy() # 将张量转换为numpy数组 |
[[12. 12. 12. 12.]
[12. 3. 12. 12.]
[ 0. 0. 0. 0.]]
tensor([[12., 12., 12., 12.],
[12., 3., 12., 12.],
[ 0., 0., 0., 0.]])
[[12. 12. 12. 12.]
[12. 3. 12. 12.]
[ 0. 0. 0. 0.]]
tensor([[12., 12., 12., 12.],
[12., 3., 12., 12.],
[ 0., 0., 0., 0.]])
tensor([[12., 12., 12., 12.],
[12., 3., 12., 12.],
[ 0., 0., 0., 0.]])
- 张量转为python标量
1 | a=torch.tensor([1.3]) |
tensor([1.3000])
1.2999999523162842
1.2999999523162842