逐像素回归。如何从 Nx1xHxW 到 Nx3xHxW?
Pixelwise regression. How to go from Nx1xHxW to Nx3xHxW?
我有一张 Nx1xHxW 的特征图。我需要添加第二个头来生成 Nx3xHxW 表示像素级回归,每个像素都有一个三元组。
问题是:如何从 Nx1xHxW 变为 Nx3xHxW?就引入的参数而言,全连接层的成本太高。
这就是我正在尝试使用在 PyTorch 中定义为 nn.Conv2d(1, 3, (1, 1), stride=1, bias=True) 的 1x1x3 卷积滤波器,但结果似乎并不令人鼓舞。欢迎任何建议。
最佳
您可以使用非参数操作在正向函数中的任意点扩展数据的维度,以强制输出为这种形状。例如:
def forward(input):
input = input.repeat(1,3,1,1)
output = self.layers(input)
return output
或:
def forward(input):
intermediate = self.layers(input)
intermediate.repeat(1,3,1,1)
output = self.more_layers(intermediate)
return output
理论上,存在一些非线性函数可以在给定 1 维输入的情况下产生 3d 像素输出。您可以尝试使用一系列 NN 层来学习这个非线性函数,但是,正如您在上面指出的那样,这可能不会产生很好的结果,而且可能很难学好。相反,您可以简单地在某个点扩展输入,这样您就可以学习具有 NN 层的 3d 到 3d 像素级非线性函数。 torch.repeat
和其他类似操作是可区分的,因此不应导致学习问题。
我有一张 Nx1xHxW 的特征图。我需要添加第二个头来生成 Nx3xHxW 表示像素级回归,每个像素都有一个三元组。
问题是:如何从 Nx1xHxW 变为 Nx3xHxW?就引入的参数而言,全连接层的成本太高。
这就是我正在尝试使用在 PyTorch 中定义为 nn.Conv2d(1, 3, (1, 1), stride=1, bias=True) 的 1x1x3 卷积滤波器,但结果似乎并不令人鼓舞。欢迎任何建议。
最佳
您可以使用非参数操作在正向函数中的任意点扩展数据的维度,以强制输出为这种形状。例如:
def forward(input):
input = input.repeat(1,3,1,1)
output = self.layers(input)
return output
或:
def forward(input):
intermediate = self.layers(input)
intermediate.repeat(1,3,1,1)
output = self.more_layers(intermediate)
return output
理论上,存在一些非线性函数可以在给定 1 维输入的情况下产生 3d 像素输出。您可以尝试使用一系列 NN 层来学习这个非线性函数,但是,正如您在上面指出的那样,这可能不会产生很好的结果,而且可能很难学好。相反,您可以简单地在某个点扩展输入,这样您就可以学习具有 NN 层的 3d 到 3d 像素级非线性函数。 torch.repeat
和其他类似操作是可区分的,因此不应导致学习问题。