澄清后,这是我的答案。
您要解决的问题似乎是将尺寸为 (10,3,1) 的二维灰度图像转换为尺寸为 (12,10,1) 的二维灰度图像的神经网络。
2D 灰度图像只不过是一个额外的轴设置为 1 的 2D 矩阵。
a = np.array([[0,1,0],
[1,0,1],
[0,1,0]])
a.shape
#OUTPUT = (3,3)
a.reshape((3,3,1)) #reshape to 3,3,1
#OUTPUT -
#array([[[0],
# [1],
# [0]],
#
# [[1],
# [0],
# [1]],
#
# [[0],
# [1],
# [0]]])
因此(10,3)的2D矩阵可以称为具有单通道(10,3,1)的3D图像。这将允许您正确地将卷积应用于您的输入。
如果这部分清楚了,那么在网络的前向计算中,既然要保证捕捉到 1 和 0 的空间位置,就要使用卷积层。在这里使用密集层不是正确的步骤。
然而,一系列卷积操作有助于Downsample
和图像。由于您需要输出 2D 矩阵(灰度图像),因此您也需要Upsample
。这样的网络称为 Deconv 网络。
第一系列层对输入进行卷积,将它们“展平”为通道向量。下一组层使用 2D Conv Transpose 操作将通道改回 2D 矩阵(灰度图像)
请参阅此图像以供参考 -
这是一个示例代码,向您展示如何使用反卷积网络将 (10,3,1) 图像转换为 (12,10,1) 图像。
from tensorflow.keras import layers, Model
inp = layers.Input((10,3,1)) ##
x = layers.Conv2D(2, (2,2))(inp) ## Convolution part
x = layers.Conv2D(4, (2,2))(x) ##
x = layers.Conv2DTranspose(4, (3,4))(x) ##
x = layers.Conv2DTranspose(2, (2,4))(x) ## Deconvolution part
out = layers.Conv2DTranspose(1, (2,4))(x) ##
model = Model(inp, out)
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_33 (InputLayer) [(None, 10, 3, 1)] 0
_________________________________________________________________
conv2d_49 (Conv2D) (None, 9, 2, 2) 10
_________________________________________________________________
conv2d_50 (Conv2D) (None, 8, 1, 4) 36
_________________________________________________________________
conv2d_transpose_46 (Conv2DT (None, 10, 4, 4) 196
_________________________________________________________________
conv2d_transpose_47 (Conv2DT (None, 11, 7, 2) 66
_________________________________________________________________
conv2d_transpose_48 (Conv2DT (None, 12, 10, 1) 17
=================================================================
Total params: 325
Trainable params: 325
Non-trainable params: 0
_________________________________________________________________
显然,可以随意添加激活、丢弃、池化层等。上面的代码只是展示了如何使用下采样和上采样从给定的单通道图像获取到另一个单通道图像。
附带说明 - 我真的建议您花一些时间了解 CNN 的工作原理。反卷积网络很复杂,如果您要解决涉及它们的问题,在正确理解 2D CNN 的工作原理之前,它可能会导致一些基础问题,尤其是在您开始学习该领域时。