Keras: Понимание роли встраивания слоя в условный GAN - PullRequest
0 голосов
/ 07 марта 2019

Я работаю над тем, чтобы понять реализацию 1002 * Эрика Линдера-Норена модели Категориальной GAN , и меня смущает генератор в этой модели:

def build_generator(self):
    model = Sequential()
    # ...some lines removed...    
    model.add(Dense(np.prod(self.img_shape), activation='tanh'))
    model.add(Reshape(self.img_shape))
    model.summary()

    noise = Input(shape=(self.latent_dim,))
    label = Input(shape=(1,), dtype='int32')
    label_embedding = Flatten()(Embedding(self.num_classes, self.latent_dim)(label))
    model_input = multiply([noise, label_embedding])
    img = model(model_input)

    return Model([noise, label], img)

Мой вопрос: какслой Embedding() здесь работает?

Я знаю, что noise - это вектор длиной 100, а label - целое число, но я не понимаю, что содержит объект label_embedding, иликак это работает здесь.

Я попытался напечатать форму label_embedding, чтобы попытаться выяснить, что происходит в этой строке Embedding(), но это возвращает (?,?).

Если бы кто-нибудь мог помочь мне понять, как здесь работают Embedding() строки, я был бы очень благодарен за их помощь!

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Чтобы помнить, зачем вообще использовать здесь встраивание: альтернатива состоит в объединении шума с условным классом, который может заставить генератор полностью игнорировать значения шума, генерируя данные с высоким сходством в каждом классе (или даже просто 1 на класс).

1 голос
/ 08 марта 2019

Из документации https://keras.io/layers/embeddings/#embedding,

Превращает натуральные числа (индексы) в плотные векторы фиксированного размера.например.[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]

В модели GAN входное целое число (0-9) преобразуется ввектор формы 100. С помощью этого короткого фрагмента кода мы можем передать некоторые тестовые входные данные для проверки выходной формы слоя «Внедрение».

from keras.layers import Input, Embedding
from keras.models import Model
import numpy as np
latent_dim = 100
num_classes = 10
label = Input(shape=(1,), dtype='int32')
label_embedding = Embedding(num_classes, latent_dim)(label)
mod = Model(label, label_embedding)
test_input = np.zeros((1))
print(f'output shape is {mod.predict(test_input).shape}')
mod.summary()

Выходная форма равна (1, 1, 100)

Исходя из сводки модели, выходная форма для встраиваемого слоя равна (1100), что совпадает с выходом предиката.

embedding_1 (Embedding) (None, 1, 100) 1000

Одна дополнительная точка в выходной форме (1,1100), крайняя левая 1 - партияразмер, середина 1 - длина ввода.В этом случае мы предоставили ввод длиной 1.

1 голос
/ 08 марта 2019

Вложение хранит состояние для каждой метки. Если я правильно прочитал код, каждая метка соответствует цифре; то есть есть вложение, которое фиксирует, как генерировать 0, 1, ... 9.

Этот код принимает некоторый случайный шум и умножает его на это для состояния метки. Результатом должен быть вектор, который заставляет генератор отображать цифру, соответствующую метке (т. Е. 0..9).

...