每天五分钟深度学习框架pytorch:神经网络工具箱nn的介绍

每天五分钟深度学习框架pytorch:神经网络工具箱nn的介绍
2019年11月09日 15:39 吉运排球

本文重点

我们前面一章学习了自动求导,这很有用,但是在实际使用中我们基本不会使用,因为这个技术过于底层,我们接下来将学习pytorch中的nn模块,它是构建于autograd之上的神经网络模块,也就是说我们使用pytorch封装好的神经网络层,它自动会具有求导的功能,也就是说这部分我们根本不用关系。此专栏主要学习步骤2(神经网络的搭建),参考链接:pytorch学习路线

神经网络工具箱

torch.nn是专门为深度学习设计的工具箱,它的核心数据结构是Module类,它是一个抽象的概念,它既可以表示神经网络的一层,又可以表示一个包含很多层的神经网络。

我们在搭建网络模型的时候,最常见的做法就是继承nn.module,然后编写自己的网络层,下面通过一个简单的例子来看一下,我们如何通过nn.module模块来实现一个自己的全连接层。

自定义全连接层

import torch from torch import nn class MyLinear(nn.Module): def __init__(self, inp, outp): super(MyLinear, self).__init__() self.w = nn.Parameter(torch.randn(outp, inp)) self.b = nn.Parameter(torch.randn(outp)) def forward(self, x): x = x @ self.w.t() + self.b return x layer=MyLinear(4,3)#输入维度是4,输出维度是3 output=layer(torch.randn(2,4))#batch=2

注意点:

如代码所示建立一个全连接层,w和b就是全连接层的权重参数,其中w的维度是(输出,输入)pytorch就是这样的。

自定义层MyLinear必须继承nn.Module,并且我们需要在初始化方法中调用父类nn.Module的构造函数,也就是super(MyLinear,self).__init__()

在构造函数中必须定义自己可学习的参数,并封装成Parameter,nn.Parameter中会自带梯度求梯度功能,此例中定义了参数w和参数b,它们是全连接层的参数。

forward函数中是实现前向传播的过程,不用写反向传播函数,forward前向传播中都是对Parameter操作,所以nn.Module能够利用autograd自动实现反向传播

自定义感知机

前面我们定义了全连接神经网络层,下面我们利用刚刚自定义的全连接神经网络层创建多层感知机。

如图所示它的结构为两个全连接层,最后采用sigmoid函数作为激活函数

class MyLinear(nn.Module): def __init__(self, inp, outp): super(MyLinear, self).__init__() self.w = nn.Parameter(torch.randn(outp, inp)) self.b = nn.Parameter(torch.randn(outp)) def forward(self, x): x = x @ self.w.t() + self.b return x class Perceptron(nn.Module): def __init__(self,in_features,hidden_features,out_features): super(Perceptron,self).__init__() self.layer1=MyLinear(in_features,hidden_features) self.layer2=MyLinear(hidden_features,out_features) def forward(self,x): x=self.layer1(x) x=torch.sigmoid(x) x=self.layer2(x) return x perceptron=Perceptron(3,4,1)

注意点:

在构造init函数中,我们可以利用前面自定义的MyLinear层作为当前module对象的一个子module,它的可学习参数也会成为当前module的可学习参数

我们需要做什么?

我们前面自定义了全连接神经网络,那不是是意味着我们在实际编程中,需要我们手动定义卷积层、全连接层呢?

{!-- PGC_COLUMN --}

为了方便用户使用,nn.modelue工具箱中实现了大多数的神经网络层,也就是说向上面的神经网络层我们是不需要自己定义的,我们可以用他们的,我们只需要自己定义一个类,然后实现nn.module,然后在init方法中将pytorch中已经封装好的网络层组装成自己想要的网络模型,然后写好forward,那么网络模型就搭建完成了。

实例:使用pytorch中已经定义好的全连接层实现感知机

class Perceptron1(nn.Module): def __init__(self,in_features,hidden_features,out_features): super(Perceptron1,self).__init__() self.layer1=nn.Linear(in_features,hidden_features) self.layer2=nn.Linear(hidden_features,out_features) def forward(self,x): x=self.layer1(x) x=torch.sigmoid(x) x=self.layer2(x) return x perceptron=Perceptron1(3,4,1)

如代码所示,我们使用pytorch中已经定义好的全连接层(nn.Linear)来搭建了感知机以后我们的工作就是使用已经定义好的神经网络层大家神经网络,然后再forward中写好前向传播的过程。

下一节专栏将介绍神经网络中已经封装好的神经网络层,我们可以直接使用它们,从而搭建一个复杂的神经网络。

财经自媒体联盟

新浪首页 语音播报 相关新闻 返回顶部