【问题标题】:Training works but prediction produces constant values (cnn with pytorch)训练有效,但预测产生恒定值(使用 pytorch 的 cnn)
【发布时间】:2020-11-09 04:00:00
【问题描述】:

我有一个模型试图预测图像的类别:猫或狗。我在训练中获得了 95% 的准确率。但是,当我尝试预测单个图像时,每次运行模型时,我都会遇到几乎恒定的输出。有一些非常量的值,但它们大多看起来像灾难性的故障。

我从论坛上阅读了类似的主题,但这并没有帮助,因为似乎没有针对此问题的特定解决方案...

我尝试了以下方法:

  • 将纪元 5 更改为 15、20、30...
  • lr = 0.001 更改为 0.01、0.0001...
  • 我使用 dropout 正则化模型和批处理实现 归一化模型...
  • 我更改了测试图片...
  • 将最后一个激活层从 softmax 更改为 torch.sigmoid...
  • 将批量大小从 100 减少到 30、75...
  • 尝试使用批次,结果是正常的 acc、loss 和 预测。
  • 我的数据集是按比例缩放的,论坛中提到的解决方案。
  • 我的最佳选择是 Adam,在论坛中提到它作为解决方案。
  • 正在使用torch.data.DataLoader加载数据集...
  • 随机抽样...
  • 我保存并加载了模型,以防出现问题。 但是,我已经检查过 state_dict 的不同...
  • 我重新准备了导致常量值发生变化的数据 否则(狗对猫),不知何故?不知道这是不是巧合。

信息:

数据集: https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip

这是我在 Jupyter Notebook 中的所有预测代码,请随时调查。我真的厌倦了这个解决方案。非常感谢任何帮助!

https://github.com/yusuftengriverdi/neural_networks/blob/master/CNN_Last.ipynb

网络上的类似主题:

https://discuss.pytorch.org/t/rnn-predicting-a-constant-output/40397/5

https://discuss.pytorch.org/t/cnn-does-not-predict-properly-does-not-converge-as-expected/43567

https://discuss.pytorch.org/t/making-a-prediction-with-a-trained-model/2193

https://datascience.stackexchange.com/questions/46779/predict-gives-the-same-output-value-for-every-image-keras

https://github.com/keras-team/keras/issues/6447

PyTorch model prediction fail for single item

Having trouble with CNN prediction

【问题讨论】:

    标签: python tensorflow deep-learning pytorch conv-neural-network


    【解决方案1】:

    如果某些东西在训练中有效但在预测中失败,最可能的原因是您没有以相同的方式预处理数据。

    我看了一下笔记本(代码量很大,以后请把它浓缩到这里的相关部分)。一目了然 - 这是您的预测代码,它不能按预期工作:

    img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
    plt.imshow(img, cmap='gray')
    x = torch.Tensor([i for i in img]).view(-1, 50, 50)
    y= torch.Tensor([0,1]).to(device)
    test_x = x.view(-1, 1, 50, 50)
    test_x = test_x.to(device)
    net.eval()
    #with torch.no_grad():
    yhat.append(net(test_x))
    

    但在训练期间,您使用的是数据加载器

    testloader = DataLoader(v_dataset, batch_size = BATCH_SIZE, sampler= test_sampler)
    ...
    
    test_dt = next(iter(testloader))
    X, y = test_dt[0].view(-1, 1, 50, 50), test_dt[1]
    val_acc, val_loss = fwd_pass(X.view(-1, 1, 50, 50).to(device), y.to(device))
    

    哪个有效(因为您的测试/验证准确度达到了很好的水平)。

    弄清楚数据加载器代码路径做了哪些其他代码路径不做的事情,您就会得到解决方案。例如,以两种方式加载相同的图像并比较 - 相同的尺寸?数据平均值/标准差一样吗?等等

    对于快捷方式 - 也只需使用数据加载器进行预测。附言是的,可以只为一张图片创建数据加载器。

    【讨论】:

    • 嘿,我会试试你的建议。我放弃了所有代码,因为我真的知道问题出在哪里。正如我在网络上看到的那样,它可能无处不在。无论如何感谢您的建议,我会放弃结果。
    • 有效!!!原来你是对的..我在预测单个图像时错过了数据缩放部分!非常感谢^^
    猜你喜欢
    • 2019-09-20
    • 2017-07-07
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2020-11-29
    • 2016-06-20
    • 2016-07-18
    相关资源
    最近更新 更多