首页 Paddle框架 帖子详情
关于使用cross_entropy_loss报错
收藏
快速回复
Paddle框架 问答模型训练 733 7
关于使用cross_entropy_loss报错
收藏
快速回复
Paddle框架 问答模型训练 733 7

Hello, 

我在修改官方的图像识别教程时(从单类别变成二类别)遇到了问题。烦请大家帮助。

我想把原来的LOSS函数改成cross_entropy_loss或者用sigmod 作为loss 函数,但代码报错说我的维度不对。

以下 是我的label 和预测值的label(batch 10)

Estimate_label

Tensor(shape=[10, 2], dtype=float32, place=Place(gpu:0), stop_gradient=False,
[[-2.36834717, -0.94153249],
[-2.02542281, 0.04710546],
[-1.76077676, 0.05066326],
[-2.27432156, -0.73732662],
[-1.19670498, -1.36968899],
[-1.57935870, -1.01269686],
[-0.64907420, 0.49497414],
[-2.88516164, 0.81037402],
[ 2.38728380, -3.08713198],
[ 1.06694150, -1.77655041]])

 

Label:
Tensor(shape=[10, 2], dtype=float32, place=Place(gpu:0), stop_gradient=True,
[[0., 1.],
[0., 1.],
[1., 0.],
[0., 1.],
[0., 1.],
[0., 1.],
[0., 1.],
[1., 0.],
[0., 1.],
[1., 0.]])

 

训练代码

    for epoch in range(EPOCH_NUM):
        for batch_id, data in enumerate(train_data_loader()):
            x_data, y_data = data
            # print(y_data)
            img = paddle.to_tensor(x_data)
            # print(img.shape)
            label = paddle.to_tensor(y_data)
            estimate_label = model(img)
            print(estimate_label)
            print(label)
            cross_entropy_loss = paddle.nn.loss.CrossEntropyLoss(
            )
            loss = cross_entropy_loss(estimate_label, label)
            avg_loss = paddle.mean(loss)
            if batch_id % 20 == 0:
                print("epoch: {}, batch_id: {}, loss is: {:.4f}".format(
                    epoch, batch_id, float(avg_loss.numpy())))
            # 反向传播,更新权重,清除梯度
            avg_loss.backward()
            optimizer.step()
            optimizer.clear_grad()

报错:

/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import fnmatch, glob, traceback, errno, sys, atexit, locale, imp, stat
Traceback (most recent call last):
  File "cat_dog_classifer.py", line 220, in 
    train(my_alex_net, opt)
  File "cat_dog_classifer.py", line 179, in train
    loss = cross_entropy_loss(estimate_label, label)
  File "/home/tesla/.local/lib/python3.8/site-packages/paddle/fluid/dygraph/layers.py", line 930, in __call__
    return self._dygraph_call_func(*inputs, **kwargs)
  File "/home/tesla/.local/lib/python3.8/site-packages/paddle/fluid/dygraph/layers.py", line 915, in _dygraph_call_func
    outputs = self.forward(*inputs, **kwargs)
  File "/home/tesla/.local/lib/python3.8/site-packages/paddle/nn/layer/loss.py", line 397, in forward
    ret = paddle.nn.functional.cross_entropy(
  File "/home/tesla/.local/lib/python3.8/site-packages/paddle/nn/functional/loss.py", line 1731, in cross_entropy
    _, out = _C_ops.softmax_with_cross_entropy(
ValueError: (InvalidArgument) If Attr(soft_label) == false, the axis dimension of Input(Label) should be 1.
  [Hint: Expected labels_dims[axis] == 1UL, but received labels_dims[axis]:2 != 1UL:1.] (at /paddle/paddle/fluid/operators/softmax_with_cross_entropy_op.cc:193)
  [operator < softmax_with_cross_entropy > error]

我应该如何修改呢?! 谢谢!

0
收藏
回复
全部评论(7)
时间顺序
L
Linq1呀
#2 回复于2022-11

你的多分类label的shape不能是[10,2]吧,

得是[10,1]

0是一个类,1是一个类,

所以label可以改成[1, 1, 0, 1, 1, 1, 1, 0, 1, 0]

0
回复
s
skygoodboy
#3 回复于2022-11
你的多分类label的shape不能是[10,2]吧, 得是[10,1], 0是一个类,1是一个类, 所以label可以改成[1, 1, 0, 1, 1, 1, 1, 0, 1, 0]

那如果是3 分类或者4分类 呢?还是[10,1]?

 

0
回复
beyondyourself
#4 回复于2022-11

前面的是分类

0
回复
L
Linq1呀
#5 回复于2022-11
那如果是3 分类或者4分类 呢?还是[10,1]?  

对,三分类也还是[10, 1]  三分类的话,label 就要有三个值如:[0, 0, 1, 1, 2, 2, 1, 1, 0, 0]

0
回复
s
skygoodboy
#6 回复于2022-11
对,三分类也还是[10, 1]  三分类的话,label 就要有三个值如:[0, 0, 1, 1, 2, 2, 1, 1, 0, 0]

谢谢,那output的SHAPE是[10,2]?

 

0
回复
s
skygoodboy
#7 回复于2022-11

解决了,

predict 是[10,2]

label是[10,1]

谢谢。

0
回复
李长安
#8 回复于2022-11

大佬牛呀

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