TensorFlow 2.0自定义Wide&Deep模型训练报错:TypeError: 'NoneType' object is not callable 求助
解决TensorFlow Wide&Deep训练时的
TypeError: 'NoneType' object is not callable问题 我帮你定位到几个代码里的关键问题,这些问题组合起来导致了训练时的错误:
1. 模块导入的混淆问题
你代码里混用了旧版Keras(keras.layers.merge)和TensorFlow Keras的API(layers.Embedding),但没有明确导入tensorflow.keras.layers模块。在TensorFlow 2.x环境下,这种混合导入很容易导致对象引用异常,这大概率是触发NoneType错误的核心原因之一。
2. Wide模型的构建方式不适用于合并场景
你用Sequential构建Wide模型,但后续需要和Deep模型做张量合并,函数式API才是这种多输入/多输出场景的正确选择。Sequential模型的input属性在复杂合并逻辑中无法正确生成可追踪的输入张量,会导致训练时无法创建有效的训练执行函数。
3. 最终输出层的激活函数错误
你的任务是二分类(使用binary_crossentropy损失),但合并后的输出层用了softmax激活函数。单节点输出用softmax会导致输出值永远为1,这会让损失计算完全异常,进而触发训练流程的崩溃。二分类任务应该使用sigmoid激活函数。
修正后的完整代码
# 统一使用TensorFlow Keras的官方API from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, Input, Embedding, GlobalMaxPool1D, concatenate # 用函数式API构建Wide模型(更适配后续合并逻辑) wide_input = Input(shape=(maxlen,)) wide_x = Embedding(vocab_size, embedding_dim, weights=[embedding_matrix], trainable=True)(wide_input) wide_x = GlobalMaxPool1D()(wide_x) wide_x = Dense(10, activation='relu')(wide_x) wide_output = Dense(1, activation='sigmoid')(wide_x) wide_model = Model(inputs=wide_input, outputs=wide_output) # 用函数式API构建Deep模型(保持风格统一,避免潜在问题) deep_input = Input(shape=X_train_deep_numpy.shape[1:]) deep_x = Dense(64, activation='relu')(deep_input) deep_x = Dense(64, activation='relu')(deep_x) deep_output = Dense(1, activation='sigmoid')(deep_x) deep_model = Model(inputs=deep_input, outputs=deep_output) # 合并两个模型的输出 concat_layer = concatenate([wide_model.output, deep_model.output], axis=-1) final_output = Dense(1, activation='sigmoid')(concat_layer) merged_model = Model(inputs=[wide_model.input, deep_model.input], outputs=final_output) # 编译并查看模型结构 merged_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) merged_model.summary()
额外验证建议
- 确认
vocab_size、embedding_dim、maxlen、embedding_matrix这些变量都已正确定义,没有出现None值。 - 再次核对输入数据形状:
X_train_numpy的(26907, 100)要和Wide模型的input_shape=(maxlen,)匹配(即maxlen=100),X_train_deep_numpy的(26907,8)要和Deep模型的输入形状一致。
按照上述修正后,再运行训练代码应该就能正常执行了。
内容的提问来源于stack exchange,提问作者jc76
相关产品推荐
相关产品推荐

