Neural network 使用nn.Sequential()实现退出层

Neural network 使用nn.Sequential()实现退出层,neural-network,pytorch,Neural Network,Pytorch,我正在尝试使用pytorch实现一个退出层,如下所示: 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) / s

我正在尝试使用pytorch实现一个退出层,如下所示:

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
但我得到了以下错误:

TypeError: flatten() takes at most 1 argument (2 given)
不知道我做错了什么。pytorch还是个新手。谢谢。

在DropoutLayer的forward功能中,当您进入elsebranch时,不会返回。因此,下面的层展平将没有输入。然而,正如评论中强调的那样,这不是实际问题

实际的问题是,您正在将一个numpy数组传递给展平层。再现该问题的最低代码为:

nn.Flatten()(np.random.randn(5,5))
>>> TypeError: flatten() takes at most 1 argument (2 given)
然而,我无法解释为什么这一层的行为类似于numpy张量,平坦函数的行为更容易理解。我不知道该层还执行哪些其他操作

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

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

代码被解析了,解决方案只是先调用nn.SequentialFlatten将输入矩阵增加到nx786维度。

它仍然会给出相同的错误。..train自动将模型设置为training,因此fwd evals中的if statemetn设置为trueyep my bad,我不是在回避实际问题,现在已经纠正了:如果你解决了你的问题,你可能会考虑接受你的答案。
torch.flatten(np.random.randn(5,5))
>>> TypeError: flatten(): argument 'input' (position 1) must be Tensor, not numpy.ndarray