【问题标题】:Writing a dropout layer using nn.Sequential() method + Pytorch使用 nn.Sequential() 方法 + Pytorch 编写 dropout 层
【发布时间】:2021-01-12 06:09:06
【问题描述】:

我正在尝试使用 nn.Sequential() 为我的神经网络创建一个 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) 
            u1 *= input
            return u1
        else:
            input *= self.p
model = nn.Sequential(Flatten(),DropoutLayer(p = 0.7),nn.LogSoftmax(dim = -1))
opt = torch.optim.Adam(modelDp.parameters(), lr=0.005)
train(modelDp, opt, 5)

但我收到此错误: ValueError: 优化器得到一个空的参数列表

【问题讨论】:

  • 此代码中没有任何内容会产生此错误。 784x10 的形状让我觉得你正在使用线性层的 MNIST,我相信这个层失败了。您是否使用 128 的批量大小并使用 view 出错?除此之外,代码与此代码非常相似:stackoverflow.com/questions/64032525/…。请问这个代码是从哪里来的?
  • 这是深度学习的功课。是的,我正在使用 128 的批量大小并使用 Flatten() class Flatten(nn.Module): def forward(self, x): return x.view(x.size()[0], -1)

标签: deep-learning neural-network pytorch


【解决方案1】:

首先,我认为这是一个小错字:您声明model = nn.Sequential(...),然后使用modelDp.parameters()。我假设您只是在复制粘贴时犯了一个小错误,而这些实际上是一回事。

产生此错误是因为模型中的任何层都没有可训练的参数,即受梯度反向传播步骤影响的参数。实际上,这个“网络”根本学不到任何东西。

要消除错误并获得实际工作的神经网络,您需要包含学习层,根据您之前报告的错误,学习层是线性层。那会是这样的:

model = nn.Sequential(nn.Linear(784, 10), Flatten(), DropoutLayer(0.7), nn.LogSoftMax(dim=-1))

现在补充几点:

  • 您可能希望使用 pytorch 随机张量而不是 Numpy。当您最终想要在 GPU 上移动网络时,处理 device 会更容易。

  • 当您在eval 模式下尝试此代码时,该代码将产生另一个错误,因为您在forward 方法中的第二个条件分支不会返回任何内容。您可能希望将指令替换为return input * self.p

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2020-10-07
    • 2021-10-08
    • 2020-05-11
    • 2021-05-11
    • 2019-08-05
    相关资源
    最近更新 更多