今天上午心情起伏很大,本以为找到了代码中的错误,结果发现并不是这么回事。
第一,看了几篇博客发现,分类问题的标签应该用one hot(独热码),而我一直用的是普通数字(我的项目一共是四分类,所以用的是0,1,2,3)。本来想着赶紧回去改,幸好又看到一偏博客说pytorch在计算交叉熵时回自动将结果转换成one hot编码再计算。将信将疑的我去用代码验证了一下,发现的确如此,所以并不需要修改这个啦。(而且如果你想用独热码的向量作为标签pytorch好像还不支持,好像只支持一维的)
第二,我的cnn输出并没有加softmax层。本来想加上,又看到一篇博客说加和不加算出来的结果是一样的。于是我又去验证了一下。发现直接用全连接层输出计算和加F.softmax()计算出的值是不一样的,但和F.log_softmax()计算结果相等,所以可以理解为是默认加了log_softmax()层。
log_softmax验证:
a=torch.tensor([[ 0.0189, 0.1621, -0.1308, -0.1770]])
label=torch.tensor([2])
b=F.log_softmax(a,dim=1)
print(b)
l=loss(a,label)
l2=loss(b,label)
print(l)
print(l2)
tensor([[-1.3447, -1.2015, -1.4944, -1.5406]])
tensor(1.4944)
tensor(1.4944)
one hot验证:1到0的距离等于1到3的距离
a=torch.tensor([[0.1, 0.7, 0.1,0.1]])
label=torch.tensor([1])
label2=torch.tensor([3])
label3=torch.tensor([0])
l1=loss(a,label)
l2=loss(a,label2)
l3=loss(a,label3)
print(l1)
print(l2)
print(l3)
```python
tensor(0.9732)
tensor(1.5732)
tensor(1.5732)
如果labe=4会报错 out of bound,说明四分类的标签只能是0,1,2,3而不能是1,2,3,4。
最后,小白表示,如有错误请各位包涵!也请各位前辈不吝赐教!谢谢!