Pytorch创建模型-小试牛刀

Pytorch创建模型

写这篇博客的初衷是因为非常多情况下需要用到pytorch的包,但是每一次调用都需要额外编写函数,评估呀什么的,特别要牵扯上攻击和防御,所以就想写个博客,总结一下,彻底研究这个内容

torch模型的定义

一般来说,都会创建一个类(继承torch.nn.Module)作为模型。一开始入门,只需要关注两个函数。

特别用来提醒torch的全连接和keras的全连接不同

def __init__(self):
#用来完成模型的细节定义
def forward(self,x):
#用来表示模型具体的前向传播过程

Pytorch创建模型-小试牛刀_第1张图片

训练过程

数据处理会专门另作一篇博客,更新后会放上链接

最简单的训练过程可以利用torch的自带函数,设置优化器,损失函数,如下:

losses = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(params=torchmodel.parameters(), lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0, amsgrad=False)

之后在完成数据导入后,最关键的就是输入数据(前向传播),计算损失(求梯度),更新权重(反向传播)

outputs = model(X_train)
optimizer.zero_grad()
loss = losses(outputs, y_train)
loss.backward()
optimizer.step()

完整代码可以参见工程

模型保存与读取

保存与读取的时候格式要相互匹配。

    torch.save(torchmodel.state_dict(), path)
    Mymodel.load_state_dict(torch.load(path))

    torch.save(torchmodel, path)
    Mymodel = torch.load(path)

体会

  1. model.eval() 与 model.train() 在模型训练和测试的时候要保持好逻辑关系

  2. 如果想要查看模型特定的参数 1 for name in model.state_dict(): 2 model.named_parameters() 3 for layer in model.modules():
    for layers in torchmodel.modules():
    print(layers.requires_grad_()) 固定某层
    一个是设置不要更新参数的网络层为false,另一个就是在定义优化器时只传入要更新的参数。当然最优的做法是,优化器中只传入requires_grad=True的参数,这样占用的内存会更小一点,效率也会更高。

更新 11.25 ———— 查看参数以及提取某层特定输出

提取某层的输出比较简单的方法就是在forward内部,对需要记录的数据保存下来。
在forward函数内,对数据保存,以load——state保存模型互不干扰!!!

另外一种,实用的方法就是hook,钩子方法。

主要实现途径是设置函数hook,完成对output的一些操作,例如保存。在通过把某个层与hook函数挂上关系,就可以实现。
但一定要在最后取消hook。

    activation = {}
    def get_activation(name):
        def hook(model, input, output):
            # 如果你想feature的梯度能反向传播,那么去掉 detach()
            activation[name] = output.detach()
        return hook
    h = model.dense[0].register_forward_hook(get_activation('希望的输出'))
    
    !!!!
    h.remove()

你可能感兴趣的:(机器学习,pytorch,深度学习,python)