【问题标题】:What happens when the label's dimension is different from neural network's output layer's dimension in PyTorch?当标签的维度与 PyTorch 中神经网络输出层的维度不同时会发生什么?
【发布时间】:2021-07-31 03:08:32
【问题描述】:

标签的维度应该与神经网络最后一层的维度相同,这对我来说很直观。然而,通过一些使用 PyTorch 的实验,结果证明它以某种方式工作。

代码:

import torch
import torch.nn as nn

X = torch.tensor([[1],[2],[3],[4]], dtype=torch.float32) # training input
Y = torch.tensor([[2],[4],[6],[8]], dtype=torch.float32) # training label

model = nn.Linear(1,3)
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

for epoch in range(10):
    y_pred model(X)
    loss = nn.MSELoss(Y, y_pred)
    loss.backward()
    optimizer.zero_grad()
    optimizer.step()

在上面的代码中,model = nn.Linear(1,3) 被用来代替model = nn.Linear(1,1)。结果,Y.shape 为 (4,1),而 y_pred.shape 为 (4,3)。

代码使用警告说“使用与输入大小不同的目标大小可能会由于广播而导致不正确的结果。”

执行model(torch.tensor([10], dtype=torch.float32))时得到以下输出:

tensor([20.0089, 19.6121, 19.1967], grad_fn=<AddBackward0>)

所有三个输出对我来说似乎都是正确的。但是如果数据大小不同,损失如何计算呢?

在任何情况下我们都应该使用与输入大小不同的目标大小吗?这样做有什么好处吗?

【问题讨论】:

    标签: machine-learning neural-network pytorch


    【解决方案1】:

    假设您使用的是batch_size=4,那么您将使用带有1 组件的目标与3 的预测张量。使用nn.MSELoss 计算损失时,您实际上看不到中间结果,使用reduction='none' 选项将允许您这样做:

    >>> criterion = nn.MSELoss(reduction='none')
    >>> y = torch.rand(2,1)
    >>> y_hat = torch.rand(2,3)
    >>> criterion(y_hat, y).shape
    (2, 3)
    

    考虑到这一点,您可以得出结论,目标y太小,已经广播到预测张量y_hat。本质上,在您的示例中,您将获得与以下相同的结果(没有警告):

    >>> y_repeat = y.repeat(1, 3)
    >>> criterion(y_hat, y_repeat)
    

    这意味着,对于每个批次,您都针对单个值对其所有组件进行 L2 优化:MSE(y_hat[0,0], y[0])MSE(y_hat[0,1], y[0])MSE(y_hat[0,2], y[0])y[1]y[2] 也是如此。

    警告是为了确保您意识到此广播操作。也许这就是您想要做的,在这种情况下,您应该自己广播目标张量。否则,这样做没有意义。

    【讨论】:

    • 我现在明白了,谢谢!我正在阅读的代码是根据一些特征来预测一个数值,那么这种广播技术有什么优势吗?
    • 如果您想预测单个数值,您可能需要在线性层上使用单个神经元,以便它输出单个值。在你的情况下(bs, 1).
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2018-07-25
    • 2015-11-20
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多