基础操作
- Tensor的副本
view
只会改变数据的表面形状,共享data
,但是view后的Tensor和之前的Tensor不是一个id,因为还有一些其他属性。
推荐先用clone
创造一个副本再使用view
;
使用clone
还有一个好处是会被记录在计算图中,即梯度回传到副本时也会传到源Tensor
参考此处
x_cp = x.clone().view(15)
- 常用函数
item()
将一个标量
Tensor
转换成一个Python number
x = torch.randn(1)
print(x)
print(x.item())
tensor([2.3466])
2.3466382026672363
- 索引操作不会开辟新内存-----用作数据迭代是等内存替换
y = y + x
是新开内存,再用y指向新内存;以下四种是写入y对应的内存
y[:] = y + x
torch.add(x, y, out=y)
y += x
y.add_(x)
Tensor
和NumPy相互转换
共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!!!
共享内存的方式:a.numpy()
转numpy、torch.from_numpy(a)
转Tensor
不共享内存:torch.tensor(a)
转Tensor
- GPU上的Tensor和
to()
同时可以更改数据类型
# 以下代码只有在PyTorch GPU版本上才会执行
if torch.cuda.is_available():
device = torch.device("cuda") # GPU
y = torch.ones_like(x, device=device) # 直接创建一个在GPU上的Tensor
x = x.to(device) # 等价于 .to("cuda")
z = x + y
print(z)
print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型
含有学习率变化的更新方式
PyTorch中的model.modules(), model.children(), model.named_children(), model.parameters()的区别与联系