Deep learning 使用nn.Sequential()方法+;皮托克

Deep learning 使用nn.Sequential()方法+;皮托克,deep-learning,neural-network,pytorch,Deep Learning,Neural Network,Pytorch,我正在尝试使用nn.Sequential()为我的神经网络创建一个退出层,如下所示: 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)&

我正在尝试使用nn.Sequential()为我的神经网络创建一个退出层,如下所示:

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)
类DropoutLayer(nn.Module):
定义初始化(self,p):
super()。\uuuu init\uuuuu()
self.p=p
def前进(自我,输入):
如果是自我培训:

u1=(np.random.rand(*input.shape)首先,我假设有一个小的输入错误:您声明
model=nn.Sequential(…)
,但随后使用
modelDp.parameters()
。我假设您刚刚犯了一个小的复制粘贴错误,这些错误实际上是一样的

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

为了消除错误并获得实际工作的神经网络,您需要包括学习层,根据您之前报告的错误,学习层是线性层。这类似于:

model = nn.Sequential(nn.Linear(784, 10), Flatten(), DropoutLayer(0.7), nn.LogSoftMax(dim=-1))
现在再补充几句:

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

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


此代码中没有任何内容会产生此错误。784x10形状让我认为您正在使用MNIST,使用的是线性层,我认为此层失败。您是否使用了128的批处理大小,并在
视图中出错
?此外,此代码与此代码非常相似:。我可以问一下在哪里执行此操作吗代码来自?这是深度学习的家庭作业。是的,我使用的批量大小为128,并使用flatte()
类展平(nn.Module):def forward(self,x):return x.view(x.size()[0],-1)