Deep learning PyTorch:目标1超出范围
我刚刚开始深入学习,不知道如何修改我的模型来修复它。 它说目标1超出范围,所以我应该更改什么参数使其工作。当输出更改为Deep learning PyTorch:目标1超出范围,deep-learning,pytorch,Deep Learning,Pytorch,我刚刚开始深入学习,不知道如何修改我的模型来修复它。 它说目标1超出范围,所以我应该更改什么参数使其工作。当输出更改为2时,它工作。然而,该模型的目标是预测两类分类。此外,当输出为2时,训练损失变为nan 数据是一个将形状(15958,4)转换为张量格式的数据框 抱歉Split\u NN是一个类: # SplitNN # to protect privacy and split class SplitNN: def __init__(self, models, optimizers):
2
时,它工作。然而,该模型的目标是预测两类分类。此外,当输出为2时,训练损失
变为nan
数据
是一个将形状(15958,4)
转换为张量格式的数据框
抱歉Split\u NN
是一个类:
# SplitNN
# to protect privacy and split
class SplitNN:
def __init__(self, models, optimizers):
self.models = models
self.optimizers = optimizers
self.data = []
self.remote_tensors = []
def forward(self, x):
data = []
remote_tensors = []
data.append(self.models[0](x))
if data[-1].location == self.models[1].location:
remote_tensors.append(data[-1].detach().requires_grad_())
else:
remote_tensors.append(
data[-1].detach().move(self.models[1].location).requires_grad_()
)
i = 1
while i < (len(models) - 1):
data.append(self.models[i](remote_tensors[-1]))
if data[-1].location == self.models[i + 1].location:
remote_tensors.append(data[-1].detach().requires_grad_())
else:
remote_tensors.append(
data[-1].detach().move(self.models[i + 1].location).requires_grad_()
)
i += 1
data.append(self.models[i](remote_tensors[-1]))
self.data = data
self.remote_tensors = remote_tensors
return data[-1]
def backward(self):
for i in range(len(models) - 2, -1, -1):
if self.remote_tensors[i].location == self.data[i].location:
grads = self.remote_tensors[i].grad.copy()
else:
grads = self.remote_tensors[i].grad.copy().move(self.data[i].location)
self.data[i].backward(grads)
def zero_grads(self):
for opt in self.optimizers:
opt.zero_grad()
def step(self):
for opt in self.optimizers:
opt.step()
列车模型如下:
def train(x, target, splitNN):
#1) Zero our grads
splitNN.zero_grads()
#2) Make a prediction
pred = splitNN.forward(x)
#3) Figure out how much we missed by
criterion = nn.NLLLoss()
loss = criterion(pred, target)
#4) Backprop the loss on the end layer
loss.backward()
#5) Feed Gradients backward through the nework
splitNN.backward()
#6) Change the weights
splitNN.step()
return loss, pred
最后是培训部分,也是出现问题的部分:
send
功能用于将模型分配给节点,因为这是为了模拟联合学习而设置的
for i in range(epochs):
running_loss = 0
correct_preds = 0
total_preds = 0
for (data, ids1), (labels, ids2) in dataloader:
# Train a model
data = data.send(models[0].location)
data = data.view(data.shape[0], -1)
labels = labels.send(models[-1].location)
# Call model
loss, preds = train(data.float(), labels, splitNN)
# Collect statistics
running_loss += loss.get()
correct_preds += preds.max(1)[1].eq(labels).sum().get().item()
total_preds += preds.get().size(0)
print(f"Epoch {i} - Training loss: {running_loss/len(dataloader):.3f} - Accuracy: {100*correct_preds/total_preds:.3f}")
错误显示问题发生在loss,preds=train(data.float(),labels,splitNN)
实际错误消息:
During handling of the above exception, another exception occurred:
IndexError Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in nll_loss(input, target, weight, size_average, ignore_index, reduce, reduction)
1836 .format(input.size(0), target.size(0)))
1837 if dim == 2:
-> 1838 ret = torch._C._nn.nll_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
1839 elif dim == 4:
1840 ret = torch._C._nn.nll_loss2d(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
IndexError: Target 1 is out of bounds.
请帮帮我。谢谢您好,欢迎来到stackoverflow!请阅读以下内容:。在您的代码片段中,有很多东西没有定义:
模型
,数据
(类型、形状,那个奇怪的“发送”函数…,splitNN
,以及最重要的训练
函数本身。还要添加实际的错误消息。没有这些信息,解决问题真的很难。干杯:)@TrialError抱歉给您带来不便。我刚刚更新了信息。谢谢您的提醒;)不麻烦!不过,你的代码对我来说还是没有多大意义。SplitNN仍然没有定义,它肯定不是一个函数:您正在调用zero\u grad
、step
、forward
和backward
。前两种方法通常与优化器关联,最后一种方法在丢失时调用,并且只有forward实际上属于一个模型。你需要解释一下这种行为。此外,除位置外,不使用<代码>型号代码>。这不是一个完整/可复制的示例。Hi@trialNerror,SplitNN
代码已更新。非常感谢你。关于模型
未使用,设置为我们将模型发送到位置
,然后位置
进行培训。此设置的目的是模拟联合学习,而不是集中学习
During handling of the above exception, another exception occurred:
IndexError Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in nll_loss(input, target, weight, size_average, ignore_index, reduce, reduction)
1836 .format(input.size(0), target.size(0)))
1837 if dim == 2:
-> 1838 ret = torch._C._nn.nll_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
1839 elif dim == 4:
1840 ret = torch._C._nn.nll_loss2d(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
IndexError: Target 1 is out of bounds.