首页 Paddle框架 帖子详情
自定义损失函数出错
收藏
快速回复
Paddle框架 问答深度学习模型训练炼丹技巧 1757 4
自定义损失函数出错
收藏
快速回复
Paddle框架 问答深度学习模型训练炼丹技巧 1757 4

自定义一个超简单的loss

    def get_loss(self,outputs,y):
        myout=outputs.numpy()  #输入是一个二维数组(15,11)
        myY=y.numpy()  #(15,1)
        myloss2=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]).reshape(15,1).astype('float32')
        loss=fluid.dygraph.to_variable(myloss2)
        #loss = fluid.layers.cross_entropy(outputs, y) #(15,1)
        myloss=loss.numpy()  #shape(15,1)[[21],[15],[26],[5],[9],[31],....]
        return loss

为什么在  "后向传播,更新参数的过程"
       avg_loss.backward()
       optimizer.minimize(avg_loss)

会出下面的错?

Windows not support stack backtrace yet.PaddleCheckError: Expected grad->numel() == sz, but received grad->numel():0 != sz:500. at [D:\1.6.0\paddle\paddle/fluid/operators/optimizers/sgd_op.h:41]

0
收藏
回复
全部评论(4)
时间顺序
thinc
#2 回复于2020-06

问:paddle自定义loss怎么写?
答:https://github.com/PaddlePaddle/Paddle/issues/23011 可以参考一下这个简单的示例

0
回复
w
wsdsoft
#3 回复于2020-06

谢谢,这个是静态图的,我在动态图中试一下先

0
回复
w
wsdsoft
#4 回复于2020-06

研究发现,要在动态图做一个全新的loss是相当的复杂的。但是如果在现有的各种loss基础之上,做点小动作,却是容易的。


    def get_loss(self,outputs,y):
        loss1 = fluid.layers.cross_entropy(outputs, y[0]) #(15,1)
        loss2 = fluid.layers.cross_entropy(outputs, y[1]) #(15,1)
        loss=loss1+0.5*loss2
        return loss

 

我用这个法变通的实现了“伪自定义loss”。希望官方可以出一个完整的动态图自定义loss例子,要能实现梯度下降的那种!

0
回复
星光ld1
#5 回复于2020-06

当成新增一个算子,写backward和forward就可以把,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/addon_development/new_op/new_python_op.html

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户