↓阿里云服务器3年不到300元↓

Tomcat 架构解析 阿里云服务器3年不到300元 Redis设计与实现

与Pythorch并行运行一个集成的多个模型

  • 问题:
  • 我的神经网络具有以下结构:

    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())

    然后,当我需要计算输出时,我用一个来表示。。。在构造中执行所有层的正向和反向传递:

    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()

    这很管用!但我想知道我是否能更有效地完成这项工作。我觉得通过在中对…执行操作,我实际上是在逐个遍历每个单独的FC层,而我希望这个操作可以并行完成

  • 答案:
  • convd代替线性的情况下,可以使用groups参数来表示“分组卷积”(又称“depthwise卷积”)。这让你同时处理所有的并行网络

    如果使用大小为1的卷积内核,那么卷积只会应用线性层,其中每个通道都被视为输入维度。所以你的网络结构大致如下:

    nn.Conv1d(in_channels=dim_state * nb_heads, out_channels=hidden_size * nb_heads, kernel_size=1, groups=nb_heads)

    以及

    nn.Conv1d(in_channels=hidden_size * nb_heads, out_channels=dim_action * nb_heads, kernel_size=1, groups=nb_heads)

    虽然CUDA本机支持分组卷积,但Pythorch在分组卷积速度方面存在一些问题(参见。here)但我想现在已经解决了

C++ Primer Plus 第六版 阿里云服务器3年不到300元 流畅的 Python