本文是记录在学习深度学习的过程中对PyTorch框架的学习过程,
PyTorch是一个开源的Python机器学习库,基于Torch, 由Facebook推出,应用于人工智能领域。PyTorch主要有两大特征:
为什么要选择PyTorch呢?下面以应用最广泛的框架TensorFlow来做个对比。首先相比于TensorFlow,PyTorch容易上手(不过据说TensorFlow2.0对新手很友好,还没有学)。其次,PyTorch支持动态图结构,图在运行时构建,方便我们进行调试;而TensorFlow的图是静态的,图先被“编译”然后再运行。
学习PyTorch,首先要对PyTorch进行安装。官网地址为:https://pytorch.org/
进入官网以后,官方有教程会指导安装,我们只要对着步骤进行即可。我在ubuntu16.04下安装的,但是我一直没能在Windows上安装成功,等安装成功了我具体写下。
通过命令行安装PyTorch:(WIN10+none CUDA)
conda install pytorch-cpu torchvision-cpu -c pytorch
1.张量(Tensor)
几何代数中的张量是基于向量和矩阵的推广。PyTorch中的张量类似Numpy中的ndarrays,并且可以运行在GPU中加速运算。
输入以下代码:
import torch
x = torch.randn(5 , 3, dtype=torch.float)
print(x)
得到输出为:
tensor([[ 0.0153, -0.2443, 0.0689],
[ -2.2178, 0.2219, -2.4072],
[ 1.1662, -1.7380, 0.4382],
[ 0.8350, -0.8182, 0.3119],
[ 0.2905, -0.4506, -0.0618]])
2.自动求导(Autograd)
Autograd为所有Tensor上的操作提供了自动微分机制。具体是什么以后等我学到了会再介绍。
暂时还没怎么学,因此对着莫烦老师的教程手打了一遍分类的代码,还要接着理解才行。
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
n_data = torch.ones(100, 2)
x0 = torch.normal(2*n_data, 1)
y0 = torch.zeros(100)
x1 = torch.normal(-2*n_data, 1)
y1 = torch.ones(100)
x = torch.cat((x0, x1), 0).type(torch.FloatTensor)
y = torch.cat((y0, y1), ).type(torch.LongTensor)
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden)
self.out = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
x = F.relu(self.hidden(x))
x = self.out(x)
return x
net = Net(n_feature=2, n_hidden=10, n_output=2)
print(net)
optimizer = torch.optim.SGD(net.parameters(), lr=0.02)
loss_func = torch.nn.CrossEntropyLoss()
plt.ion()
for t in range(100):
out = net(x)
loss = loss_func(out, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t % 2 == 0:
plt.cla()
prediction = torch.max(out, 1)[1]
pred_y = prediction.data.numpy()
target_y = y.data.numpy()
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')
accuracy = float((pred_y == target_y).astype(int).sum()) / float(target_y.size)
plt.text(1.5, -4, 'Accuracy=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
```