深度学习之Pytorch学习
作者介绍
张伟伟,男,西安工程大学电子信息学院,2019级硕士研究生,张宏伟人工智能课题组。
研究方向:机器视觉与人工智能。
微信公众号:可随时查阅,搜索—张二牛的笔记,回复“python‘’获取整理好的专栏。
电子邮件:zhangweiweicpp@163.com
Pytorch学习(10days)
学习Pytorch不知道如何学起,那么本帖一定可以帮助到你,主要是一个导向作用。有补充的部分可以评论区相互交流补充。以下主要根据个人的学习经验,列举出学习的部分,快速入门 Pytorch。
1.1 Pytorch简介:
Pytorch是一个优秀的开源机器学习和深度学习算法框架,pytorch官方网址: https://pytorch.org/.
除此之外的开源框架还有TensorFlow、MXNet、CNTK、Keras等。Pytorch语法简洁、优美。个人感觉比起TensorFlow更容易上手。PyTorch 的奥秘,重点在于‘’张量‘’。pytorch的热度:
学习注意的点:浏览学习一些基础知识,如中文文档和官方的pytorch 60 分钟入门视频和链接。
然后熟悉各个模块的作用,从实例和代码边实现边学习pytorch最为高效。
1.2 Pytorch的环境安装
1.3 Pytorch资料
- pytorch中文文档 : https://pytorch-cn.readthedocs.io/zh/latest/.
- 官方的pytorch 60 分钟入门链接: https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html.
- pytoch中文论坛: https://discuss.ptorch.com/.
- 一本开源书籍链接: https://github.com/zergtant/pytorch-handbook.
- pytorch学习可参考的b站视频:
1.4.1 pytorch的基础知识
1.4.1Pytoch的张量(Tensor)
tensor就是张量的英文,表示多维的矩阵,比如一维就是向量,二维就是一般的矩阵等等,关于维度的理解很重要,另外需要学习张量间的运算如加减乘除求导等,具体可自行百度。
1.4.2 Pytorch的自动求导功能
1.4.3 Pytorch的Tensor与numpy的关系及类型转换
1.4.4 Pytorch的核心模块的学习
主要学习各模块的作用,熟悉pytorch中文文档中的模块,熟悉模块的作用,深度学习中各个模块的关系博主找到一张比较清晰的图如下:
1.4.4.1 Pytorch的核心模块的学习之torch.nn
(主要用于定义模型,)
1.4.4.2 Pytorch的核心模块的学习之torch.nn.functional
(损失函数和一些不需要优化的网络层)
1.4.4.3 Pytorch的核心模块的学习之torch.optim
(定义优化器等)
1.4.2 学习要点
- 理解各个常用包的用途,比如matplib,os等。通过minist数据集数字分类熟悉整个流程。
- 读取数据,主要会调用两个类即可,Dataset和Dataloader,如何得到数据集的列表和按照batchsize进行输出。
- 搭建神经网络。卷积,激活层,BN层Pooling,全连接的语句。将其写到模型类中两个函数,_init_和forward函数。
- 优化器根据实际情况选择优化器,一般选取Adam优化器即可。
1.5 pytorch的实例
阅读源代码是快速上手pytorch的最好的手段。相比其他框架,pytorch代码量不大,而且抽象层次没有那么多,很容易读懂。通过阅读代码可以了解函数和类的机制,将python的知识。
1.5.1 利用pytorch编写手写字符分类的实验,训练和测试,输出准确率。
#1.导入相关的包
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable
# 2.设置超参数,例如学习率,层数,批大小(batch_size)
batch_size = 64
# 3.给定路径读入数据集的图片列表,利用MNIST Dataset数据集。使用datasets函数
train_dataset = datasets.MNIST(root='./data/',
train=True,
transform=transforms.ToTensor(),
download=True)
test_dataset = datasets.MNIST(root='./data/',
train=False,
transform=transforms.ToTensor())
# 4.按照给定的batch_size大小划分数据,利用torch.utils.data.DataLoader读入训练和测试数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)
# 5 加载已训练模型或者定义模型。 搭建神经网络。卷积,激活层,注意如何搭建并编写的。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 输入1通道,输出10通道,kernel 5*5
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.mp = nn.MaxPool2d(2)
# fully connect
self.fc = nn.Linear(320, 10)
def forward(self, x):
# in_size = 64
in_size = x.size(0) # one batch
# x: 64*10*12*12
x = F.relu(self.mp(self.conv1(x)))
# x: 64*20*4*4
x = F.relu(self.mp(self.conv2(x)))
# x: 64*320
x = x.view(in_size, -1) # flatten the tensor
# x: 64*10
x = self.fc(x)
return F.log_softmax(x)
# 6 对定义的模型进行实例化,如果电脑支持GPU,则if语句会将模型加载到GPU上运行,本实例使用cpu可满足计算要求
model = Net()
#if torch.cuda.is_available():
# model = model.cuda()
# 7 定义并实例化优化器,设置学习率等,optim函数中可以选择优化器,例如SGD和Adam等
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
# 8 训练过程
def train(epoch):
for batch_idx, (data, target) in enumerate(train_loader):
# 8.1 读入数据
data, target = Variable(data), Variable(target)
# 8.2 优化器梯度清零,为了后续参数更新
optimizer.zero_grad()
# 8.3 数据输如模型中,通过前向传播,得到预测结果
output = model(data)
# 8.4 损失函数。计算输入和预测的损失
loss = F.nll_loss(output, target)
# 8.5 利用计算的损失进行反向传播计算梯度
loss.backward()
# 8.6 利用优化器进行参数更新
optimizer.step()
# 8.7 训练过程的损失可视化
if batch_idx % 200 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
# 9 测试过程,无需优化器和参数更新,计算并统计预测正确的个数。
def test():
test_loss = 0
correct = 0
for data, target in test_loader:
data, target = Variable(data, volatile=True), Variable(target)
output = model(data)
# sum up batch loss
test_loss += F.nll_loss(output, target, size_average=False).item()
# get the index of the max log-probability
pred = output.data.max(1, keepdim=True)[1]
correct += pred.eq(target.data.view_as(pred)).cpu().sum()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
# 10 开始训练和测试。epoch 数量设置为10
for epoch in range(1, 10):
train(epoch)
test()
- 测试主要将训练保存的模型读入,然后输出待测图片。后续可将训练和测试分开编写在不同的文件中。==关键是学习完成如何保存模型。==编写测试代码时将训练的代码去掉优化器,损失函数,直接读入已训练的模型,输入图片,将模型冻结,不作参数更新,然后编写可视化程序例如:显示图片,打印预测结果等。
后续待补充---------