赞
踩
读这篇文章之前建议先看一下这篇文章:.numpy()、.item()、.cpu()、.clone()、.detach()及.data的使用 && tensor类型的转换 补充一下数据转换的基础,可以torch的一些操作
Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
解决办法: 加载模型的时候,数据和model放入cuda-gpu 上进行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
input_ids, attention_masks, token_type_ids, target = input_ids.to(device), attention_masks.to(
device), token_type_ids.to(device), target.to(device)
RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile withTORCH_USE_CUDA_DSA
to enable device-side assertions.
(如果,先暂时不用GPU训练,全在cpu上训练,你会发现它的报错会更加细致)
有两种可能:
第一种可能:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-649D3OEv-1689909122848)(D:\S\typora文件夹\img\image-20230717212430808.png)]
设置一个映射表,把这些标签映射到从零开始的一些新的”标签“中去。
a = list(range(100,117))
a.remove(105)
a.remove(111)
label2label = a
label2label
# [100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116]
# 可以通过label2label.index(原来的label) 映射到新的label: 0-14
# 也可以直接label2label[新的label] 映射回原来的label
# 在自定义数据集的时候就是这样
target = torch.tensor(label2label.index(int(self.y[index])))
第二种可能:
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument weight in method wrapper_CUDA__native_layer_norm)
RuntimeError: The size of tensor a (5) must match the size of tensor b (512) at non-singleton dimension 2
eg. 如果下面的self.fc传入的最后一个维度是768维,而此处定义的fc是512x200的因此导致了这个错误出现,正确的应该将第一个全连接层改为768x200
class MypretrainModel(nn.Module):
def __init__(self,is_lock=False):
super(MypretrainModel,self).__init__()
self.encoder = Encoder()
self.fc = nn.Linear(512,200) # 此处应该nn.Linear(768,200)
self.dropout = nn.Dropout()
self.classifier = nn.Linear(200,label_nums)
def forward(self,x):
x,_ = self.encoder(x)
x = F.relu(self.fc(x))
x = self.dropout(x)
out = self.classifier(x)
return out
Python: too many values to unpack (expected 2,3…n)
x,y,z,w = (1,'torch',[3,'b'])
# 左边是四个变量,右边元组中只有三个变量,因此左右不统一会进行报错。
x,y,z = (1,'torch',[3,'b'])
# 正确做法,左右变量个数对应。
val= torch.tensor([item.cpu().detach().numpy() for item in val]).cuda()
forward() takes 2 positional arguments but 3 were given
在forward中明明正确数量的参数,却报错:forward() takes 2 positional arguments but 3 were given;
问题分析:
使用nn.Sequential()定义的网络,只接受单输入def forward(self, input):
在前向传播中只有一个参数,但是在后面使用的时候出现了多个参数,如下例子都是传入model的参数过多。
eg.1:
def __init__(self):
self.backbone=nn.Sequential(nn.lstm(input_size=20, hidden_size=40, num_layers=2),
nn.linear(in_features=40, out_features=2))
def forward(self, input):
h0 = torch.randn(hidden_layers, batch_size, hidden)
c0 = torch.randn(hidden_layers, batch_size, hidden)
output, _ = self.backbone(input) (对)
output, _ = self.backbone(input, ho) (错误,因为nn.Sequential()定义的网络,只接受单输入)
eg.2: model()只能前向传播一个变量,但是传入了两个
# model前向传播部分:
def forward(self,x):
x,_ = self.bert_pretrained(x)
x = self.dropout(x)
x = F.relu(self.fc(x))
out = self.classifier(x)
return out
model = MypretrainModel()
output = model(input_ids,target) # output = model(input_ids,target)
local variable referenced before assignment
a = 5
def add(a):
a += 5
add(a) # 会报错
# 正确做法:
def add(a):
global a
a += 5
add(a)
.numpy()、.item()、.cpu()、.clone()、.detach()及.data的使用 && tensor类型的转换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。