【问题标题】:implement dropout layer using nn.Sequential()使用 nn.Sequential() 实现 dropout 层
【发布时间】:2021-01-09 22:11:25
【问题描述】:

我正在尝试使用 pytorch 实现 Dropout 层,如下所示:

class DropoutLayer(nn.Module):
    def __init__(self, p):
        super().__init__()
        self.p = p

    def forward(self, input):
        if self.training:
            u1 = (np.random.rand(*input.shape)<self.p) / self.p
            u1 *= u1
            return u1
        else:
            input *= self.p

然后调用一个简单的NN.sequential:

model = nn.Sequential(nn.Linear(input_size,num_classes), DropoutLayer(.7), nn.Flatten())

opt = torch.optim.Adam(model.parameters(), lr=0.005)
train(model, opt, 5) #train(model, optimizer, epochs #)

但我收到以下错误:

TypeError: flatten() takes at most 1 argument (2 given)

不知道我做错了什么。对 pytorch 来说还是新手。谢谢。

【问题讨论】:

    标签: neural-network pytorch


    【解决方案1】:

    在你的DropoutLayer的forward函数中,当你输入elsebranch时,没有返回。因此下一层 (flatten) 将没有输入。然而,正如 cmets 所强调的,这不是真正的问题。

    实际的问题是您将一个 numpy 数组传递给您的 Flatten 层。重现问题的最小代码是:

    nn.Flatten()(np.random.randn(5,5))
    >>> TypeError: flatten() takes at most 1 argument (2 given)
    

    但是,我无法解释为什么该层在 numpy 张量上的行为如此,flatten 函数 的行为更容易理解。我不知道该层执行了哪些额外的操作。

    torch.flatten(np.random.randn(5,5))
    >>> TypeError: flatten(): argument 'input' (position 1) must be Tensor, not numpy.ndarray
    

    为什么您的代码会引发此错误,因为在前向传递中,您创建了一个 numpy 张量,执行一些操作,然后返回它而不是返回张量。如果可以的话,您甚至都不会触摸实际的输入张量(在第一个分支中)

    【讨论】:

    • 它仍然给出相同的错误。train() 自动将模型设置为训练,因此 fwd evals 中的 if() statemetn 为 true
    • 是的,我的错,我没有解决实际问题,现在已更正:)
    【解决方案2】:

    代码已解析,解决方案只是首先调用nn.Sequential(Flatten()) 以将输入矩阵扩充为nx786 维度。

    【讨论】:

    • 如果这解决了您的问题,您可能需要考虑接受您的答案。
    猜你喜欢
    • 2021-01-12
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2017-07-18
    • 2016-10-18
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多