Бэкпроп в слитых моделях

Я работаю над условными GAN, и мой генератор и дискриминатор имеют два входа и используют объединенные модели, подобные этой:

z = Input(shape=(100,))
  temp = Input(shape=(384,))

  generator=Generator()
  img = generator([z,temp])

  valid = discriminator([img,temp])

  combined = Model([z,temp], valid)
  combined.compile(loss='binary_crossentropy', optimizer=optimizer)

DCGAN используется для классификации и генерации изображений, зависящих от "временного" встраивания, и я использую Adam "оптимизатор = Адам (0,0001, 0,5)" для обеих моделей.

GEN как будто принимает входной шум "z" и "temp" объединяет их и создает изображения 128x128x3. Диск берет изображение и выполняет на нем conv2d, а затем преобразует "temp" в 1,128,3, объединяет оба, а затем применяет conv2d и выводит сигмовидную единицу. Мой вопрос заключается в том, что во время backprop, как обновляются веса объединенной модели, скажем, здесь Disc:

  inp1 = Input(shape=(128,128,3),name='inp1')
  inp2 = Input(shape=(384,),name='inp2')
  d2=Reshape(target_shape=(1,128,3))(inp2)


  d1 = Conv2D(16, kernel_size=5, strides=2, padding="same")(inp1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1 = Conv2D(32, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1 = Conv2D(64, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1 = Conv2D(128, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)


  d1 = Conv2D(256, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1=Flatten()(d1)
  d1=Dense(768, activation="relu")(d1)
  d1=Reshape(target_shape=(2,128,3))(d1)

  output=concatenate(
    [
        d1,
        d2,
    ]
    ,axis=1
  )


  d1 = Conv2D(64, kernel_size=5, strides=2, padding="same")(output)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1 = Conv2D(128, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1 = Conv2D(256, kernel_size=5, strides=2, padding="same")(inp1)
  d1=BatchNormalization(momentum=0.8)(d1)
  d1=LeakyReLU(alpha=0.2)(d1)
  d1=Dropout(0.25)(d1)

  d1=Flatten()(d1)

  output=Dense(1,activation='sigmoid')(d1)
  model=Model(
    inputs=[
      inp1,
      inp2
    ],
    outputs=[
      output
    ]
  )
  model.summary()
  img = Input(shape=(128,128,3))
  text=Input(shape=(384,))
  validity = model([img,text])

  return Model([img,text], validity)

И моя потеря диска начинается с 2,02 и достигает примерно 6,7 в 150 эпохах, а потеря Gen уменьшается с 0,80 до 0,00024 в 150 эпохах, и я получаю мусор, как я могу улучшить свою архитектуру? И мне было интересно, что, возможно, backprop не работает хорошо в объединенных моделях, потому что это становится намного сложнее. Я использую batchnorm, leaky relu, conv2d + stepde, без объединения слоев и сглаживания меток.

0 ответов

Другие вопросы по тегам