Keras:了解条件GAN中嵌入层的作用

时间:2019-03-07 20:46:48

标签: python keras neural-network deep-learning generative-adversarial-network

我正在努力理解ErikLinder-Norén的implementation of the Categorical GAN model,并且对该模型中的生成器感到困惑:

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 个答案:

答案 0 :(得分:1)

嵌入会存储每个标签的状态。如果我正确阅读了代码,则每个标签都对应一个数字。即有一个嵌入可以捕获如何生成0、1,... 9。

此代码接收一些随机噪声,并将其乘以每个标签状态。结果应该是一个向量,引导生成器显示与标签相对应的数字(即0..9)。

答案 1 :(得分:1)

要记住为什么要在这里完全使用嵌入:替代方法是将噪声与条件类连接在一起,这可能会导致生成器完全忽略噪声值,从而在每个类中生成高度相似的数据(甚至只是每堂课1个。

答案 2 :(得分:1)

从文档https://keras.io/layers/embeddings/#embedding

将正整数(索引)转换为固定大小的密集向量。  例如。 [[4],[20]]-> [[0.25,0.1],[0.6,-0.2]]

在GAN模型中,将输入整数(0-9)转换为形状为100的矢量。使用此短代码段,我们可以提供一些测试输入以检查Embedding层的输出形状。

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)

从模型摘要来看,嵌入层的输出形状为(1,100),与预测的输出相同。

embedding_1(嵌入)(无,1,100) 1000

在输出形状(1,1,100)中再增加一个点,最左边的1是批处理大小,中间的1是输入长度。在这种情况下,我们提供了长度为1的输入。