损失不减少-pytorch

时间:2019-03-23 08:21:14

标签: machine-learning conv-neural-network pytorch

我正在使用骰子损失来实现涉及超网络的完全卷积网络(FCN)。该模型有两个输入和一个输出,它是一个二进制分割图。该模型正在更新权重,但损失是恒定的。 甚至在三个训练示例上都不算过分

我使用了其他损失函数,例如骰子+二进制交叉熵损失,jacard损失和MSE损失,但是损失几乎是恒定的。 我还尝试了几乎所有的激活功能,例如ReLU,LeakyReLU,Tanh。而且我必须在输出端使用Sigmoid,因为我需要我的输出端在[0,1]范围内 学习率是0.01。此外,我尝试了不同的学习率,例如0.0001、0.001、0.1。而且无论培训开始于多大的损失,它总是以这个值来实现

这显示了三个训练示例的渐变。和整体损失

tensor(0.0010, device='cuda:0')
tensor(0.1377, device='cuda:0')
tensor(0.1582, device='cuda:0')
Epoch 9, Overall loss = 0.9604763123724196, mIOU=0.019766070265581623
tensor(0.0014, device='cuda:0')
tensor(0.0898, device='cuda:0')
tensor(0.0455, device='cuda:0')
Epoch 10, Overall loss = 0.9616242945194244, mIOU=0.01919178702228237
tensor(0.0886, device='cuda:0')
tensor(0.2561, device='cuda:0')
tensor(0.0108, device='cuda:0')
Epoch 11, Overall loss = 0.960331304506822, mIOU=0.01983801422510155

我希望损失会在几个时期内收敛。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

这实际上不是堆栈溢出的问题。有上百万种事情可能是错误的,通常不可能发布足够的代码来让我们查明问题,即使是这样,也没有人会花那么多时间来打扰。

话虽这么说,但有些通用准则通常对我有用。

  1. 尝试减少问题。如果将网络替换为单个卷积层,它将收敛吗?如果是,那么您的网络显然出了问题
  2. 在输入数据时查看数据 以及标签(matplotlib图等)。也许您是使输入与输出不一致(裁剪问题等),或者数据扩充太强大了。
  3. 寻找,好吧,错误。也许您是从网络中返回torch.sigmoid(x),然后将其馈送到torch.nn.functional.binary_cross_entropy_with_logits中(两次有效地应用了sigmoid)。也许您的最后一层是ReLU,并且您的网络无法(通过构造)输出期望值的负值。

最后,我个人从未接受过以骰子为主要损失函数的成功培训,因此,我绝对会尝试先使其与交叉熵一起使用,然后再进行骰子设计。

答案 1 :(得分:0)

@Muhammad Hamza Mughal

您必须添加至少您的forwardtrain函数的代码,以便我们查明问题,@ Jatentaki是正确的,可能有太多事情可能会弄乱ML / DL代码。甚至我最近从Keras搬到pytorch,也花了一些时间来适应它。但是,这是我要做的事情:

1)在处理图像时,请尝试对其进行一些预处理(旋转,归一化,高斯噪声等)。

2)在提取的每个批次的开始Zero gradients进行优化,step optimizer在计算损失并致电loss.backward()之后weight decay

3)在处理卷积网络时,请在优化程序调用中添加一个learning rate scheduler项,通常为L2,衰减项为5e-4或5e-5。

4)将@pytest.mark.parametrize('field', [('beskrivelse'), ('systemId')]) def test_intgra_001_elevforhold_req_fields(return_endpoint, field): ep_to_get = 'get_elevforhold' ep_returned = return_endpoint(ep_to_get) apiv2 = Apiv2() apiv2.entity_check(ep_returned, field, ep_to_get, False) @pytest.fixture() def return_endpoint(): def endpoint_initialisation(ep_name): apiv2 = Apiv2() ep_data = apiv2.get_ep_name(ep_name) response = apiv2.get_endpoint_local(ep_data, 200) content = json.loads(response.content) apiv2.content_filt(content) apiv2_data = content['data'] return apiv2_data return endpoint_initialisation 添加到优化器中,如果随着时间的推移没有改善,则可以更改学习率。

我们确实不能在答案中包含代码。由实践者来决定如何实现所有这些东西。希望这会有所帮助。