Модель Keras выводит модель с указанным размером c, используя resize - PullRequest
0 голосов
/ 29 апреля 2020

В модели генератора GAN я пытаюсь сгенерировать изображение определенного c размера. Мой целевой размер 28x280x3. Я на самом деле, до сих пор я создавал генератор на выходе 28x28x3. Поэтому я пытаюсь с помощью UpSampling2D увеличить размер модели. Я могу сделать вывод модели размером 28x224x3 после трех слоев UpSampling2D. Тем не менее, моя цель - 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

Если face_sequence равен False, модель генерирует вывод 28x28x3. Я хочу, чтобы когда логическая переменная True генерировала вывод размером 28x280x3. Как это можно сделать?

1 Ответ

3 голосов
/ 29 апреля 2020

Вы использовали только первый канал с 7840, а затем пытались преобразовать его в нужную форму. Для этого вам понадобится 23520 элементов (28 * 280 * 3), но у вас будет только 18816 (28 * 224 * 3).

Этот код изменяет размер ранее в процессе и использует еще один результат UpSampling-> 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
...