Моя нейронная сеть имеет следующую архитектуру:
input -> 128x (separate fully connected layers) -> output averaging
Я использую ModuleList для хранения списка полностью подключенных слоев. Вот как это выглядит в этой точке:
class MultiHead(nn.Module):
def __init__(self, dim_state, dim_action, hidden_size=32, nb_heads=1):
super(MultiHead, self).__init__()
self.networks = nn.ModuleList()
for _ in range(nb_heads):
network = nn.Sequential(
nn.Linear(dim_state, hidden_size),
nn.Tanh(),
nn.Linear(hidden_size, dim_action)
)
self.networks.append(network)
self.cuda()
self.optimizer = optim.Adam(self.parameters())
Затем, когда мне нужно вычислить вывод, я использую конструкцию for ... in
для выполнения прямого и обратного прохождения через все слои:
q_values = torch.cat([net(observations) for net in self.networks])
# skipped code which ultimately computes the loss I need
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
Это работает! Но мне интересно, не смогу ли я сделать это более эффективно. Я чувствую, что, выполняя for...in
, я на самом деле прохожу каждый отдельный слой FC один за другим, хотя я ожидаю, что эта операция может выполняться параллельно.