【pytorch实战3】模型搭建和参数优化

参考资料:

《深度学习之pytorch实战计算机视觉》

Pytorch官方教程

Pytorch中文文档

 

一个典型的神经网络训练过程如下:

  • 定义神经网络
  • 在训练数据集上面迭代,输入数据到神经网络
  • 前向传播计算loss
  • 反向传播计算梯度
  • 参数更新。 

下面来看如何基于pytorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方式趋于高效。

一、模型的搭建

  Pytorch的torch.nn包提供了很多实现神经网络相关的类。包括模型搭建和参数优化的常见内容。本节来看一下如何运用这些类实现一个网络模型的搭建。

import torch
from torch.autograd import  Variable

batch_n = 100
hidden_layer = 100
input_data = 1000
output_data = 10

x = Variable(torch.randn(batch_n,input_data),requires_grad = False)
y = Variable(torch.randn(batch_n,output_data),requires_grad = False)

#搭建网络模型
models = torch.nn.Sequential(
    torch.nn.Linear(input_data,hidden_layer),
    torch.nn.ReLU(),
    torch.nn.Linear(hidden_layer,output_data)
)
print(models)

  torch.nn.Sequential类是一种序列容器,参数会按照我们定义好的序列传递下去。嵌套在容器中的各个部分可以看做不同的模块。而模块的嵌入有两种方式,一种是上面代码描述的直接嵌入,该种方式默认使用从零开始的数字序列作为每个模块的名字。可见下面的运行结果。

另一种嵌套方式是以orderdict有序字典的方式传入。

import torch
from torch.autograd import  Variable
from collections import OrderedDict

batch_n = 100
hidden_layer = 100
input_data = 1000
output_data = 10

x = Variable(torch.randn(batch_n,input_data),requires_grad = False)
y = Variable(torch.randn(batch_n,output_data),requires_grad = False)

#搭建网络模型
models = torch.nn.Sequential(OrderedDict([
    ("Line1",torch.nn.Linear(input_data,hidden_layer)),
    ("ReLU1",torch.nn.ReLU()),
    ("Line2",torch.nn.Linear(hidden_layer,output_data))])
)
print(models)

二、参数优化

#模型训练和参数优化
epoch_n = 10000
learning_rate = 1e-4
loss_fn = torch.nn.MSELoss()#定义loss

for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_fn(y_pred,y)
    if epoch%100 == 0:
        print("Epoch:{},Loss:{:.4f}".format(epoch,loss.data.item()))
    models.zero_grad()
    #反向传播
    loss.backward()
    #参数优化
    for param in models.parameters():
        param.data -=param.grad.data*learning_rate

pytorch的torch.optim包中提供了很多可实现参数自动优化的类,比如Adam,SGD等。下面我们用Adam对上面参数优化的代码进行替换。

epoch_n = 10000
learning_rate = 1e-4
loss_fn = torch.nn.MSELoss()#定义loss
optimzer = torch.optim.Adam(models.parameters(),lr = learning_rate)

for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_fn(y_pred,y)
    if epoch%100 == 0:
        print("Epoch:{},Loss:{:.4f}".format(epoch,loss.data.item()))
    optimzer.zero_grad()
    #反向传播
    loss.backward()
    #参数优化
    optimzer.step()

运行代码可以看到模型很快收敛。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值