二、模型定义
1、models.py
(1)Encoder:
在此模型中,encoder端仅处理图像。作者使用了pytorch中自带的resnet101预训练模型作为encoder的主要组成部分。resnet101冻结大部分参数,但仍需要两个改动来适应我们自己的模型。第一个改动是去掉了后两层分类层,因为此模型不需要对图像进行分类;第二个改动是后5层参数参与反向传播,用来自适应自身模型。
①adaptive_pool(out) 用来将图像转换为目标形状,代码中是将图像转为 batch_size × 2048 × 14 × 14。
②permute(0,2,3,1) 用来改变图像通道的先后顺序,代码中是将图像转为 batch_size × 14 × 14 × 2048。
(2)Attention:
Attention的目的是使decoder端解码时更加有目标地学习图像特征。
代码中,首先定义两个线性层encoder_att、decoder_att,用于对图像特征向量即encoder的输出、decoder的隐藏层进行线性变化;其次定义full_att用于降维,使后面便于使用softmax求出每个像素点对应的权重。
①.squeeze(1) 用来扩充维度,1代表在第2个维度扩充,例如:原tensor为32 × 196,变化后为32 × 1 × 196。
②.unsqueeze(1) 用来降低维度,1代表在第2个维度降低,例如:原tensor为32 × 1 × 196,变化后为32 × 196。
这里回忆一下Relu和Softmax:
1、Relu()非线性激活函数:
公式:y = max(0, x) 即 如果函数值大于0则输出函数值,小于0则输出为0。
2、Softmax:
公式:
,例如三个输出,ln1 ln2 ln3,则经过softmax后,输出变为1/6 2/6 3/6。
今天就到这里啦!~~