Bootstrap

nn.functional与nn.Module的区别,自定义层步骤(创建model步骤)

nn.functional与nn.Module的区别:

Pytorch和神经网络相关的功能组件大多都封装在 torch.nn模块下。这些功能组件的绝大部分既有函数形式实现,也有类形式实现。

nn中还有一个很常用的模块:nn.functional。nn中大多数layer在functional中都有一个与之对应的函数。

nn.functional中的函数和nn.Module的主要区别在于,用nn.Module实现的layers是一个特殊的类,都是由class Layer(nn.Module)定义,会自动提取可学习的参数而nn.functional中的函数更像是纯函数,由def function(input)定义。
 

注意:

1). 如果模型有可学习的参数时,最好使用nn.Module

2). 激活函数(ReLU、sigmoid、Tanh)、池化(MaxPool)等层没有可学习的参数,可以使用对应的functional函数

3).卷积、全连接等有可学习参数的网络建议使用nn.Module

4). dropout没有可学习参数,但建议使用nn.Dropout而不是nn.functional.dropout

nn.functional(一般引入后改名为F)有各种功能组件的函数实现。例如:

(激活函数) * F.relu * F.sigmoid * F.tanh * F.softmax
(模型层) * F.linear * F.conv2d * F.max_pool2d * F.dropout2d * F.embedding
(损失函数) * F.binary_cross_entropy * F.mse_loss * F.cross_entropy

为了便于对参数进行管理,一般通过继承 nn.Module 转换成为类的实现形式,并直接封装在 nn 模块下。例如:

(激活函数) * nn.ReLU * nn.Sigmoid * nn.Tanh * nn.Softmax
(模型层) * nn.Linear * nn.Conv2d * nn.MaxPool2d * nn.Dropout2d * nn.Embedding
(损失函数) * nn.BCELoss * nn.MSELoss * nn.CrossEntropyLoss


参考:nn.functional 和 nn.Module入门讲解_瞳瞳瞳呀的博客-CSDN博客

参考:神经网络工具箱——nn.funtional、初始化策略-CSDN博客

要实现一个自定义层大致分以下几个主要的步骤:

1) 自定义一个类,继承自Module,并且一定要实现两个基本的函数

     构造函数_init_

      前向计算函数forward函数

2)在构造函数_init_中实现层的参数定义。

     例如: Linear层的权重和偏置

 Conv2d层的in channels, out channels, kernel size, stride=1,padding=0, dilation=1groups=1,bias=True, padding_mode='zeros'这一系列参数

3) 在前向传播forward函数里面实现前向运算。

    通过torch.nn.functional函数来实现

    自定义自己的运算方式。如果该层含有权重,那么权重必须是nn.Parameter类型

4)补充:一般情况下,我们定义的参数是可以求导的,但是自定义操作如不可导需要实现backward函数。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;