Python Keras模型通过使用“调整大小”输出具有特定大小的模型

Python Keras模型通过使用“调整大小”输出具有特定大小的模型,python,keras,resize,Python,Keras,Resize,在GANs的生成器模型中,我尝试生成特定大小的图像。我的目标尺寸是28x280x3。实际上,到目前为止,我正在创建一个28x28x3的发电机输出。因此,我尝试使用UpSampling2D来增加模型的大小。经过三个上采样2D层后,我能够使模型输出的大小28x224x3。但是,我的目标是28x280x3。我怎样才能在发散维度之间设置间隙?我注意到有一种方法的目标是调整层的大小。在我的情况下它如何工作?我的代码如下所示: def build_generator_face(latent_dim, cha

在GANs的生成器模型中,我尝试生成特定大小的图像。我的目标尺寸是
28x280x3
。实际上,到目前为止,我正在创建一个
28x28x3
的发电机输出。因此,我尝试使用
UpSampling2D
来增加模型的大小。经过三个上采样2D层后,我能够使模型输出的大小
28x224x3
。但是,我的目标是
28x280x3
。我怎样才能在发散维度之间设置间隙?我注意到有一种方法的目标是调整层的大小。在我的情况下它如何工作?我的代码如下所示:

def build_generator_face(latent_dim, channels, face_sequence):

  model = Sequential()
  model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, latent_dim))) 
  model.add(Reshape((7, 7, 128)))
  model.add(UpSampling2D())
  model.add(Conv2D(128, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))
  model.add(UpSampling2D())
  model.add(Conv2D(64, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))

  if face_sequence == False:
    #model.add(UpSampling2D(size=(2, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    #model.add(UpSampling2D(size=(2, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

  else:
    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    pdb.set_trace()
    model.add(Reshape((-1,3), input_shape=(28,224,3)))
    model.add(Lambda(lambda x: x[:7840])) # throw away some, so that #data = 224^2
    model.add(Reshape(28,280,3)) # this line gives me an error but am not sure if it is necessary or not the code is found in here: https://stackoverflow.com/questions/41903928/add-a-resizing-layer-to-a-keras-sequential-model

  model.add(Conv2D(channels, kernel_size=4, padding="same"))
  model.add(Activation("tanh"))

  model.summary()
  noise = Input(shape=(latent_dim,))
  img = model(noise)

  mdl = Model(noise, output = img)

  return mdl

如果面_序列为
False
,则模型生成的输出为
28x28x3
。当布尔变量为
True
时,我希望生成大小为
28x280x3
的输出。如何做到这一点?

您仅使用7840的第一个通道,然后尝试将其重塑为所需的形状。为此,您需要23520个元素(28*280*3),但只有18816个元素(28*224*3)

此代码在该过程的前面调整大小,并使用一个以上的上采样->Conv2D生成所需的形状

def build_generator_face(latent_dim, channels, face_sequence):

  model = Sequential()

  model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, latent_dim))) 
  model.add(Reshape((7, 7, 128)))
  model.add(UpSampling2D())
  model.add(Conv2D(128, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))

  model.add(UpSampling2D())
  model.add(Conv2D(64, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))

  if face_sequence == False:
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

  else:
    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    # go from 56 to 35 and continue upsampling

    model.add(Lambda(lambda x: x[:,:,:35,:]))



    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    pdb.set_trace()


  model.add(Conv2D(channels, kernel_size=4, padding="same"))
  model.add(Activation("tanh"))

  model.summary()


  return model

您仅使用7840的第一个通道,然后尝试重塑为所需的形状。为此,您需要23520个元素(28*280*3),但只有18816个元素(28*224*3)

此代码在该过程的前面调整大小,并使用一个以上的上采样->Conv2D生成所需的形状

def build_generator_face(latent_dim, channels, face_sequence):

  model = Sequential()

  model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, latent_dim))) 
  model.add(Reshape((7, 7, 128)))
  model.add(UpSampling2D())
  model.add(Conv2D(128, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))

  model.add(UpSampling2D())
  model.add(Conv2D(64, kernel_size=4, padding="same"))
  model.add(BatchNormalization(momentum=0.8))
  model.add(Activation("relu"))

  if face_sequence == False:
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

  else:
    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    # go from 56 to 35 and continue upsampling

    model.add(Lambda(lambda x: x[:,:,:35,:]))



    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    model.add(UpSampling2D(size=(1, 2)))
    model.add(Conv2D(64, kernel_size=4, padding="same"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Activation("relu"))

    pdb.set_trace()


  model.add(Conv2D(channels, kernel_size=4, padding="same"))
  model.add(Activation("tanh"))

  model.summary()


  return model


这能解决你的问题吗?我已经试过了,没用。我不确定重塑是否也是一个好的解决方案。事实上,第一行model.add(重塑(-1,3),input_shape=(160320,3))已经有问题了。你想让10个面彼此相邻吗?是的,所以我想知道这是否可行。也许这种方法太粗糙了,我需要在数组中执行它。不确定。我使用@TYZ提供的解决方案和收到的错误进行了更新。这能解决您的问题吗?我已经试过了,没用。我不确定重塑是否也是一个好的解决方案。事实上,第一行model.add(重塑(-1,3),input_shape=(160320,3))已经有问题了。你想让10个面彼此相邻吗?是的,所以我想知道这是否可行。也许这种方法太粗糙了,我需要在数组中执行它。不确定。我使用@TYZ提供的解决方案和收到的错误进行了更新。也许这样更好,否则维度会爆炸。我想,else中的第一个协解应该有3个内核。通过更改,我收到以下错误:**ValueError:此行中新数组的总大小必须保持不变:model.add(重塑((28,35,3)),使用相同的填充。输出形状与输入形状相同,因此将kernel更改为3不会改变输出大小中的任何内容。在Colab中,它与最终形状(None,28280,3)完美配合:在调试模式下,我可以一直运行到这里:model.add(Lambda(Lambda x:x[:2940]))但是,当这条线工作时,似乎整形无法继续:新数组的总大小必须不变,而且我需要将核大小调整到最后一个卷积,因为它是64,而输入的是_shape=(28,56,3)。也许这更好,否则在维度上会出现爆炸。我猜,其他的第一个协解应该有3个核。通过更改,我收到以下错误:**ValueError:此行中新数组的总大小必须保持不变:model.add(重塑((28,35,3)),使用相同的填充。输出形状与输入形状相同,因此将kernel更改为3不会改变输出大小中的任何内容。在Colab中,它与最终形状(None,28280,3)完美配合:在调试模式下,我可以一直运行到这里:model.add(Lambda(Lambda x:x[:2940]))但是,当这条线工作时,似乎整形无法继续:新数组的总大小必须不变,并且我需要将内核大小设置为最后一次卷积,因为当输入_shape=(28,56,3)时,它是64。