Keras:了解嵌入层在条件 GAN 中的作用
Keras: Understanding the role of Embedding layer in a Conditional GAN
我正在努力理解 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()
行中发生了什么,但 returns (?,?)
中发生了什么。
如果有人能帮助我理解这里的 Embedding()
行是如何工作的,我将非常感谢他们的帮助!
嵌入存储每个标签的状态。如果我没看错代码,每个标签对应一个数字;即有一个嵌入捕获如何生成 0、1、... 9。
此代码采用一些随机噪声并将其乘以每个标签状态。结果应该是一个向量,引导生成器显示与标签对应的数字(即 0..9)。
记住为什么要在这里使用嵌入:另一种方法是将噪声与条件 class 连接起来,这可能会导致生成器完全忽略噪声值,从而生成具有高相似度的数据每个 class(甚至每个 class 1 个)。
根据文档,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(嵌入)(None, 1, 100) 1000
加一点,在输出shape(1,1,100)中,最左边的1是batch size,中间的1是input length。在本例中,我们提供了长度为 1 的输入。
我正在努力理解 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()
行中发生了什么,但 returns (?,?)
中发生了什么。
如果有人能帮助我理解这里的 Embedding()
行是如何工作的,我将非常感谢他们的帮助!
嵌入存储每个标签的状态。如果我没看错代码,每个标签对应一个数字;即有一个嵌入捕获如何生成 0、1、... 9。
此代码采用一些随机噪声并将其乘以每个标签状态。结果应该是一个向量,引导生成器显示与标签对应的数字(即 0..9)。
记住为什么要在这里使用嵌入:另一种方法是将噪声与条件 class 连接起来,这可能会导致生成器完全忽略噪声值,从而生成具有高相似度的数据每个 class(甚至每个 class 1 个)。
根据文档,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(嵌入)(None, 1, 100) 1000
加一点,在输出shape(1,1,100)中,最左边的1是batch size,中间的1是input length。在本例中,我们提供了长度为 1 的输入。