首页 AI Studio教育版 帖子详情
飞桨复现TPN心得
收藏
快速回复
AI Studio教育版 文章课程答疑 919 1
飞桨复现TPN心得
收藏
快速回复
AI Studio教育版 文章课程答疑 919 1

#### 1. 改变某些层(如Conv)的weights

这些layer的weights是一个OrderedDict,其key为名称,如weight、bias,value为对应的权值,可以是numpy.ndarray或者paddle.fluid.framework.ParamBase,为方便操作一般可使用numpy进行操作

在TPN的3D backbone,即ResNetSlowFast中,如果想要使用ResNet2d的参数,PyTorch的操作如下:

```python
# 首先初始化ResNet2d模型,然后根据名称找到3D ResNet在2D ResNet中对应的层,最后对其参数进行修改
# 这里主要是将2D的weight增加一个时间维度,然后expand到与3D weight形状相同,然后赋值给现有的3D层
new_weight = rgetattr(resnet2d,name).weight.data.unsqueeze(2).expand_as(module.weight) / module.weight.data.shape[2]
module.weight.data.copy_(new_weight)


# 对应在Paddle中的操作为:
new_weight = fluid.layers.expand_as(fluid.layers.unsqueeze(rgetattr(resnet2d, name).weight, 2), module.weight) / module.weight.shape[2]
new_dict = OrderedDict()
new_dict['weight'] = new_weight
# 如果由bias需要做相应的修改
module.set_dict(new_dict)
```

#### 2. BatchNorm层的使用小技巧

一般在一个网络中BatchNorm层的初始化方式相对固定,为了做到在自定义初始化方式的同时,避免多次重复书写,既可以自定义一个新类,继承自BatchNorm,改变其初始化方式,也可以使用partial

```python
# 这里将BatchNorm层的weight初始化为1,bias初始化为0
from functools import partial
import paddle.fluid as fluid
from paddle.fluid.dygraph import BatchNorm

BatchNorm = partial(BatchNorm, param_attr=fluid.initializer.ConstantInitializer(1.), bias_attr=fluid.initializer.ConstantInitializer(0.))

# 经过partial定义,用到BatchNorm的时候直接书写BatchNorm(num_channels=...),避免重复指定相同的初始化方式。当然有个别不同也可以直接修改
```

#### 3. Conv层 kaiming 初始化

paddle中的kaiming初始化使用的接口为`fluid.initializer.MSRAInitializer`

```python
# API定义
class paddle.fluid.initializer.MSRAInitializer(uniform=True, fan_in=None, seed=0)

# 其中`uniform`可以控制使用 kaiming normal 或者 kaiming uniform
# 第二个参数`fan_in`默认为None,即默认为fan_in模式。但是如果想要使用fan_out,可以自己根据Conv层的定义,计算出对应的fan_out值,然后赋值给这里的fan_in,即可实现fan_out初始化
# 对于一个输入通道为3,输出通道为32,filter_size为(3x3)的卷积,如果使用fan_out模式,则应定义为
conv = fluid.dygraph.Conv2D(3, 32, 3, param_attr=fluid.initializer.MSRAInitializer(uniform=False, fan_in=32 * 3 * 3))
```

#### 4. Conv层weight形状

一个输入通道为3,输出通道为32,filter_size为(7x7)的卷积层,其weight形状为**(32, 3, 7, 7)**

#### 5. 停止训练某些层的参数

如果某些层的参数不需要训练,可将其`trainable`设置为False

```python
layer = Conv2D or BN or ...

for param in layer.parameters():
param.trainable = False
```

#### 6. Paddle和PyTorch的statedict

paddle和pytorch的state_dict的命名方式主要区别是BN层的mean和variance

* paddle中命名为 `_mean` 和 `_variance`
* pytorch中命名为 `running_mean` 和 `running_var`

0
收藏
回复
全部评论(1)
时间顺序
thinc
#2 回复于2020-08

很棒

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户