我正在使用骰子损失来实现涉及超网络的完全卷积网络(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
我希望损失会在几个时期内收敛。 我该怎么办?
答案 0 :(得分:1)
这实际上不是堆栈溢出的问题。有上百万种事情可能是错误的,通常不可能发布足够的代码来让我们查明问题,即使是这样,也没有人会花那么多时间来打扰。
话虽这么说,但有些通用准则通常对我有用。
torch.sigmoid(x)
,然后将其馈送到torch.nn.functional.binary_cross_entropy_with_logits
中(两次有效地应用了sigmoid
)。也许您的最后一层是ReLU
,并且您的网络无法(通过构造)输出期望值的负值。最后,我个人从未接受过以骰子为主要损失函数的成功培训,因此,我绝对会尝试先使其与交叉熵一起使用,然后再进行骰子设计。
答案 1 :(得分:0)
@Muhammad Hamza Mughal
您必须添加至少您的forward
和train
函数的代码,以便我们查明问题,@ 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
添加到优化器中,如果随着时间的推移没有改善,则可以更改学习率。
我们确实不能在答案中包含代码。由实践者来决定如何实现所有这些东西。希望这会有所帮助。