【问题标题】:Keras: problems with concatenate layer when building a Conditional GAN networkKeras:构建条件 GAN 网络时连接层的问题
【发布时间】:2021-02-22 01:32:50
【问题描述】:

我目前正在尝试构建一个 Conditional GAN 网络,但是在使用 Concatenate 层时遇到了一些问题。

我收到以下错误代码:

WARNING:tensorflow:Model was constructed with shape (None, 256, 256, 1) for input KerasTensor(type_spec=TensorSpec(shape=(None, 256, 256, 1), dtype=tf.float32, name='discriminator_data_input'), name='discriminator_data_input', description="created by layer 'discriminator_data_input'"), but it was called on an input with incompatible shape (None, 128, 128, 1).

从逻辑上讲,它们不应该适合吗,因为它们都是形状 (256, 256, 1)?

关于我使用哪些参数的一些上下文:

  • input_dim = (256, 256, 1)
  • discriminator_conv_filters = [64,64,128,128]
  • discriminator_conv_kernel_size = [5,5,5,5]
  • discriminator_conv_strides = [2,2,2,1]
  • discriminator_batch_norm_momentum = 无
  • discriminator_activation = 'leaky_relu'
  • discriminator_dropout_rate = 0.4
  • discriminator_learning_rate = 0.0008

这是我用来构造鉴别器的代码:

def _build_discriminator(self):
        
        #Should be a variable on the class:
        n_classes = 4
        
        #Conditional feature: label input
        in_label = Input(shape=(1,), name='discriminator_label_input')
        
        #Conditional feature: embedding for categorical input
        #Each of the 10 classes for the Fashion MNIST dataset (0 through 9) will map to a different 50-element-
        #- vector representation that will be learned by the discriminator model.
        li = Embedding(n_classes, 50)(in_label)
        
        #Conditional feature: scale up to image dimensions with linear activation
        n_nodes = self.input_dim[0] * self.input_dim[1]
        
        li = Dense(n_nodes)(li)
        
        #Conditional feature: reshape to additional channel
        li = Reshape((self.input_dim[0], self.input_dim[1], 1))(li)
        
        ### THE discriminator
        in_image = Input(shape=self.input_dim, name='discriminator_data_input')
        
        #Conditional feature: concat label as a channel
        merge = Concatenate()([li, in_image])
        
        for i in range(self.n_layers_discriminator):

            if i == 0:
                x = Conv2D(
                    filters = self.discriminator_conv_filters[i]
                    , kernel_size = self.discriminator_conv_kernel_size[i]
                    , strides = self.discriminator_conv_strides[i]
                    , padding = 'same'
                    , name = 'discriminator_conv_' + str(i)
                    , kernel_initializer = self.weight_init
                    )(merge)
            else:
                x = Conv2D(
                    filters = self.discriminator_conv_filters[i]
                    , kernel_size = self.discriminator_conv_kernel_size[i]
                    , strides = self.discriminator_conv_strides[i]
                    , padding = 'same'
                    , name = 'discriminator_conv_' + str(i)
                    , kernel_initializer = self.weight_init
                    )(x)

            if self.discriminator_batch_norm_momentum and i > 0:
                x = BatchNormalization(momentum = self.discriminator_batch_norm_momentum)(x)

            x = self.get_activation(self.discriminator_activation)(x)

            if self.discriminator_dropout_rate:
                x = Dropout(rate = self.discriminator_dropout_rate)(x)

        x = Flatten()(x)
        
        discriminator_output = Dense(1, activation='sigmoid', kernel_initializer = self.weight_init)(x)

        self.discriminator = Model([in_image, in_label], discriminator_output)

【问题讨论】:

    标签: tensorflow keras deep-learning keras-layer generative-adversarial-network


    【解决方案1】:

    错误消息本身就说明了问题。该模型预计会接收形状为(None, 256, 256, 1) 的数据,但是您在训练时为模型提供的图像(None, 128, 128, 1)。您必须在将数据输入模型之前对其进行整形,或将self.input_dim 更改为(256, 256, 1)

    【讨论】:

    • 我还没有训练模型,我只是在构建它。所以当我编译模型时我得到了错误
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2011-07-24
    • 2019-02-07
    相关资源
    最近更新 更多