有文章说:减小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博客
但我还没搞懂他们的区别。