首页 > 解决方案 > 在 Keras 函数式 API 中使用嵌入层

问题描述

使用 Keras 功能 API 执行基本操作似乎会产生错误。例如,以下失败:

from keras.layers import InputLayer, Embedding
input = InputLayer(name="input", input_shape=(1, ))
embedding = Embedding(10000, 64)(input)

这会产生错误:

AttributeError:“str”对象没有属性“base_dtype”

然后我可以通过使用input_length参数“作弊”,但是当我尝试连接两个这样的嵌入时,这会失败:

from keras.layers import InputLayer, Embedding, Concatenate
embedding1 = Embedding(10000, 64, input_length=1)
embedding2 = Embedding(10000, 64, input_length=1)
concat = Concatenate()([embedding1 , embedding2])

这给出了错误:

TypeError:“NoneType”对象不可下标

当我改用“连接”(小写字母)时出现同样的错误(一些消息来源似乎说,如果使用功能性 API,则应该使用它)。

我究竟做错了什么?

我在 tensorflow 版本2.3.1,keras 版本2.4.3,python 版本3.6.7

标签: python-3.xtensorflowkeras

解决方案


我强烈建议使用tf.keras而不是keras.

它不起作用,因为InputLayer是 的一个实例keras.Layer,而keras.layers.Input是 的一个实例Tensor。的论点layer.__call__()应该是Tensor而不是keras.Layer

import tensorflow as tf

inputs = tf.keras.layers.Input((1,))
print(type(inputs)) # <class 'tensorflow.python.framework.ops.Tensor'>
input_layer = tf.keras.layers.InputLayer(input_shape=(1,))
print(type(input_layer)) # <class 'tensorflow.python.keras.engine.input_layer.InputLayer'>

InputLayerSequentialAPI 一起使用。当您使用功能性 API 时,您应该tf.keras.layers.Input()改用:

import tensorflow as tf

inputs = tf.keras.layers.Input((1, ), name="input", )
embedding = tf.keras.layers.Embedding(10000, 64)(inputs)

与第二个示例相同:

import tensorflow as tf

inputs = tf.keras.layers.Input((1, ), name="input", )
embedding1 = tf.keras.layers.Embedding(10000, 64)(inputs)
embedding2 = tf.keras.layers.Embedding(10000, 64)(inputs)

concat = tf.keras.layers.Concatenate()([embedding1, embedding2])

推荐阅读