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函数。