CNN的输出应该是图像

时间:2021-01-12 13:20:49

标签: pytorch

我对深度学习很陌生,所以我有一个问题:

假设输入的灰度图像的形状为 (128,128,1)。目标(输出)也是一个 (128,128,1) 大小的图像,例如用于分割,深度预测等。通常使用有效填充,图像的大小在经过几个卷积层后会缩小。

什么是体面的(可能不是最难的)变体来保持大小或预测相同大小的图像?是通过相同的填充吗?是通过转置卷积还是上采样?我应该在最后使用 FCN 并将它们重塑为图像大小吗?我正在使用 pytorch。我会很高兴得到任何提示,因为我在互联网上找不到太多。

最佳

1 个答案:

答案 0 :(得分:2)

TLDR; 您想查看有助于使用卷积运算重新生成图像的 Deconv networks(卷积转置)。您想要构建一个编码器-解码器卷积架构,该架构使用卷积将图像压缩为潜在表示,然后从该压缩表示中解码图像。对于图像分割,流行的架构是 U-net


注意:我无法回答 pytorch,所以我将他分享 Tensorflow 等价物。请随意忽略代码,但既然您正在寻找概念,我可以帮助您解决此问题。

您正在尝试生成图像作为网络的输出。

一系列卷积运算有助于 Downsample 图像。由于您需要一个输出 2D 矩阵(灰度图像),因此您还需要 Upsample。这样的网络称为 Deconv 网络。

第一系列层对输入进行卷积,将它们“展平”为通道向量。下一组层使用 2D Conv TransposeDeconv 操作将通道改回 2D 矩阵(灰度图像)

参考此图片以供参考 -

enter image description here

这是一个示例代码,向您展示了如何使用 deconv 网络将 (10,3,1) 图像转换为 (12,10,1) 图像。

<块引用>

您可以在 pytorch here 中找到 conv2dtranspose 层实现。

from tensorflow.keras import layers, Model, utils

inp = layers.Input((128,128,1))  ##
x = layers.Conv2D(2, (3,3))(inp) ##  Convolution part
x = layers.Conv2D(4, (3,3))(x)   ##
x = layers.Conv2D(6, (3,3))(x)   ##

##########

x = layers.Conv2DTranspose(6, (3,3))(x)
x = layers.Conv2DTranspose(4, (3,3))(x)   ##   ##  Deconvolution part
out = layers.Conv2DTranspose(1, (3,3))(x) ##

model = Model(inp, out)
utils.plot_model(model, show_shapes=True, show_layer_names=False)

enter image description here


此外,如果您正在寻找该领域中久经考验的架构,请查看 U-net; U-Net: Convolutional Networks for Biomedical Image Segmentation。这是一种 encoder-decoder (conv2d, conv2d-transpose) 架构,它使用名为 skip connections 的概念来避免信息丢失并生成更好的图像分割掩码。

enter image description here