Deep learning PyTorch:目标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):

我刚刚开始深入学习,不知道如何修改我的模型来修复它。 它说目标1超出范围,所以我应该更改什么参数使其工作。当输出更改为
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.