最近开始尝试用pytorch搭神经网络,踩了不少坑,开个帖子记录一下,如果有理解上的错误,请多多指出!
1、pytorch的输入必须是float类型,在命令行里输入以下代码段可以验证
>>>import torch
>>>import torch.nn as nn
>>>a = torch.tensor([1, 2, 3])
>>>f = nn.Linear(3, 2)
>>>a = a.float()
>>>f(a)
直接执行b = f(a)会报错,告诉你需要float类型输入
2、pytorch按默认行处理输入,如果一个样本对应的输入为n维行向量v,对于m个输入,经过网络处理后的输出应有m行,列数等于输出的维数,通过下面的代码可以验证
>>>a = torch.tensor([[1, 2, 3], [4, 5, 6]])
>>>a = a.float()
>>>f = nn.Linear(3, 2)
>>>f(a)
>>>b = a[1]
>>>f(b)
f(a)的输出为tensor([[-3.0722, 1.8598],[-6.9518, 4.9386]])
f(b)的输出为tensor([-6.9518, 4.9386]),恰好是f(a)的第二行
1、pytorch的CrossEntropyLoss()实际上是Log_Softmax()和NllLoss()的结合
默认有softmax处理,通过以下代码可以验证
>>> a = torch.tensor([[1, 2, 3], [3, 1, 1]])
>>> a = a.float()
>>> F.softmax(a, dim = 1)
tensor([[0.0900, 0.2447, 0.6652],
[0.7870, 0.1065, 0.1065]])
>>> b = F.softmax(a, dim = 1)
>>> c = torch.log(b)
>>> c
tensor([[-2.4076, -1.4076, -0.4076],
[-0.2395, -2.2395, -2.2395]])
>>> y = torch.tensor([1, 0])
>>> e = F.nll_loss(c, y)
>>> e
tensor(0.8236)
>>> f = nn.CrossEntropyLoss()
>>> f(a, y)
tensor(0.8236)
直接调用nn.CrossEntropyLoss()和经过softmax, log, nll_loss的结果相同