我正在解决一个玩具问题,试图使用 keras 模型将图像的分辨率提高 2 倍。使用 keras 实现此目的的基本操作是 Conv2DTranspose。使用功能模型 API,我将每个像素分成四个:
upconv = Conv2DTranspose(kernel_size=(2, 2), strides=2, filters=3)(previous)
生成的转置卷积是 (1*1*3)*(2*2*3) = 36 参数操作,它给了我想要的输出分辨率。
我想做的是将输入图像中的相邻像素包含在卷积核中。对于输入上的每个像素,我想包括每个相邻像素,或 3x3 像素;输出将是相同的(2x2 像素,步幅为 2)。这个内核将有 (3*3*3)*(2*2*3) = 324 个参数。
我无法找到有关如何执行此操作的任何信息。有任何想法吗?
现在我正在使用两层解决方法:
具有 3x3 内核和步长 1(以及零填充以节省像素数)的 Conv2D 层,具有 9 个过滤器;
我像以前一样将我的 Conv2DTranspose 层应用于输出。
这捕获了所需的信息,其想法是它沿过滤器维度对位置信息进行编码,总参数计数为 351,因此它应该具有足够的自由度来近似相同的效果。
我也可以尝试在中间层使用 27 个过滤器,这有点像将 3x3x3 像素信息“扁平化”为一个“像素”。唯一的缺点是这会导致总共 1,053 个参数;比以前多得多。好处是它让我有机会在这个编码步骤中引入非线性;也许模型可以从这些额外的参数中受益。