python - keras.layers.Embedding 的输出形状

标签 python keras keras-layer flatten

我在datacamp上看一个视频来了解Keras,讲师使用了layers.Embedding和keras.layers.Flatten,但他并没有真正正确解释Embedding函数的输出。我用谷歌搜索了大约 3-4 个小时,但找不到任何可以帮助我的东西。

用文字解释目标:这就是他试图用普通英语做的事情。输入数据由一堆大学篮球队 ID 组成。由于 ID 并不能真正告诉我们有关球队的任何信息,因此他使用了 Embedding,输入形状为 1,输出形状为 1,输入维度等于球队数量。然后他说,我们的神经网络将以这种方式“学习”,将嵌入的新输出与篮球队的评级相关联,如果两支球队之前没有交手过,这将有助于预测结果。然后,(这就是我迷失的地方)他说嵌入实际上会向数组添加一个额外的维度,因此我们必须使用 keras.layers.flatten() 进行展平。

据我了解,如果我在 Embedding 中输入一个团队 id,输出(一旦神经网络学习了其所有参数)将是 ([team_id],[team_ rating]),并且在扁平化之后,它将是 ( [团队 ID、团队评级])。然而,按照他的描述,扁平化之后,输出的数字就只有一个:team_ rating。当他添加一个减法层时,这一点尤其明显,该减法层将从该扁平层中减去两个输出(给出 team_ rating 差异),从而用于预测游戏结果。

这是从输入层到输出层的完整代码(请注意,您可能不需要阅读代码来回答问题,但它有助于添加上下文)

n_teams = unique(games_season['team_1']).shape[0]

# Create an embedding layer
team_lookup = Embedding(input_dim=n_teams,
                        output_dim=1,
                        input_length=1,
                        name='Team-Strength')

# Create an input layer for the team ID
teamid_in = Input(shape=(1,))

# Lookup the input in the team strength embedding layer
strength_lookup = team_lookup(teamid_in)

# Flatten the output
strength_lookup_flat = Flatten()(strength_lookup)

# Combine the operations into a single, re-usable model
team_strength_model = Model(teamid_in, strength_lookup_flat, name='Team-Strength-Model')

# Input layer for team 1
team_in_1 = Input((1,),name='Team-1-In')

# Separate input layer for team 2
team_in_2 = Input((1,),name='Team-2-In')

# Lookup team 1 in the team strength model
team_1_strength = team_strength_model(team_in_1)

# Lookup team 2 in the team strength model
team_2_strength = team_strength_model(team_in_2)

# Create a subtract layer using the inputs from the previous exercise
score_diff = Subtract()([team_1_strength, team_2_strength])

# Subtraction layer from previous exercise
score_diff = Subtract()([team_1_strength, team_2_strength])

# Create the model
model = Model([team_in_1, team_in_2], score_diff)

我不明白的是

A. Embedding/Flatten 的输入是团队 ID,但输出不是由 team_id 和 team_ rating 组成的列表(因为嵌入增加了一个额外的维度(team_ rating),而 flatten 将该维度中的值带到同一维度作为原始输入(team_id)。讲师将其传递出去,就好像只有一个输出:team_ rating

B.如果输出实际上是 team_id 和 team_ rating 的列表,我们难道不想只挑选 team_ rating 来进行将来的处理,例如在不同团队之间减去 team_ rating 吗?

任何帮助将不胜感激。我已经尝试过检查每一层的输入形状和输出形状,但对于大多数层,我只是得到 (?,?)

最佳答案

嵌入层的输出是一个 2D 矩阵,对于球队输入序列中的每个 ID 都有一个嵌入,通过将该矩阵与表示球队索引的一个热向量编码相乘,这将产生一个向量代表team_ rating embedding

因此,当讲师说它添加了一个新维度时,他的意思并不是([team_id],[team_ rating])。他的意思是嵌入层将 1D 输入(即 ID)转换为 2D 表示(即嵌入向量)。

那么为什么要扁平化呢?嵌入矩阵与一个热向量(假设上一张图片中的尺寸)相乘的输出将为 V*1 但我们需要它为 1*v > 所以他把它压平了。

关于python - keras.layers.Embedding 的输出形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62617039/

相关文章:

python - 如何在线程中使用 telethon

python - 是否可以从函数应用程序中的 Azure API 网关调用检索 header ?

keras - 如何在 Keras 中使用 Add

python - Keras - 弹出并重新添加图层,但图层不会断开连接

r - R 中的 Keras : looking for function equivalent to plot_model in Python

tensorflow - 关于 Keras 框架下自编码器模型中的解码器层定义

java - 求解有限域上的线性方程组 python 或 java

Python For 循环和范围函数

python - 从 Keras 的 imdb 数据集中恢复原始文本

python - CNN 训练精度在训练期间变得更好,但测试精度保持在 40% 左右