You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:18:02