CNN文本分类调用Keras Embedding层出现AttributeError: 'str' object has no attribute 'base_dtype'
报错原因
- 函数式API输入层使用错误:Keras函数式API要求输入是
Input()函数返回的张量对象,你当前使用的InputLayer()是面向Sequential序列模型设计的层类,它的实例不是可直接传入下一层的张量对象,导致Embedding层接收到的输入类型异常,触发属性错误。 - 代码存在多处拼写错误:
- 池化层拼写错误:
MalayerPooling1D应为MaxPooling1D - 输出层激活函数拼写错误:
softmalayer应为softmax - 若未单独导入
Dense、Model类,直接调用会触发未定义错误
- 池化层拼写错误:
- Input层未指定输入形状:Embedding层需要匹配输入序列的长度对应输入形状,缺少该配置也会导致后续层计算异常。
修复方案
修复后的可运行代码如下:
import tensorflow as tf # 运行前需提前定义好以下三个变量: # input_dim:词表总大小 # embedding_matrix:预训练词向量矩阵 # max_len:输入序列的最大长度 # 替换InputLayer为Input,指定输入形状 input_layer = tf.keras.layers.Input(shape=(max_len,)) #hidden layers layer = tf.keras.layers.Embedding(input_dim, 300, weights=[embedding_matrix], input_length=max_len, trainable=False)(input_layer) conv1d_1 = tf.keras.layers.Conv1D(8, 15, activation='relu', kernel_initializer='he_uniform')(layer) conv1d_2 = tf.keras.layers.Conv1D(32, 15, activation='relu', kernel_initializer='he_uniform')(layer) conv1d_3 = tf.keras.layers.Conv1D(128, 15, activation='relu', kernel_initializer='he_uniform')(layer) layer = tf.keras.layers.Concatenate()([conv1d_1, conv1d_2, conv1d_3]) # 修正池化层拼写 layer = tf.keras.layers.MaxPooling1D(pool_size=10, strides=1, padding='same')(layer) conv1d_4 = tf.keras.layers.Conv1D(16, 15, activation='relu', kernel_initializer='he_uniform')(layer) conv1d_5 = tf.keras.layers.Conv1D(64, 15, activation='relu', kernel_initializer='he_uniform')(layer) conv1d_6 = tf.keras.layers.Conv1D(96, 15, activation='relu', kernel_initializer='he_uniform')(layer) layer = tf.keras.layers.Concatenate()([conv1d_4, conv1d_5, conv1d_6]) # 修正池化层拼写 layer = tf.keras.layers.MaxPooling1D(pool_size=10, strides=1, padding='same')(layer) layer = tf.keras.layers.Conv1D(50, 15, activation='relu', kernel_initializer='he_uniform')(layer) layer = tf.keras.layers.Flatten()(layer) layer = tf.keras.layers.Dropout(.3)(layer) layer = tf.keras.layers.Dense(256, activation='relu', kernel_initializer='he_uniform')(layer) # 修正激活函数拼写 output = tf.keras.layers.Dense(20, activation='softmax', kernel_initializer='he_uniform')(layer) #Creating a model models = tf.keras.Model(inputs=input_layer, outputs=output)
改动点说明:
- 输入层替换为
tf.keras.layers.Input(shape=(max_len,)),符合函数式API的张量输入要求 - 修正所有拼写错误,包括池化层、激活函数的拼写
- 统一使用
tensorflow.keras下的层类,避免未导入Dense、Model类的报错 - 需提前给
input_dim、embedding_matrix、max_len三个变量完成赋值,避免后续参数未定义错误。
内容的提问来源于stack exchange,提问作者Mazhar Ali
相关产品推荐
相关产品推荐

