关于使用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]
谢谢。
大佬牛呀