Pytorch CNN的输出应该是图像

Pytorch CNN的输出应该是图像,pytorch,Pytorch,我对深度学习非常陌生,所以我有一个问题: 假设输入的灰度图像形状为(128128,1)。目标(输出)也是(128128,1)大小的图像,例如用于分割、深度预测等。。通常使用有效的填充,图像的大小会在几个卷积层后缩小 什么是合适的(可能不是最难的)变体来保持大小或预测相同大小的图像?是通过相同的填充物吗?是通过变换卷积还是上采样?我是否应该在末尾使用FCN并将其重塑为图像大小?我在用火把。我很乐意得到任何提示,因为我在网上没有找到太多 最佳TLDR您希望查看(卷积转置),它有助于使用卷积运算重新生

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

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

什么是合适的(可能不是最难的)变体来保持大小或预测相同大小的图像?是通过相同的填充物吗?是通过变换卷积还是上采样?我是否应该在末尾使用FCN并将其重塑为图像大小?我在用火把。我很乐意得到任何提示,因为我在网上没有找到太多


最佳TLDR您希望查看(卷积转置),它有助于使用卷积运算重新生成图像。您希望构建一个编码器-解码器卷积体系结构,该体系结构使用卷积将图像压缩为潜在表示,然后从该压缩表示中解码图像。对于图像分割,一种流行的体系结构是
U-net


注意:我无法回答pytorch的问题,因此我将与他共享Tensorflow等价物。请忽略代码,但由于您正在寻找概念,我可以帮助您解决此问题

您正试图生成一个图像作为网络的输出

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

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

请参阅此图以供参考-

下面是一个示例代码,演示如何使用deconv网络将(10,3,1)图像转换为(12,10,1)图像

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


此外,如果您正在该领域寻找经过测试的体系结构,请查看
U-net
。这是一种
编码器-解码器(conv2d,conv2d转置)
体系结构,它使用一种称为
跳过连接的概念来避免信息丢失并生成更好的图像分割掩码


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


注意:我无法回答pytorch的问题,因此我将与他共享Tensorflow等价物。请忽略代码,但由于您正在寻找概念,我可以帮助您解决此问题

您正试图生成一个图像作为网络的输出

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

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

请参阅此图以供参考-

下面是一个示例代码,演示如何使用deconv网络将(10,3,1)图像转换为(12,10,1)图像

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


此外,如果您正在该领域寻找经过测试的体系结构,请查看
U-net
。这是一种
编码器-解码器(conv2d,conv2d转置)
体系结构,它使用一种称为
跳过连接的概念来避免信息丢失并生成更好的图像分割掩码

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)