本文会持续更新,直至完成pytorch中的60分入门文档部分,目前为tensor的基础操作部分
本文代码github:https://github.com/amazingzby/pytorch_tutorial
pytorch官方文档给初学者提供了一份pytorch的入门教程:DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ 。本文是此教程的学习笔记,也可以理解为对官方文档的翻译。通过学习,可以基本理解如下问题:
a.理解pytorch 的tensor和神经网络基本操作;
b.训练一个简单的图像分类神经网络。
本文为pytorch 有关Tensor的基本操作
pytorch中的tensor可以理解为numpy的GPUs版本。
构建一个5*3,未初始化的矩阵:
import torch
x = torch.empty(5,3)
print(x)
输出结果为:
tensor([[8.4490e-39, 1.0194e-38, 9.0919e-39],
[8.4490e-39, 8.9082e-39, 9.8265e-39],
[1.0102e-38, 1.0561e-38, 1.0194e-38],
[9.2755e-39, 1.0010e-38, 8.4490e-39],
[8.7245e-39, 1.0102e-38, 1.0653e-38]])
构建5*3,随机初始化矩阵:
x = torch.rand(5, 3)
print(x)
5*3的零矩阵:
x = torch.zeros(5,3,dtype=torch.long)#零矩阵
print(x)
用数组构建tensor:
x = torch.tensor([5.5, 3])
print(x)
输出:tensor([5.5000, 3.0000])
在现有tensor的基础上构建tensor,新的tensor保持旧tensor的一些属性(如形状和类型),除非新的tensor指定新的属性:
x = x.new_ones(5, 3, dtype=torch.double) # 新的tensor指定了形状和dtype
print(x)
x = torch.randn_like(x, dtype=torch.float) # 指定dtype,保留原来的形状
print(x)
获得tensor的形状参数:
print(x.size())
加操作:
y = torch.rand(5, 3)
print(x + y)
print(torch.add(x,y))
result = torch.empty(5, 3)
torch.add(x, y, out=result)#将x+y赋值给result
print(result)
y.add_(x)
print(y) #类似于y+=x
使用类似于numpy的切片操作:
print(x[:, 1])
torch.view 类似于numpy中的reshape
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
如果tensor只有一个数字,使用item()方法来获得这个数值:
x = torch.randn(1)
print(x)
print(x.item())
将tensor转化为numpy,此时如果改变tensor的数值,numpy类型的数值也会改变,类似于C++中的指针:
a = torch.ones(5)
b = a.numpy()
a.add_(1)
print(a)# tensor([2., 2., 2., 2., 2.])
print(b) #[2. 2. 2. 2. 2.] a中元素发生改变,b也随着a的改变而改变
numpy转化为tensor:
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a) #[2. 2. 2. 2. 2.]
print(b) #tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
使用to方法将cpu数据移入到gpu中,或者将gpu数据移到cpu中(要求安装gpu版本的pytorch):
if torch.cuda.is_available():
device = torch.device("cuda")
y = torch.ones_like(x,device=device)
x = x.to(device)
z = x + y
print(z)
print(z.to("cpu", torch.double))