如何计算:autograd包根据tensor进行过的数学运算来自动计算梯度
注意:1:autograd实现的。2:对tensor进行计算梯度。
之前损失计算:分割损失和边界损失计算正常。
踩坑1:模型有两个损失,分别为分割损失和边界损失,在loss function计算损失值。然后将损失值相加进行反向传播。其中分割损失采用了深监督,需要计算五次。之前的代码采用的append将所有损失放在一个列表中,通过sum相加,搜了一下,网上说append会不断地增加内存的消耗。因此推荐使用loss += loss.item().
问题就出现在这里:然后train就开始报错:
‘‘float has no attribution of backward’’。继续搜索发现回答是loss不是tensor格式。是因为item()函数将tensor转换为了float。
所以在计算损失也就是loss.backward之前不能用loss.item()。修改为:loss += loss,这样loss就是tensor了,但是我的边界损失也是用的loss += loss.item()。那么也就是说我的边界损失也是float类型了。但是却可以正常运行:
于是继续搜索发现tensor和float相加时候,会自动将float转换为tensor格式。但是,在反向传播时候却不能对边界损失进行反向更新,因此即使可以运行,结果也是错的,所以有多个分割损失和边界损失时候,不能用loss += loss.item()。loss.backward将损失反向传播,计算梯度,optimizer使用梯度下降法优化损失。
什么时候可以用呢:搜索发现在不需要损失梯度的地方可以用loss.item(),比如需要用logger记录损失时候可以使用。