深度学习框架Pytorch——学习笔记(一)基础认识和实践

深度学习框架Pytorch——学习笔记(一)

记录在学习过程中,学到的东西和遇到的问题。

1.什么是Pytorch,为什么选择Pytroch?

pytorch是深度学习框架,是目前主流框架之一。
pytroch的结构和python类似,易于理解。

2.Pytroch的安装

2.1配置Python环境

通过官网下载安装包
官网:https://www.python.org/downloads/
或者安装 Anaconda版本
Anaconda官网:https://www.anaconda.com/distribution/

我建议使用Anaconda进行安装,因为conda中有一个虚拟环境的功能,可以很好的区分和管理,python的不同需求下的环境,从而不用重复安装python。

命令行操作可以使用git工具,它比windows自带的cmd,更加支持shell等一下操作。

conda创建虚拟环境过程:

  1. 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/

2.2准备Python管理器

python代码管理,我使用的是 Pycharm 。功能齐全,代码调试方便。
pycharm 安装比较简单,官网下载即可。
分为免费版(社区版) 和 收费版(专业版)。
如有专业版的需求,可以通过 https://blog.csdn.net/u014044812/article/details/78727496 进行破解。

2.3 通过命令行安装PyTorch

安装方式在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

3.PyTorch基础概念

tensor

可以理解为张量矩阵,和numpy实际上是一样的。两者可以相互转化。其好处是可以在GPU上进行计算,而numpy不行。

autograd 自动化 (自动求导)

这个特点,也是pytorch的主要特点,从而实现动态的计算图。
torch矩阵中,属性 requires_grad = True,可以进行记录操作过程跟踪。

4.通用代码实现流程(实现一个深度学习的代码流程)

神经网络的典型训练流程

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

你可能感兴趣的:(pytorch)