【问题标题】:Keras: Understanding the role of Embedding layer in a Conditional GANKeras:了解嵌入层在条件 GAN 中的作用
【发布时间】:2019-07-29 20:33:18
【问题描述】:

我正在努力理解 Erik Linder-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() 行是如何工作的,我将非常感谢他们的帮助!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢@ian,这是有道理的。但是你能描述一下label_embedding 的值吗?
    • 佩德罗在 cmets 中的回答是正确的并且解释得很好
    【解决方案2】:

    来自文档,https://keras.io/layers/embeddings/#embedding

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

    在 GAN 模型中,输入整数(0-9)被转换为形状为 100 的向量。使用这个短代码 sn-p,我们可以提供一些测试输入来检查嵌入层的输出形状。

    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是batch size,中间的1是输入长度。在这种情况下,我们提供了长度为 1 的输入。

    【讨论】:

    • 感谢@MajorMohan 这个简单的模型,我没想到会这样做。你明白[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]] 是什么意思吗?该函数描述的映射是什么?另外应该如何理解mod.predict(test_input) 在这里返回的值?输入为零,输出是一个密集的、看似随机的向量。如果您能帮助我理解为什么该向量具有它所具有的值,我将不胜感激。
    • 在条件 GAN 中,两个输入被馈送到网络:噪声和 y(条件变量)。噪声由长度为 100 的向量表示。对于 y,我们也使用嵌入层将输入转换为长度为 100 的向量。我们将噪声和嵌入层的输出相乘并将其馈送到网络。嵌入层也具有权重,这些权重是作为训练过程的一部分学习的。我创建的代码 sn-p 只是为了显示如何检查 Embedding 层的输出尺寸。
    • github.com/malzantot/Pytorch-conditional-GANs/blob/master/… 在这个实现中,不是使用嵌入层,而是使用可能的 y 值的 one-hot 编码后跟密集层来表示 y。然后将其与噪声连接(第 63-65 行)。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的回复。如果你有时间,我可以请你描述一下乘法是如何工作的吗?一个向量的形状为 10,而另一个向量的形状为 100,它们是如何相乘的?该操作的输出形状是什么,结果向量中的每个单元格代表什么?您可以就这些问题提供的任何建议都会非常有帮助!
    • Embedding 层返回 1 个 self.latent_dim 宽的向量。它执行查找操作。您可以将嵌入视为 [num_classes, embedding_dims] 的矩阵,将查找视为切片操作,其中 [label] 是索引。它输出一个为 [1,latent_dim] 的形状。 Flatten() 操作将其转换为向量。因此噪声和嵌入查找具有相同的维度。乘法只是对向量进行元素乘法。
    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2021-05-12
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多