Pytorch创建模型-小试牛刀

Pytorch创建模型

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

torch模型的定义

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

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

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

在这里插入图片描述

训练过程

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

最简单的训练过程可以利用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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zwp&Zyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值