关于使用cross_entropy_loss报错
收藏
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
收藏
请登录后评论
你的多分类label的shape不能是[10,2]吧,
得是[10,1],
0是一个类,1是一个类,
所以label可以改成[1, 1, 0, 1, 1, 1, 1, 0, 1, 0]
那如果是3 分类或者4分类 呢?还是[10,1]?
前面的是分类
对,三分类也还是[10, 1] 三分类的话,label 就要有三个值如:[0, 0, 1, 1, 2, 2, 1, 1, 0, 0]
谢谢,那output的SHAPE是[10,2]?
解决了,
predict 是[10,2]
label是[10,1]
谢谢。
大佬牛呀