赞
踩
有文章说:减小batch_size 解决。但是减小到4还是解决不了。
上一篇文章CSDN:说with torch.no_grad(),就是不生成计算图。计算结果没有差异。
但是!!!对于计算机资源的占用却有差异!不生成计算图,GPU就会小很大的负担
如图,bath_size = 4,依然报错
在for i,(data,labels) in enumerate(data)前加上这句代码:顺利执行。同时,batch_size取到128也照样可以运行。
所以出现此错误,不是单纯减小batch_size()这么简单。
----------------------------更新--------------------------
经过一段时间的学习,现在遇到了预训练模型与微调。对with torch.no_grad()有了新的认识。
将与训练模型用于下游任务有如下几个中点:
1.构建token
2.修改模型
3.fine-turning模型
比如,我们利用bert-base-chinese做分类任务,
首先加载预训练模型
- from transformers import AutoModel
- model = AutoModel.from_pretrained('ckiplab/bert-base-chinese')
然后修改模型,加入用于不同下游任务的输出层
- class Model(torch.nn.Module):
- def __init__(self):
- super().__init__()
- self.pretrained = AutoModel.from_pretrained('ckiplab/bert-base-chinese')
- self.fc = torch.nn.Linear(768,2) # 为模型添加新的结构 输出层 2分类任务
-
-
- def forward(self, input_ids, labels):
- with torch.no_grad(): # 原来的与训练模型不用更新参数
- out = self.pretrained(ipythonput_ids) # 原始预训练模型输出结果
- out = self.fc(out.last_hidden_state[:,0]) # 放入下游具体任务的输出层中
- out = out.softmax(dim = 1) # 并进行softmax操作
- reture out # 才是最终的二分类输出结果
-
- model = Model()
在这里通过with torch.no_grad():在更新梯度的时候,就可以避开原来预训练好的模型。也就是说冻结元模型参数
或者通过如下操作也可以实现
- class Model(torch.nn.Module):
- def __init__(self):
- super().__init__()
- self.pretrained = AutoModel.from_pretrained('ckiplab/bert-base-chinese')
- self.fc = torch.nn.Linear(768,2) # 为模型添加新的结构 输出层 2分类任务
-
-
- def forward(self, input_ids, labels):
- for param in self.pretrained.parameters(): # 冻结元模型参数
- param.requires_grad_(False)
- out = self.pretrained(ipythonput_ids) # 原始预训练模型输出结果
- out = self.fc(out.last_hidden_state[:,0]) # 放入下游具体任务的输出层中
- out = out.softmax(dim = 1) # 并进行softmax操作
- reture out # 才是最终的二分类输出结果
-
- model = Model()
-
-
而对于with torch.no_grad() 和 param.requires_grad_(False) 的区别,可以参考:什么时候该用with torch.no_grad()?什么时候该用.requires_grad ==False?_Y. F. Zhang的博客-CSDN博客
但我还没搞懂他们的区别。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。