Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有神经网络训练方面的问题。亏损不减_Python_Machine Learning_Pytorch - Fatal编程技术网

Python 有神经网络训练方面的问题。亏损不减

Python 有神经网络训练方面的问题。亏损不减,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我主要关注这个项目,但正在做一个像素级的分类。我有8个班和9个波段的图像。我的图像被网格化为9x128x128。我的损失没有减少,训练的准确性也没有太大的波动。我猜我的模型有问题。任何建议都将不胜感激!使用随机森林,我获得了至少91%的准确率 我的课程极不平衡,因此我尝试根据训练数据中的课程比例调整训练权重 # get model learning_rate = 0.0001 model = unet.UNetSmall(8) optimizer = optim.Adam(model.param

我主要关注这个项目,但正在做一个像素级的分类。我有8个班和9个波段的图像。我的图像被网格化为9x128x128。我的损失没有减少,训练的准确性也没有太大的波动。我猜我的模型有问题。任何建议都将不胜感激!使用随机森林,我获得了至少91%的准确率

我的课程极不平衡,因此我尝试根据训练数据中的课程比例调整训练权重

# get model
learning_rate = 0.0001
model = unet.UNetSmall(8)
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# set up weights based on data proportion
weights = np.array([0.79594768, 0.07181202, 0.02347426, 0.0042031, 0.00366211, 0.00764327, 0.07003923, 0.02321833])
weights = (1 - weights)/7
print('Weights of training data based on proportion of the training labels.  Not compted here')
print(weights)
print(sum(weights))
criterion = nn.CrossEntropyLoss(weight = weight)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
基于训练标签比例的训练数据权重。 此处未计算[0.02915033 0.13259828 0.13950368 0.1422567 0.14233398 0.14176525 0.13285154 0.13954024] 1.0000000000000002

我已经使用transforms.functional.normalize函数规范化了数据。我计算了训练数据的平均值和标准偏差,并将此增强添加到我的数据加载器中

dataset_train = data_utils.SatIn(data_path, 'TrainValTest.csv', 'train', transform=transforms.Compose([aug.ToTensorTarget(), aug.NormalizeTarget(mean=popmean, std=popstd)]))
我通过旋转和翻转图像来增强预处理中的训练数据。1图像网格随后变为8

我检查了我的训练数据是否与我的课程相匹配,所有的东西都检查出来了。 因为我使用了8个类,所以我选择使用CrossEntropyLoss,因为它内置了Softmax

当前模型

class UNetSmall(nn.Module):
    """
    Main UNet architecture
    """
    def __init__(self, num_classes=1):
        super().__init__()
        # encoding
        self.conv1 = encoding_block(9, 32)
        self.maxpool1 = nn.MaxPool2d(kernel_size=2)
        self.conv2 = encoding_block(32, 64)
        self.maxpool2 = nn.MaxPool2d(kernel_size=2)
        self.conv3 = encoding_block(64, 128)
        self.maxpool3 = nn.MaxPool2d(kernel_size=2)
        self.conv4 = encoding_block(128, 256)
        self.maxpool4 = nn.MaxPool2d(kernel_size=2)

        # center
        self.center = encoding_block(256, 512)

        # decoding
        self.decode4 = decoding_block(512, 256)
        self.decode3 = decoding_block(256, 128)
        self.decode2 = decoding_block(128, 64)
        self.decode1 = decoding_block(64, 32)

        # final
        self.final = nn.Conv2d(32, num_classes, kernel_size=1)

    def forward(self, input):

        # encoding
        conv1 = self.conv1(input)
        maxpool1 = self.maxpool1(conv1)
        conv2 = self.conv2(maxpool1)
        maxpool2 = self.maxpool2(conv2)
        conv3 = self.conv3(maxpool2)
        maxpool3 = self.maxpool3(conv3)
        conv4 = self.conv4(maxpool3)
        maxpool4 = self.maxpool4(conv4)

        # center
        center = self.center(maxpool4)

        # decoding
        decode4 = self.decode4(conv4, center)
        decode3 = self.decode3(conv3, decode4)
        decode2 = self.decode2(conv2, decode3)
        decode1 = self.decode1(conv1, decode2)
        # final
        final = nn.functional.upsample(self.final(decode1), input.size()[2:], mode='bilinear')
        return final
训练方法

def train(train_loader, model, criterion, optimizer, scheduler, epoch_num):

    correct = 0
    totalcount = 0

    scheduler.step()

    # iterate over data
    for idx, data in enumerate(tqdm(train_loader, desc="training")):
        # get the inputs and wrap in Variable
        if torch.cuda.is_available():
            inputs = Variable(data['sat_img'].cuda())
            labels = Variable(data['map_img'].cuda())
        else:
            inputs = Variable(data['sat_img'])
            labels = Variable(data['map_img'])

        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels.long())
        loss.backward()
        optimizer.step()

        test = torch.max(outputs.data, 1)[1] == labels.long()
        correct += test.sum().item()
        totalcount += test.size()[0] * test.size()[1] * test.size()[2]

    print('Training Loss: {:.4f}, Accuracy: {:.2f}'.format(loss.data[0], correct/totalcount))
    return {'train_loss': loss.data[0], 'train_acc' : correct/totalcount}
epoch循环中的训练调用

lr_scheduler.step()
train_metrics = train(train_dataloader, model, criterion, optimizer, lr_scheduler, epoch)
若干历元迭代输出

####纪元0/19 ----------培训:100%|████████████████████████████████████████████████████████████████████████|
84/84[00:17很难用这些信息调试您的模型,但其中一些想法可能会在某些方面对您有所帮助:

  • 尝试在更小的数据和多个时代上过度调整您的网络,而不首先进行扩展,比如说多个时代上的一两个批次。如果这一个不起作用,那么您的模型就无法对数据和所需目标之间的关系建模,或者您在某个地方出现错误。此外,以这种方式调试它更容易
  • 我不确定权重的想法,也许可以尝试对代表性不足的类进行抽样,以使其更加平衡(在数据集中重复一些代表性不足的示例)。好奇这个想法来自哪里,从未听说过
  • 在应用您自己的定制之前,您是否尝试过从您提供的回购中运行模型?它的性能如何,您是否能够复制他们的发现?根据我的理解,为什么您认为此架构非常适合您的不同情况?您提供的链接中的丢失功能不同,而架构是一样的。我没有读过这篇文章,也没有试过你的模型,但看起来有点奇怪
  • GitHub repo内的链接指向一篇博客文章,其中建议更大的批次,因为它可以稳定培训,您的批次大小是多少
  • 也许从更小更简单的模型开始,然后从那里开始工作
  • 最后是最重要的一点;我不认为这是提出此类问题的最佳场所(尤其是面向研究的问题),但我知道您已经就GitHub问题提出了这一问题,也许可以尝试直接联系作者


    如果我是你,我会从最后一点开始,彻底了解运营及其对你目标的影响,祝你好运。

    该模型不符合我的目的,我对它们了解不够,不知道为什么。我切换到另一个发现的unet模型,一切都开始工作。
    准确度取决于随机森林所产生的结果。当我尝试移除权重时,我得到的是nan作为损失。使用新方法,损失降低到~0.2,而不是徘徊在0.5以上。训练准确度在前50个时期迅速提高到80度,在接下来的50个时期没有超过80度


    我计划测试一些不同的模型,类似于作者在论文中所做的。我将创建一个简单的基础,并将结果与UNet和VGG16进行比较。

    我觉得我应该写一个答案来回答您的精彩评论和问题。谢谢。我能提供更多有用的信息吗?1.这是一个很好的建议。我会我试着这样做,看看会发生什么。2.来自pytorch论坛和CrossEntropyLoss文档:“这在训练C类的分类问题时很有用。如果提供,可选参数权重应该是一个1D张量,为每个类分配权重。这在训练集不平衡时特别有用。”3.我曾尝试运行该模型,但正如您所说,我需要深入研究该模型的功能。我通常会找到一个“接近”的示例根据我的需要,然后在学习的过程中对其进行修改。该示例是一个使用pytorch的土地覆盖分类,因此它似乎非常适合。它在结构和数据加载方面非常有用。4.我目前使用的批处理大小为8。我可以试着将其提高。5.这是一个好主意。是时候深入研究模型并简化了。@mkmitchell我知道ubt您将从这里获得更多帮助,除非有人深入到体系结构中并适应各种细节,这就是我建议直接询问作者的原因。@mkmichell,您能分享一些关于如何解决问题的信息吗?代码将很有用。Thanks@AbdulKarimKhan最后我换成了一个完整的UNet ins而不是帖子中的UNetSmall代码。在那之后,我立即获得了更好的结果。你是否使用RGB或更高的频道进行训练?我使用的是卫星数据和多个索引,因此有9个频道,而不仅仅是3个。