Как решить, сколько сверток и разложений применимо к GAN? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь понять, как работает состязательная порождающая сеть: я нашел пример в книге Франсуа Шоле («глубокое обучение с Python»), в которой есть пример GAN, в котором он использует набор данных CIFAR10 с использованием «лягушки». 'класс, содержащий 32x32 RGB-изображения.

Я не могу понять, почему:

  • В (1) вход преобразован в 16 × 16 128-канальную (почему 128-канальную?) Функциональную карту
  • В (2), когда выполняется свертка, с каким фильтром? Не указано

Затем запустите другой Conv2DTranspose, а затем еще 3 Conv2d. Почему?!

В конце у меня есть одноканальная карта объектов 32 × 32.

from keras import layers
import numpy as np
latent_dim = 32
height = 32
width = 32
channels = 3

generator_input = keras.Input(shape=(latent_dim,))

(1)
x = layers.Dense(128 * 16 * 16)(generator_input)
x = layers.LeakyReLU()(x)
x = layers.Reshape((16, 16, 128))(x)

(2)
x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2DTranspose(256, 4, strides=2, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(256, 5, padding='same')(x)
x = layers.LeakyReLU()(x)

x = layers.Conv2D(channels, 7, activation='tanh', padding='same')(x)
generator = keras.models.Model(generator_input, x)
generator.summary()

Ответы [ 2 ]

1 голос
/ 31 мая 2019

1) Это произвольный выбор, вы могли бы выбрать любое количество каналов для слоя Dense.

16x16 выбрано, поскольку для шага 2 задано значение Conv2DTranspose, и вы хотите увеличить ширину и высоту, чтобы получить выход 32x32.

Шаги используются для влияния на выходной размер сверточных слоев. В обычных свертках выходные данные подвергаются понижающей дискретизации с тем же коэффициентом, что и шаги, тогда как в транспонированных извилинах они подвергаются дополнительной дискретизации с тем же коэффициентом, что и шаги.

Например, вы можете изменить выход первого слоя на 8x8x128 и затем использовать шаг 4 в вашем Conv2DTranspose, таким образом, вы получите тот же результат с точки зрения размерности.

Также имейте в виду, что, как сказал Франсуа Шоле в своей книге, при использовании шаговых транспонированных сверток, чтобы избежать артефактов шахматной доски, вызванных неравномерным охватом пиксельного пространства, размер ядра должен делиться на количество шагов.

2) Первый аргумент, который вы задаете в Conv2D или Conv2DTranspose, - это количество фильтров, созданных слоем свертки.

Как уже было сказано, шаг Conv2DTranspose используется точно для увеличения ширины и высоты выборки с коэффициентом, равным количеству шагов.

Другие 3 Conv2D также являются произвольными, вы должны определить их экспериментально и подстроив вашу модель.

1 голос
/ 31 мая 2019

для 1) я не думаю, что есть причина для количества используемых плотных узлов (128x16x16), однако 16x16 установлен, потому что у вас есть только 1 слой для выборки от 16x16 до 32x32.

для2) первый аргумент 256, используемый для создания экземпляра Conv2D, определяет количество фильтров.

По поводу вашего последнего вопроса Next, run another Conv2DTranspose and then another 3 Conv2d. Why?! Я бы порекомендовал увеличить / уменьшить числослоев, чтобы понять, как модель ведет себя с этими изменениями (работает лучше или нет), это часть процесса « настройка гиперпараметров » при построении нейронной сети.

Надеюсь, что выше помогает.

...