Deep learning model.forward()为什么/如何在输入是小批量还是单个项目时都能成功?

Deep learning model.forward()为什么/如何在输入是小批量还是单个项目时都能成功?,deep-learning,pytorch,Deep Learning,Pytorch,这是为什么以及如何工作的 当我在输入上运行前进阶段时 小批量张量 或者作为单个输入项 model.\uu call\uuu()(AFAIK正在调用forward())将其吞下并输出足够的输出(即,小批量估算或单个估算项目的张量) 从测试中采用测试代码说明了我的意思,但我不明白 我希望它会产生问题,迫使我将单个项目输入转换为大小为1的小批量(重塑(1,xxx))或者类似地,就像我在下面的代码中所做的那样 (我做了测试的变更,以确保它不取决于执行顺序) 这是它生成的输出: ###########

这是为什么以及如何工作的

当我在输入上运行前进阶段时

  • 小批量张量
  • 或者作为单个输入项
model.\uu call\uuu()
(AFAIK正在调用forward())将其吞下并输出足够的输出(即,小批量估算或单个估算项目的张量)

从测试中采用测试代码说明了我的意思,但我不明白

我希望它会产生问题,迫使我将单个项目输入转换为大小为1的小批量(重塑(1,xxx))或者类似地,就像我在下面的代码中所做的那样

(我做了测试的变更,以确保它不取决于执行顺序)

这是它生成的输出:

###########
x[0] tensor([-1.3901, -0.2659,  0.4352, -0.6890,  0.1098, -0.3124,  0.6419,  1.1004,
        -0.7910, -0.5389])
x[0].size() torch.Size([10])
y_1pred.size() torch.Size([3])
tensor([-0.5366, -0.4826,  0.0538], grad_fn=<AddBackward0>)
###########
x.size() torch.Size([64, 10])
y_pred.size() torch.Size([64, 3])
y_pred[0] tensor([-0.5366, -0.4826,  0.0538], grad_fn=<SelectBackward>)
###########
input_item tensor([-1.3901, -0.2659,  0.4352, -0.6890,  0.1098, -0.3124,  0.6419,  1.1004,
        -0.7910, -0.5389])
input_item.size() torch.Size([10])
y_pred_batch_len1.size() torch.Size([1, 3])
tensor([-0.5366, -0.4826,  0.0538], grad_fn=<AddBackward0>)
###########
x[0]张量([-1.3901,-0.2659,0.4352,-0.6890,0.1098,-0.3124,0.6419,1.1004,
-0.7910, -0.5389])
x[0]。大小()火炬。大小([10])
y_1pred.size()火炬尺寸([3])
张量([-0.5366,-0.4826,0.0538],梯度fn=)
###########
x、 大小()火炬。大小([64,10])
y_pred.size()火炬尺寸([64,3])
y_pred[0]张量([-0.5366,-0.4826,0.0538],梯度fn=)
###########
输入项张量([-1.3901,-0.2659,0.4352,-0.6890,0.1098,-0.3124,0.6419,1.1004,
-0.7910, -0.5389])
输入\u item.size()火炬.size([10])
y_pred_batch_len1.size()火炬.size([1,3])
张量([-0.5366,-0.4826,0.0538],梯度fn=)
上的文档说明

输入:(N,∗,in_功能)在哪里∗ 指任意数量的附加尺寸

因此,人们自然会认为至少有两个维度是必要的。然而,如果我们看一下,我们将看到
线性
是根据,或者(取决于
bias==True
)广播它们的参数来实现的


因此,这种行为很可能是一个bug(或文档中的错误),如果我是你,我不会指望它在将来工作。

因此,现在我更好地理解了为什么在我自己的模型类(源自nn.Module)中,“项目与批处理”这一特性会导致一些错误。(层不是以线性开始的)。用于链接到相关来源的Thx。
###########
x[0] tensor([-1.3901, -0.2659,  0.4352, -0.6890,  0.1098, -0.3124,  0.6419,  1.1004,
        -0.7910, -0.5389])
x[0].size() torch.Size([10])
y_1pred.size() torch.Size([3])
tensor([-0.5366, -0.4826,  0.0538], grad_fn=<AddBackward0>)
###########
x.size() torch.Size([64, 10])
y_pred.size() torch.Size([64, 3])
y_pred[0] tensor([-0.5366, -0.4826,  0.0538], grad_fn=<SelectBackward>)
###########
input_item tensor([-1.3901, -0.2659,  0.4352, -0.6890,  0.1098, -0.3124,  0.6419,  1.1004,
        -0.7910, -0.5389])
input_item.size() torch.Size([10])
y_pred_batch_len1.size() torch.Size([1, 3])
tensor([-0.5366, -0.4826,  0.0538], grad_fn=<AddBackward0>)