0

我正在努力了解 Erik Linder-Norén 的分类 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()这里的线路是如何工作的,我将非常感谢他们的帮助!

4

3 回答 3

3

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

于 2019-03-07T21:55:29.947 回答
2

从文档中,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)

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

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

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

于 2019-03-08T09:31:48.323 回答
1

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

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

于 2019-03-07T21:03:46.070 回答