torch.nn.ReLU和torch.nn.Sigmoid是否可训练



我用PyTorch构建了一个简单的GRU模型。它包括4个子模块。

我注意到,state_dict()返回的一些字典在训练后是空的,而其他子模块的字典肯定有一些权重和偏差。

代码:

class GruModel(nn.Module):
def __init__(self, inputs, nodes, layers=2):
super(GruModel, self).__init__()
self.gru_m = nn.GRU(input_size=inputs, num_layers=layers, hidden_size=nodes,
batch_first=True, dropout=0.5)
self.activt_f = nn.ReLU()
self.output_f = nn.Linear(nodes, 1)
self.probab_f = nn.Sigmoid()
def forward(self, x, h):
o, h = self.gru_m(x, h)
o = self.activt_f(o[:, -1])
out = self.output_f(o)
return self.probab_f(out)
def trainWith(self, ...):
''' training body '''
criterion = nn.BCEWithLogitsLoss()
optimizer = torch.optim.Adadelta(self.parameters(), lr=learn_rat)
lr_schdlr = torch.optim.lr_scheduler.ExponentialLR(
optimizer, gamma=0.99)
t_loader = torch_data.DataLoader(...)
for e in range(epochs):
for x, p_label, n_label in t_loader:
optimizer.zero_grad()
out = self(x, self.init_hidden(batch_size))
loss = criterion(out, p_label)
loss.backward()
optimizer.step()
lr_schdlr.step()
def save(self, full_path: str):
print(self.gru_m.state_dict())
print(self.activt_f.state_dict())
print(self.output_f.state_dict())
print(self.probab_f.state_dict())

在实际运行中,子模块self.gru_mself.output_f的状态具有预期的值,但是子模块self.activt_f(nn.ReLU(和self.probab_f(nn.Sigmoid(中的值什么都没有。

不在乎我的训练过程,我给它提供了大量的数据,并运行了数百个时期,模型可以按照我的预期进行分类。

我感兴趣的是后面的两个模块是可训练的,还是它们确实需要任何权重和偏差来完成它们的工作?

如果是的话,我们可以说torch.nn.Sigmoidtorch.nn.functional.sigmoid是一样的吗?因为它们都是伪函数,而不是有状态的对象。

您提到的两层模块是未参数化的激活函数。这意味着它们不是";可训练的";因为它们不包含任何参数。

然而,nn模块是(它们可以是有状态的(,而nn.functional实用程序是函数

最新更新