基本上,您缺少的概念
batch。
长话短说,每一项损失(以及通过网络的损失)的输入都需要
batch维度(即使用了多少个样本)。
逐步分解:
您的示例与文档每个步骤都会与每个步骤进行比较,以使其更加清晰(顶部的文档,下面的示例)
输入项input = torch.randn(3, 5, requires_grad=True)input = torch.randn(5, requires_grad=True)
在第一种情况下(docs),
5将创建
3具有要素的输入并使用示例。在您的情况下,只有
batch尺寸(
5样本),没有 必需的功能
。如果您打算使用一个具有
5功能的示例,则应该执行以下 *** 作:
LogSoftmaxinput = torch.randn(5, requires_grad=True)
LogSoftmax是跨要素维度完成的,您是跨批次进行的。
m = nn.LogSoftmax(dim = 1)#应用于特征m = nn.LogSoftmax(dim = 0)#应用于批处理
通常,此 *** 作没有意义,因为样本彼此独立。
目标因为这是多类分类,并且向量中的每个元素都代表一个样本,所以可以传递任意数量的数字(只要它小于要素的数量,在文档示例中为
5,
[0-4]就可以了)。
train = torch.tensor([1, 0, 4])train = torch.tensor([1, 0, 0])
我想,您也希望将一热点向量作为目标。PyTorch不能以这种方式工作,因为它的 内存效率低下
(为什么当您只能精确定位类时,为什么将所有内容存储为一键编码
0)。
仅对神经网络的输出进行一次热编码,以通过所有输出节点反向传播错误,目标不需要。
最后你不应该 使用
torch.nn.LogSoftmax在所有
完成这个任务。只需
torch.nn.Linear用作最后一层并
torch.nn.CrossEntropyLoss与您的目标一起使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)