自定义损失函数出错
收藏
自定义一个超简单的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
收藏
请登录后评论
问:paddle自定义loss怎么写?
答:https://github.com/PaddlePaddle/Paddle/issues/23011 可以参考一下这个简单的示例
谢谢,这个是静态图的,我在动态图中试一下先
研究发现,要在动态图做一个全新的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例子,要能实现梯度下降的那种!
当成新增一个算子,写backward和forward就可以把,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/addon_development/new_op/new_python_op.html