4.1.2激活函数
PyTorch实现了常见的激活函数,其具体接口信息见官方文档1。 这些激活函数可以作为独立的层使用。 这里介绍最常见的激活函数ReLU。 公式如下。
代码:
relu=nn.relu(inplace=true ) input=t.randn ) 2,3 ) print ) input ) output=relu ) input ) prinput ) #未等于0
tensor ([ 1.2836,2.0970,-0.0456],
[ 1.5909,- 1.3795,0.5264 ] )
tensor ([ 1.2836,2.0970,0.0000 ],
[ 1.5909,0.0000,0.5264 ] )
ReLU函数具有inplace参数,如果设置为True,则输出将直接复盖输入,从而节省内存/图形内存。 这是因为在计算ReLU的反向传播时,可以根据输出估计反向传播的梯度。 但是,只有少数autograd操作支持inplace操作,如tensor.sigmoid_ ()。 通常不要使用inplace操作,除非您清楚知道自己在做什么。
以上例子中,基本上各层的输出原样作为下一层的输入,将这种网络称为前馈传播网络。 虽然每次为这样的网络编写复杂的forward函数有点麻烦,但是这里有两种简化方法: ModuleList和Sequential。 其中,Sequential是一个特殊的模型,包含几个子模型,向前传播时输入会一个接一个地传递。 ModuleList也是一种特殊的module,可以包含若干个子module,可以像使用list一样使用,但不能直接将输入传递到ModuleList。 让我举例说明一下。
代码:
# Sequential的三种写法net1=nn.Sequential () net1.add _ module (conv )、nn.conv2d ) 3、3、3 ) ) net1.add_module nn.ReLU ) ) net2=nn.sequential ) nn.conv2d nn.ReLU () ) fromcollectionsimportorderedddictnet3=nn.sequential (orded ) 3 nn.ReLU () ) ) )、net1: )、net1 ) print )、net2) print )、net3: )、net3)的输出:
net 1:序列(
(conv ) : conv 2d (3,3,Kernel_size=) 3,3 ),stride=(1,1 ) )
(batchnorm ) :batchnorm2d(3,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True )
(activation_layer ) : ReLU ) ) ) ) )。
)
net2: Sequential (
(0) 3360conv2d ) 3,3,kernel _ size=(3,3 ),stride=(1,1 ) )
)1) :batchnorm2d(3,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True ) ) ) ) )。
((2) : ReLU ) ) ) )。
)
net3: Sequential (
(conv1 ) : conv 2d (3,3,Kernel_size=) 3,3 ),stride=(1,1 ) )
(bn1 ) :batchnorm2d(3,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True ) ) )。
(relu1) : ReLU ) )
)
可以从#名称或序列号中取出子模型,
代码:
可以通过名称或序列号检索#子modulenet1.conv、net2[0]、net3.conv1的输出。
(conv2d (3,3,Kernel_size=) 3,3 ),stride=(1,1 ) ),
conv 2d (3,3,Kernel_size=) 3,3 ),stride=(1,1 ) ),
conv 2d (3,3,kernel _ size=(3,3 ),stride=(1,1 ) )
代码:
input=t.rand (1,3,4, 4 ) output1=net1(input ) output2=net2) input ) output3=net3 ) input ) output4=net3.relu1) net1.batchnorm ) net
output1tensor ([ 0.4223,0.0000 ],
[ 0.0000,1.4133 ],
[ 0.0000,0.0343 ],
[ 0.8903,0.7163 ],
[ 0.9817,0.0000 ],
[ 0.7821,0.0000 ],grad_fn=ReluBackward0)
output2tensor ([ 0.0000,0.5348 ],
[ 1.0742,0.0000 ],
[ 1.2695,0.0000 ],
[ 0.0000,0.3837 ],
[ 0.0000,0.0000 ],
[ 1.6453,0.0000 ],grad_fn=ReluBackward0)
output3tensor ([ 0.1690,0.7540 ],
[ 0.0000,0.7581 ],
[ 1.6805,0.0000 ],
[ 0.0000,0.0000 ],
[ 0.2216,0.5082 ],
[ 0.9433,0.0000 ],grad_fn=ReluBackward0)
output4tensor ([ 0.4223,0.0000 ],
[ 0.0000,1.4133 ],
[ 0.0000,0.0343 ],
[ 0.8903,0.7163 ],
[ 0.9817,0.0000 ],
[ 0.7821,0.0000 ],grad_fn=ReluBackward0)
ModuleList是Module的子类,代码:
modellist=nn.module list ([ nn.linear (3,4 ),nn.ReLU ),nn.linear) ] ) input=t.randn ),1,3 )