复现论文模型时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", )
关键修正点
- 正确拼接Tensor而非Model对象:使用
Concatenate()([token_model.output, char_model.output]),先实例化Concatenate层,再传入两个模型的输出Tensor进行拼接。 - 修复词级模型的维度问题:添加
Flatten()层将嵌入层的多维输出展平,避免Dense层输入维度不匹配。 - 补充最终模型定义:明确指定输入为两个子模型的输入,输出为最终分类层的输出,完成完整模型的构建。
内容的提问来源于stack exchange,提问作者Amey
相关产品推荐
相关产品推荐

