我在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
因此,当讲师说它添加了一个新维度时,他的意思并不是([team_id],[team_ rating])
。他的意思是嵌入层将 1D 输入(即 ID)转换为 2D 表示(即嵌入向量)。
那么为什么要扁平化呢?嵌入矩阵与一个热向量(假设上一张图片中的尺寸)相乘的输出将为 V*1
但我们需要它为 1*v
> 所以他把它压平了。
关于python - keras.layers.Embedding 的输出形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62617039/