首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化器获得一个空的参数列表(skorch)

优化器获得一个空的参数列表(skorch)
EN

Stack Overflow用户
提问于 2020-04-22 06:24:57
回答 1查看 732关注 0票数 1

所以,我习惯了使用PyTorch,现在决定给Skorch一次机会。

Here他们将网络定义为

代码语言:javascript
复制
class ClassifierModule(nn.Module):
    def __init__(
            self,
            num_units=10,
            nonlin=F.relu,
            dropout=0.5,
    ):
        super(ClassifierModule, self).__init__()
        self.num_units = num_units
        self.nonlin = nonlin
        self.dropout = dropout

        self.dense0 = nn.Linear(20, num_units)
        self.nonlin = nonlin
        self.dropout = nn.Dropout(dropout)
        self.dense1 = nn.Linear(num_units, 10)
        self.output = nn.Linear(10, 2)

    def forward(self, X, **kwargs):
        X = self.nonlin(self.dense0(X))
        X = self.dropout(X)
        X = F.relu(self.dense1(X))
        X = F.softmax(self.output(X), dim=-1)
        return X

我更喜欢在每一层中输入神经元列表,即num_units=[30,15,5,2]将有两个隐藏层,分别有15个和5个神经元。此外,我们有30个特性和2个类,因此将其重写为如下所示

代码语言:javascript
复制
class Net(nn.Module):
    def __init__(
            self,
            num_units=[30,15,5,2],
            nonlin=[F.relu,F.relu,F.relu],
            dropout=[0.5,0.5,0.5],
            ):
        super(Net, self).__init__()

        self.layer_units = layer_units     
        self.nonlin = nonlin #Activation function
        self.dropout = dropout #Drop-out rates in each layer
        self.layers = [nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])] #Dense layers



    def forward(self, X, **kwargs):
        print("Forwards")
        for layer,func,drop in zip(self.layers[:-1],self.nonlin,self.dropout):
            print(layer,func,drop)
            X=drop(func(layer(X)))


        X = F.softmax(X, dim=-1)
        return X

应该能行得通。问题是当调用

代码语言:javascript
复制
net = NeuralNetClassifier(Net,max_epochs=20,lr=0.1,device="cuda")
net.fit(X,y)

我得到错误"ValueError:优化器得到一个空的参数列表“。我已经将范围缩小到删除self.output = nn.Linear(10, 2)只是使网络不进入forward,即看起来output是某种“触发器”变量。网络最终需要一个名为output (作为一个层)的变量,而我们不能自由定义变量名,这是真的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 06:29:24

Pytorch将查找nn.Module的子类,因此更改

代码语言:javascript
复制
self.layers = [nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])]

代码语言:javascript
复制
self.layers = nn.ModuleList([nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])])

应该可以正常工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61354265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档