问题记录:
1. (未解决)关于加载pretrained model并且修改网络层以适应当前问题进行fine-tune,目前只是了解,并没有实际操作过
2. (未解决)关于保存模型的两种方式,保存整个模型(save model)以及保存模型中的权重(save state_dict), 目前只在pytorch bert fine-tune的实践中用到过save state_dict, 两种都没有手撕过
进度: 实践了保存整个模型(save model)。目前使用过保存整个模型,这种方式不需要现行实例化模型,只需要重新加载保存的文件即可,但是存在一个问题是:如果模型的源代码修改了,会导致无法加载回来。
3. (解决)device的指定: device = torch.device('cuda:0' if torch.cuda.is_available()else 'cpu'),然后在输入网络的数据中,使用x.to(device),这样可以在有GPU的情况下指定使用GPU加速训练。
4. (解决)model的训练模式和验证模式:model.train() 和 model.eval()
在train的状态下,启用BatchNormoalization 和 DropOut
在eval的状态下,不启用BatchNormalization 和 DropOut
5. 关于pytorch 里面的初始化问题
在实验数据的实验下,目前探索到(LSTM)和全连接层(Linear) 原始的初始化方式并不是最优的方式。
Linear的默认初始化方式是 偏差正负根号k(input_size)的均匀分布初始化(uniform),实验中参照tensorflow的初始化方式,也即是:服从均值为0,方差为1的正态分布,实验发现正态分布的初始化有利于更好的收敛。
具体代码实现:
```
nn.init.normal_(self.fc.weight, 0, 1)
nn.init.normal_(self.fc.bias, 0, 1)
```
LSTM的默认初始化同样也是 偏差正负根号k(hidden_size)的均匀分布初始化(uniform),实验中参照tensorflow的初始化方式,即是:glorot初始化方式
具体代码实现:
```
for paramsin self.LSTM._all_weights:
for weightin params:
if "weight" in weight:
nn.init.xavier_normal_(getattr(self.LSTM, weight))
elif "bias" in weight:
nn.init.xavier_normal_(getattr(self.LSTM, weight).view(-1, 1))
else:
raise RuntimeError("not the weight or bias")
```
希望我的未解决都可以变成解决!