Можно ли обучать torch.nn.ReLU и torch.nn.Sigmoid?

Я создаю простую модель GRU с помощью PyTorch. Он включает в себя 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())

В реальной работе state_dict подмодуляself.gru_mиself.output_fимеют значения, как и ожидалось, но значения подмодуляself.activt_f(nn.ReLU) иself.probab_f(nn.Sigmoid) ничего не имеют.

Меня не волнует мой процесс обучения, я загружаю его тоннами данных и просматриваю сотни эпох, и модель может выполнять классификацию, как я и ожидал.

Меня интересует, можно ли обучать два последних модуля, или им НЕ нужны какие-либо веса и смещения для выполнения своей работы?

Если да, то можем ли мы сказать, чтоtorch.nn.Sigmoidтакой же, какtorch.nn.functional.sigmoid? Потому что все они являются фиктивными функциями, а не объектами с состоянием.

0 ответов

Другие вопросы по тегам