首页 > 解决方案 > Tensorflow - 深度到空间后与conv2d不兼容的形状

问题描述

我在实现超分辨率模型时遇到问题

class SRNet(Model):
    def __init__(self, scale=4):
        super(SRNet, self).__init__()
        self.scale = scale

        self.conv1 = Sequential([
            layers.Conv2D(filters=64, kernel_size=3,
                          strides=(1, 1), padding="same", data_format="channels_first"),
            layers.ReLU(),
        ])

        self.residualBlocks = Sequential(
            [ResidualBlock() for _ in range(16)])

        self.convUp = Sequential([
            layers.Conv2DTranspose(filters=64, kernel_size=3, strides=(
                2, 2), padding="same", data_format="channels_first"),
            layers.ReLU(),
            layers.Conv2DTranspose(filters=64, kernel_size=3, strides=(
                2, 2), padding="same", data_format="channels_first"),
            layers.ReLU(),
        ])

        self.reluAfterPixleShuffle = layers.ReLU()

        self.convOut = layers.Conv2D(
            filters=3, kernel_size=3, strides=(1, 1), padding="same", data_format="channels_first", input_shape=(4, 1440, 2560))  # (kernel, kernel, channel, output)

    def call(self, lrCur_hrPrevTran):
        lrCur, hrPrevTran = lrCur_hrPrevTran
        x = tf.concat([lrCur, hrPrevTran], axis=1)
        x = self.conv1(x)
        x = self.residualBlocks(x)
        x = self.convUp(x)

        # pixel shuffle
        Subpixel_layer = Lambda(lambda x: tf.nn.depth_to_space(
            x, self.scale, data_format="NCHW"))
        x = Subpixel_layer(inputs=x)
        x = self.reluAfterPixleShuffle(x)
        
        x = self.convOut(x)
        return x

错误

/usr/src/app/generator.py:164 call  *
        x = self.convOut(x)
ValueError: Tensor's shape (3, 3, 64, 3) is not compatible with supplied shape (3, 3, 4, 3)

阅读错误后,我知道 (3, 3, 4, 3) 是 (kernel size, kernel size, channel, output) 意味着只有输入通道不正确

所以我打印出输入的形状

# after pixel shuffle before convOut
print(x.shape)
>>> (1, 4, 1440, 2560) (batch size, channel, height, width)

但是 x 之后的形状pixel shuffle (depth_to_space)是 (1, 4, 1440, 2560) 通道值是 4 与convOut需要相同

问题是为什么输入的通道从 4 变为 64 作为错误?

标签: pythontensorflowdeep-learningconv-neural-network

解决方案


我找到了解决方案

首先,在模型
的实现和测试期间,我在训练时使用检查点来保存模型权重,我改变了一些层,所以输入大小也改变了,但我的权重仍然记得之前的输入大小检查点

所以我删除了检查点文件夹,然后一切正常


推荐阅读