记录在学习过程中,学到的东西和遇到的问题。
pytorch是深度学习框架,是目前主流框架之一。
pytroch的结构和python类似,易于理解。
通过官网下载安装包
官网:https://www.python.org/downloads/
或者安装 Anaconda版本
Anaconda官网:https://www.anaconda.com/distribution/
我建议使用Anaconda进行安装,因为conda中有一个虚拟环境的功能,可以很好的区分和管理,python的不同需求下的环境,从而不用重复安装python。
命令行操作可以使用git工具,它比windows自带的cmd,更加支持shell等一下操作。
conda创建虚拟环境过程:
conda create -n pytorch python=3.6
创建一个名为"pytorch"的python虚拟环境,其采用的python版本为3.6。虚拟环境中的版本可以自己选择,不一定要和conda版本相同。
2. 进入虚拟环境
source activate pytorch
3.进入成功,说明环境创建完成。虚拟环境中的python环境,外部也是可以找到和调用的。
4.conda如果需要下载一些包,可能会特别慢,需要修改conda源。因为访问的是国外源,出于国家政策原因,会下载特别慢,甚至不下载,需要修改为国内机构的源。
# 使用清华 conda 镜像。
conda config --prepend channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# 或者选用科大 conda 镜像。
conda config --prepend channels http://mirrors.ustc.edu.cn/anaconda/pkgs/free/
python代码管理,我使用的是 Pycharm 。功能齐全,代码调试方便。
pycharm 安装比较简单,官网下载即可。
分为免费版(社区版) 和 收费版(专业版)。
如有专业版的需求,可以通过 https://blog.csdn.net/u014044812/article/details/78727496 进行破解。
安装方式在pytorch官网有 ,官网:https://pytorch.org/
一般可以采用以下两种方式安装
一种是可以通过python pip 进行安装。
pip3 install https://download.pytorch.org/whl/cu90/torch-1.1.0-cp36-cp36m-win_amd64.whl
pip3 install torchvision
另一种是conda进行安装(我采用的方式)
安装最新版的环境
conda install pytorch torchvision -c pytorch
根据需求可以选择pytorch版本进行安装
conda install pytorch=1.0.0 torchvision -c pytorch
可以理解为张量矩阵,和numpy实际上是一样的。两者可以相互转化。其好处是可以在GPU上进行计算,而numpy不行。
这个特点,也是pytorch的主要特点,从而实现动态的计算图。
torch矩阵中,属性 requires_grad = True,可以进行记录操作过程跟踪。
1.数据获取和加载。如果是通用数据,pytorch已经做了封装,直接调运就可以。
2.网络定义。常规的网络,pytorch也已经封装好了,直接调用即可。
3.损失函数和优化方法。
4.训练
5.测试
import torch
import torchvision
import torchvision.transforms as transforms
import torchvision.datasets.cifar
### 数据获取和加载
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
### 网络定义
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
### 将网络转到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)
### 定义损失函数和优化方法
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
for epoch in range(2):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取数据并转到GPU上
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
### 测试
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in testloader:
images, labels = data
images, labels = images.to(device), labels.to(device)
outputs = net(images)
_, predicted = torch.max(outputs, 1)
# print(predicted)
c = (predicted == labels).squeeze()
for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print('Accuracy of %5s : %2d %%' % (
classes[i], 100 * class_correct[i] / class_total[i]))
通过学习,了解了神经网络进行分类的过程。以及每个步骤的作用,简单实现了一个分类任务。
[1] https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
[2] https://github.com/chenyuntc/pytorch-book