TensorFlow中Sequential与Functional API的Embedding行为差异疑问
TensorFlow中Sequential与Functional API调用Embedding层的形状差异:设计预期,非Bug
这个输出形状的差异是设计预期,并不是Bug,核心原因在于两种调用方式对输入维度的处理逻辑不同:
Sequential API:当你将Embedding层加入Sequential模型后,模型会自动适配输入形状。你的输入是
[32, 100, 1],其中最后一个维度为1(仅包含单个索引值),Sequential会默认将这个多余的维度挤压掉,把输入转换成Embedding层常规的输入格式[32, 100](批次大小,序列长度),因此输出形状为[32, 100, 8](批次大小,序列长度,嵌入维度)。直接调用层实例(Functional API风格):Embedding层本身支持处理任意维度的输入张量,只要最后一维是整数索引。当输入为
[32, 100, 1]时,层会保留所有输入维度,对每个位置的1个索引单独生成嵌入向量,因此输出形状会在原输入形状基础上增加嵌入维度,变成[32, 100, 1, 8]。
如果想要让两种方式输出形状一致,可以做以下调整:
- 给输入去掉最后一维:将
inputs改为np.random.randint(0, 99, [32, 100]),此时两种调用方式都会输出[32, 100, 8]。 - 直接调用层时手动挤压维度:
fm_out = tf.squeeze(myLayer(inputs), axis=-2),这样fm_out.shape就会和Sequential的输出一致。
内容的提问来源于stack exchange,提问作者neojoony
相关产品推荐
相关产品推荐

