优化器得到一个空参数列表 (skorch)
optimizer got an empty parameter list (skorch)
所以,我习惯使用 PyTorch,现在决定试试 Skorch。
Here 他们将网络定义为
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]
将有 2 个隐藏层,分别有 15 个和 5 个神经元。此外,我们有 30 个特征和 2 个 类,因此将其重写为这样的东西
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
应该可以解决问题。问题是当调用
net = NeuralNetClassifier(Net,max_epochs=20,lr=0.1,device="cuda")
net.fit(X,y)
我收到错误 "ValueError: optimizer got an empty parameter list"。我已经将范围缩小到删除 self.output = nn.Linear(10, 2)
只是让网络不输入 forward
即看起来 output
是某种 "trigger" 变量。真的是这样吗,网络最后需要一个名为 output
的变量(作为一层),而我们不能自己定义变量名?
Pytorch 将查找 nn.Module
的子类,因此更改
self.layers = [nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])]
到
self.layers = nn.ModuleList([nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])])
应该可以正常工作
所以,我习惯使用 PyTorch,现在决定试试 Skorch。
Here 他们将网络定义为
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]
将有 2 个隐藏层,分别有 15 个和 5 个神经元。此外,我们有 30 个特征和 2 个 类,因此将其重写为这样的东西
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
应该可以解决问题。问题是当调用
net = NeuralNetClassifier(Net,max_epochs=20,lr=0.1,device="cuda")
net.fit(X,y)
我收到错误 "ValueError: optimizer got an empty parameter list"。我已经将范围缩小到删除 self.output = nn.Linear(10, 2)
只是让网络不输入 forward
即看起来 output
是某种 "trigger" 变量。真的是这样吗,网络最后需要一个名为 output
的变量(作为一层),而我们不能自己定义变量名?
Pytorch 将查找 nn.Module
的子类,因此更改
self.layers = [nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])]
到
self.layers = nn.ModuleList([nn.Linear(i,p) for i,p in zip(layer_units,layer_units[1:])])
应该可以正常工作