如何在并行流之间共享权重?

有没有一种方法可以在 torch-model 的并行流之间共享权重?

例如,我有以下模型。

mlp = nn.Sequential();
c = nn.Parallel(1,2)     -- 并行容器将把一个模块与维度1
                         -- (行空间)的每个切片关联起来,并在第二个维度上连接输出。

for i=1,10 do            -- 并行添加10个线性 + 重塑模块(输入=3,输出=2x1)
 local t=nn.Sequential()
 t:add(nn.Linear(3,2))   -- 线性模块(输入=3,输出=2)
 t:add(nn.Reshape(2,1))  -- 重塑大小为2的1D张量为大小为2x1的2D张量
 c:add(t)
end

mlp:add(c)

现在我想要共享 nn.Linear 层的权重(包括所有内容,权重、偏差、梯度),跨不同的 i 数字(例如 nn.Linear(3,2)[1]nn.Linear(3,2)[9])。 我有哪些选项可以共享这些权重?

还是推荐使用不同的容器/模块方法?

点赞
用户3754413
用户3754413

你可以创建将被重复使用的模块:

t = nn.Sequential()
t:add(nn.Linear(3,2))
t:add(nn.Reshape(2,1))

然后,使用torch的clone函数和额外参数共享权重(https://github.com/torch/nn/blob/master/doc/module.md#clonemlp):

mlp = nn.Sequential()
c = nn.Parallel(1,2)
for i = 1, 10 do
    c:add(t:clone('weight', 'bias'))
end
mlp:add(c)
2017-07-26 14:32:42