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

复现论文模型时Concatenate层出现ValueError问题求助

在Pubmed 200k RCT数据集复现模型时的ValueError问题及解决

我尝试在Pubmed 200k随机对照临床试验数据集上复现某论文中的模型,数据集相关信息参考另一论文,模型输出包含5种唯一token。在实现过程中遇到了ValueError错误,错误日志如下:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-55-d583261b0496> in <module>()
     23 
     24 # 4. 创建输出层
---> 25 dropout_layer = tf.keras.layers.Dropout(0.5,name='dropout_layer')(concat_model)
     26 dense_layer = tf.keras.layers.Dense(200,name='dense_layer')(dropout_layer)
     27 dropout_layer = tf.keras.layers.Dropout(0.5,name='dropout_layer_2')(dense_layer)

1 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype)
    100       dtype = dtypes.as_dtype(dtype).as_datatype_enum
    101   ctx.ensure_initialized()
---> 102   return ops.EagerTensor(value, ctx.device_name, dtype)
    103 
    104 

ValueError: 调用层"dropout_layer"(类型为Dropout)时遇到异常。

尝试将类型不支持的值(<keras.layers.merge.Concatenate object at 0x7f51a0b5f850>)转换为Tensor,该值类型为<class 'keras.layers.merge.Concatenate'>。

接收的调用参数:
  • inputs=<keras.layers.merge.Concatenate object at 0x7f51a0b5f850>
  • training=False

原错误代码如下:

# 1. 词级模型:
inputs = tf.keras.layers.Input(
    shape=(1,), dtype=tf.string, name="text_input"
)  # 接收输入列表
text_vectorization_layer = text_vectorizer(inputs)  # 词级向量化层
text_embedding_layer = embedding(text_vectorization_layer)  # 词级嵌入层
# flatten_layer = tf.keras.layers.Flatten()(text_embedding_layer)
outputs = tf.keras.layers.Dense(300, activation="relu", name="text_output")(
    text_embedding_layer
)  # 输出维度300,对应论文图1
token_model = tf.keras.Model(inputs, outputs)  # 词级模型

# 2. 字符级模型:
inputs = tf.keras.layers.Input(shape=(1,), dtype=tf.string, name="char_input")
char_vectorization_layer = char_vectorizer(inputs)  # 字符级向量化层
char_embedding_layer = char_embedding(char_vectorization_layer)  # 字符级嵌入层
outputs = tf.keras.layers.Bidirectional(
    tf.keras.layers.LSTM(25), name="bi_directional_lstm"
)(
    char_embedding_layer
)  # 双向LSTM输出
char_model = tf.keras.Model(inputs, outputs)

# 3. 拼接两个模型
concat_model = tf.keras.layers.Concatenate([token_model, char_model])

# 4. 创建输出层
dropout_layer = tf.keras.layers.Dropout(0.5, name="dropout_layer")(concat_model)
dense_layer = tf.keras.layers.Dense(200, name="dense_layer")(dropout_layer)
dropout_layer = tf.keras.layers.Dropout(0.5, name="dropout_layer_2")(dense_layer)
output_layer = tf.keras.layer.Dense(5, activation="softmax", name="final_output_layer")(
    dropout_layer
)

错误原因分析

报错的核心是Concatenate层的使用方式错误:

  • 原代码直接将两个Model对象传入Concatenate的构造函数,且未调用层实例处理输入,导致concat_model是一个Concatenate层对象,而非层输出的Tensor。
  • Dropout层要求输入必须是Tensor类型,传入层对象自然会触发类型转换错误。

修正后代码

经修正后的代码解决了上述问题,同时补充了最终模型的定义:

# 1. 词级模型:
inputs = tf.keras.layers.Input(
    shape=(1,), dtype=tf.string, name="text_input"
)  # 接收输入列表
text_vectorization_layer = text_vectorizer(inputs)  # 词级向量化层
text_embedding_layer = embedding(text_vectorization_layer)  # 词级嵌入层
flatten_layer = tf.keras.layers.Flatten()(text_embedding_layer)
outputs = tf.keras.layers.Dense(300, activation="relu", name="text_output")(
    flatten_layer
)  # 输出维度300,对应论文图1
token_model = tf.keras.Model(inputs, outputs)  # 词级模型

# 2. 字符级模型:
inputs = tf.keras.layers.Input(shape=(1,), dtype=tf.string, name="char_input")
char_vectorization_layer = char_vectorizer(inputs)  # 字符级向量化层
char_embedding_layer = char_embedding(char_vectorization_layer)  # 字符级嵌入层
outputs = tf.keras.layers.Bidirectional(
    tf.keras.layers.LSTM(25), name="bi_directional_lstm"
)(
    char_embedding_layer
)  # 双向LSTM输出
char_model = tf.keras.Model(inputs, outputs)

# 3. 拼接两个模型的输出
concat_model = tf.keras.layers.Concatenate()([token_model.output, char_model.output])

# 4. 创建输出层
dropout_layer = tf.keras.layers.Dropout(0.5, name="dropout_layer")(concat_model)
dense_layer = tf.keras.layers.Dense(200, name="dense_layer")(dropout_layer)
dropout_layer = tf.keras.layers.Dropout(0.5, name="dropout_layer_2")(dense_layer)
output_layer = tf.keras.layers.Dense(
    5, activation="softmax", name="final_output_layer"
)(dropout_layer)

# 5. 定义最终模型
model_2 = tf.keras.Model(
    inputs=[token_model.input, char_model.input],
    outputs=output_layer,
    name="token_char_model",
)

关键修正点

  1. 正确拼接Tensor而非Model对象:使用Concatenate()([token_model.output, char_model.output]),先实例化Concatenate层,再传入两个模型的输出Tensor进行拼接。
  2. 修复词级模型的维度问题:添加Flatten()层将嵌入层的多维输出展平,避免Dense层输入维度不匹配。
  3. 补充最终模型定义:明确指定输入为两个子模型的输入,输出为最终分类层的输出,完成完整模型的构建。

内容的提问来源于stack exchange,提问作者Amey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:37:13