参考资料:
《深度学习之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()
运行代码可以看到模型很快收敛。