使用pytorch构建神经网络的流程以及一些问题

使用PyTorch构建神经网络十分的简单,下面是我总结的PyTorch构建神经网络的一般过程以及我在学习当中遇到的一些问题,期望对你有所帮助。

PyTorch构建神经网络的一般过程

下面的程序是PyTorch官网60分钟教程上面构建神经网络的例子,版本0.4.1:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

# 第一步:准备数据
# Compose是将两个转换的过程组合起来,ToTensor将numpy等数据类型转换为Tensor,将值变为0到1之间
# Normalize用公式(input-mean)/std 将值进行变换。这里mean=0.5,std=0.5,是将[0,1]区间转换为[-1,1]区间
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# trainloader 是一个将数据集和采样策略结合起来的,并提供在数据集上面迭代的方法
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=0)

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=0)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

# 第二步:构建神经网络框架,继承nn.Module类
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()

# 第三步:进行训练
# 定义损失策略和优化方法
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

# 训练神经网络
for epoch in range(4):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        # 训练过程1:前向过程,计算输入到输出的结果
        outputs = net(inputs)

        # 训练过程2:由结果和label计算损失
        loss = criterion(outputs, labels)

        # 训练过程3:在图的层次上面计算所有变量的梯度
        # 每次计算梯度的时候,其实是有一个动态的图在里面的,求导数就是对图中的参数w进行求导的过程
        # 每个参数计算的梯度值保存在w.grad.data上面,在参数更新时使用
        loss.backward()

        # 训练过程4:进行参数的更新
        # optimizer不计算梯度,它利用已经计算好的梯度值对参数进行更新
        optimizer.step()

        running_loss += loss.item()  # item 返回的是一个数字
        if i % 2000 == 1999:
            print('[%d, %5d] loss: %.3f' %
                  (epoch+1, i+1, running_loss/2000))
            running_loss = 0.0
print('Finished Training')

# 第四步:在测试集上面进行测试
total = 0
correct = 0
with torch.no_grad():
    for data in testloader:
        images, label = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == label).sum().item()

print("Accuracy of networkd on the 10000 test images: %d %%" % (100*correct/total))

这个例子说明了构建神经网络的四个步骤:1:准备数据集 。2:构建神经网络框架,实现神经网络的类。 3:在训练集上进行训练。 4:在测试集上面进行测试。

而在第三步的训练阶段,也可以分为四个步骤:1:前向过程,计算输入到输出的结果。2:由结果和labels计算损失。3:后向过程,由损失计算各个变量的梯度。4:优化器根据梯度进行参数的更新。

训练过程中第loss和optim是怎么联系在一起的

loss是训练阶段的第三步,计算参数的梯度。optim是训练阶段的第四步,对参数进行更新。在optimizer初始化的时候,optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9),获取了参数的指针,可以对参数进行修改。当loss计算好参数的梯度以后,把值放在参数w.grad.data上面,然后optimizer直接利用这个值对参数进行更新。

以SGD为例,它进行step的时候的基本操作是这样的:p.data.add_(-group[‘lr‘], d_p),其中 d_p = p.grad.data

为什么要进行梯度清零

在backward每次计算梯度的时候,会将新的梯度值加到原来旧的梯度值上面,这叫做梯度累加。下面的程序可以说明什么是梯度累加:

import torch
x = torch.rand(2, requires_grad=True)
y = x.mean()  # y = (x_1 + x_2) / 2  所以求梯度后应是0.5

y.backward()
print(x.grad.data) # 输出结果:tensor([0.5000, 0.5000])

y.backward()
print(x.grad.data) # 输出结果:tensor([1., 1.])  说明进行了梯度累积

求解梯度过程和参数更新过程是分开的,这对于那些需要多次求导累计梯度,然后一次更新的神经网络可能是有帮助的,比如RNN,对于DNN和CNN不需要进行梯度累加,所以需要进行梯度清零。

如何使用GPU进行训练

旧版本:

use_cuda = True if torch.cuda.is_available() else False  # 是否使用cuda
if use_cuda:
    model = model.cuda()  # 将模型的参数放入GPU
if use_cuda:
    inputs, labels = inputs.cuda(), labels.cuda()  # 将数据放入到GPU

0.4版本以后推荐新方法 to(device),

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)  #将模型的参数放入GPU中
inputs, labels = inputs.to(device), labels.to(device)  # 将数据放入到GPU中

参考:
Pytorch内部中optim和loss是如何交互的? - 罗若天的回答 - 知乎
pytorch学习笔记(二):gradient

原文地址:https://www.cnblogs.com/jiaxin359/p/10234937.html

时间: 2024-10-09 17:43:33

使用pytorch构建神经网络的流程以及一些问题的相关文章

tensorflow之神经网络实现流程总结

tensorflow之神经网络实现流程总结 1.数据预处理preprocess 2.前向传播的神经网络搭建(包括activation_function和层数) 3.指数下降的learning_rate 4.参数的指数滑动平均EMA 5.防止过拟合的正则化regularization 6.loss损失函数构造(loss_ + regularization) 7.后向传播和梯度下降(learning_rate + loss) 8.评价函数的构造(accuracy + EMA) 9.run 模型(用v

pytorch构建自己的数据集

现在需要在json文件里面读取图片的URL和label,这里面可能会出现某些URL地址无效的情况. python读取json文件 此处只需要将json文件里面的内容读取出来就可以了 with open("json_path",'r') ad load_f: load_dict = json.load(load_f) json_path是json文件的地址,json文件里面的内容读取到load_dict变量中,变量类型为字典类型. python通过URL打开图片 通过skimage获取U

GeneXus DevOps 自动化构建和部署流程

以下视频详细介绍了GeneXus DevOps自动化构建和部署流程,包括通过MS Bulid来管理自动化流程,自动化的架构,以及在GeneXus Server上使用Jenkins做为自动化引擎. 视频链接:https://v.qq.com/x/page/e3048y6pl9e.html(视频为英文语音和英文字幕) 原文地址:https://www.cnblogs.com/genexusblog/p/12191319.html

【推荐系统篇】--推荐系统之之特征工程部分---构建训练集流程

一.前述 根据前文中架构,本文我们讨论线下部分构建训练集部分.因为我们离线部分模型的选择是逻辑回归,所以我们数据必须有x和y. 二.具体流程 1.从数据库中分离出我们需要的数据. 用户行为表(日志) 用户历史下载表 商品词表(商品的基本特征) 2.构建训练集中的关联特征 流程: 2.构建训练集中的基本特征 总结:注意特征名离散化因为如果特征不离散化会造成数据之间有关系. 三.具体构建过程 1.hive建表 真实的生产场景涉及到大概五十张表的字段,这里全部简化流程,直接给出最终的三张表: 应用词表

模拟构建DNS解析流程

背景 DNS初步认识 ??DNS(Domain Name Server,域名系统)是互联网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去费力的记忆IP字符串.通过域名,最终可以得到该域名对应的IP地址的过程叫做域名解析.DNS协议运行在UDP洗衣上,使用的是53号端口.???? DNS的重要性以及高可用(DNS冗余) 重要性 ????DNS解析是目前互联网大多数应用的实际的寻址方式:域名技术的不断发展,和基于域名技术出现的新技术和新思路极大的丰富了互联网的应

vue 构建项目简单流程

一: vue init webpack-simple#1.0 vue-project cd vue-project npm install npm run dev 淘宝镜像npm install -g cnpm --registry=https://registry.npm.taobao.org vue init webpack vue-projectvue init webpack-simple vue-project //推荐这个方法 cd vue-project cnpm install

tensorflow搭建神经网络基本流程

定义添加神经层的函数 1.训练的数据2.定义节点准备接收数据3.定义神经层:隐藏层和预测层4.定义 loss 表达式5.选择 optimizer 使 loss 达到最小 然后对所有变量进行初始化,通过 sess.run optimizer,迭代 1000 次进行学习: import tensorflow as tf import numpy as np # 添加层 def add_layer(inputs, in_size, out_size, activation_function=None)

8.1 构建客户端总体流程

一 示例 1 配置文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 4 xmlns="http://www.springf

[PyTorch入门之60分钟入门闪击战]之神经网络

神经网络 来源于这里. 神经网络可以使用torch.nn包构建. 现在你对autograd已经有了初步的了解,nn依赖于autograd定义模型并区分它们.一个nn.Module包含了层(layers),和一个用来返回output的方法forward(input). 以下面这个区分数字图像的网络为例: 上图是一个简单的前馈网络.它接受输入,一个层接一层地通过几层网络,最后给出输出. 典型的神经网络训练程序如下: 定义具有一些可学习参数(或权重)的神经网络 迭代输入的数据集 通过网络处理输入 计算