我对深度学习很陌生,所以我有一个问题:
假设输入的灰度图像的形状为 (128,128,1)。目标(输出)也是一个 (128,128,1) 大小的图像,例如用于分割,深度预测等。通常使用有效填充,图像的大小在经过几个卷积层后会缩小。
什么是体面的(可能不是最难的)变体来保持大小或预测相同大小的图像?是通过相同的填充吗?是通过转置卷积还是上采样?我应该在最后使用 FCN 并将它们重塑为图像大小吗?我正在使用 pytorch。我会很高兴得到任何提示,因为我在互联网上找不到太多。
最佳
答案 0 :(得分:2)
TLDR; 您想查看有助于使用卷积运算重新生成图像的 Deconv networks(卷积转置)。您想要构建一个编码器-解码器卷积架构,该架构使用卷积将图像压缩为潜在表示,然后从该压缩表示中解码图像。对于图像分割,流行的架构是 U-net
。
注意:我无法回答 pytorch,所以我将他分享 Tensorflow 等价物。请随意忽略代码,但既然您正在寻找概念,我可以帮助您解决此问题。
您正在尝试生成图像作为网络的输出。
一系列卷积运算有助于 Downsample
图像。由于您需要一个输出 2D 矩阵(灰度图像),因此您还需要 Upsample
。这样的网络称为 Deconv 网络。
第一系列层对输入进行卷积,将它们“展平”为通道向量。下一组层使用 2D Conv Transpose
或 Deconv
操作将通道改回 2D 矩阵(灰度图像)
参考此图片以供参考 -
这是一个示例代码,向您展示了如何使用 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)
此外,如果您正在寻找该领域中久经考验的架构,请查看 U-net
; U-Net: Convolutional Networks for Biomedical Image Segmentation。这是一种 encoder-decoder (conv2d, conv2d-transpose)
架构,它使用名为 skip connections
的概念来避免信息丢失并生成更好的图像分割掩码。