我有一个编码器,它输出一个形状为(bn, c * k, 32, 32)
的张量。我现在想用shape(bn, k, 1, 2)
生成k均值。所以平均值是2维坐标。为此,我希望使用k FC层,而对于每个平均k_I,我只希望使用c通道
因此,我的想法是,我将编码器输出out
重塑为一个具有形状(bn, k, c, 32, 32)
的5d张量。然后我可以使用展平的out[:, 0]
out[:, k]
作为k线性层的输入
简单的解决方案是手动定义线性层:
self.fc0 = nn.Linear(c * 32 * 32, 2)
...
self.fck = nn.Linear(c * 32 * 32, 2)
然后我可以为每个平均值定义向前传球,如下所示:
mean_0 = self.fc0(out[:, 0].reshape(bn, -1))
...
mean_k = self.fck(out[:, k].reshape(bn, -1))
有没有更有效的方法
您可以使用nn.ModuleList执行类似操作:
样本输出:
我相信你在寻找一个分组卷积。您可以让} 卷积层,并设置为接收
axis=1
具有k*c
张量,因此输入形状为(bn, k*c, 32, 32)
。然后使用带有2*k
过滤器的^{k
组,因此它不是完全连接的通道级(一次仅c
映射的k
组:卷积c
)然后你可以根据自己的喜好重塑它
就参数数量而言,
nn.Conv2d
的典型用法是:这正好是
c*k*2*k*32*32
权重,加上2*k
偏差在你的情况下,你会
它正好是前一层的
c*2*k*32*32
权重加上2*k
偏差。即k
倍。给定的过滤器只有c
层(而不是k*c
),这意味着它将有一个带有c
通道的输入(即包含c
映射的k
组之一)相关问题 更多 >
编程相关推荐