目录
1、nn.Module——搭建属于自己的神经网络
前言
首先,回顾一下上一次的核心内容:使用nn.Mudule来搭建自己的神经网络模型,有多种方式来构建,主要涉及__init__构造函数和forward方法
,见上一篇文章pytorch_神经网络模型搭建系列(1):自定义神经网络模型
千万记住,魔法方法,定义方式:双下划线+方法名称+双下划线,一旦定义并实现了魔法方法,那么初始化对象的时候会自动调用该魔法方法
- 构造函数init实际上就是一种特殊的魔法方法,只是特别地称其为构造函数,一旦定义实现,创建实例对象的同时,就会自动调用该构造函数
- 构造函数主要用来在创建对象时完成对实例对象属性的一些初始化等操作,
当创建对象时, 对象会自动调用它的构造函数
完成了模型的构建,那得好好分析一下,模型里面的具体构成有哪些?只有深入模型的每一个构造组成,才能更好驾驭模型和设计模型。
其实,模型的构成组分无非就是
- 激活函数
- 线性层和卷积层之类的(指一些矩阵运算操作)
- 损失函数(比如均方误差损失)
- 优化算法(比如SGD)
- 层的连接方式(如Resnet残差网络)
…
(未全部列举出来)
当然,这些都是经常用的,实际上学术圈也在不断研究这些组分的影响和设计不同的组分,因为目前还没有完全弄清楚其中任何一个组分,所以我们都能自由发挥,设计自己的组分以及组合成自己的网络模型
。
模型的搭建已经讲过了,今天说说层的构建,也就是如何自定义层?
-
事实上,在pytorch里面
自定义层也是通过继承自nn.Module类来实现的,前面说过,pytorch里面一般是没有层的概念,层也是当成一个模型来处理的
,这里和keras是不一样的 -
也可以直接通过继承torch.autograd.Function类来自定义一个层,但是这很不推荐,不提倡,至于为什么后面会介绍
-
keras更加注重的是层Layer,pytorch更加注重的是模型Module
-
本文介绍如何通过nn.Module类来实现自定义层
1.1 回顾系统预定义的层
1.1.1 最常用的Linear层
import math
import torch
from torch.nn.parameter import Parameter
from .. import functional as F
from .. import init
from .module import Module
from ..._jit_internal import weak_module, weak_script_method
class Linear(Module):
__constants__ = ['bias']
def __init__(self, in_features, out_features, bias=True):
super(Linear, self).__init__()
self.in_features = in_features
self.out_features = out_features
self.weight = Parameter(torch.Tensor(out_features, in_features))
if bias:
self.bias = Parameter(torch.Tensor(out_features))
else:
self.register_parameter('bias', None)
self.reset_parameters()
def reset_parameters(self):
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
if self.bias is not None:
fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
@weak_script_method
def forward(self, input):
######################显然,这里调用了低层的F.linear############################
return F.linear(input, self.weight, self