Pytorch Tutorial

问题记录:

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")

```

希望我的未解决都可以变成解决!

你可能感兴趣的:(Pytorch Tutorial)