Keras模型转TensorFlow Estimator报错:'Dense'无'from_config'属性
AttributeError: type object 'Dense' has no attribute 'from_config'错误 这个错误我之前也碰到过,核心原因是你混用了独立的keras库和TensorFlow内置的tensorflow.keras模块,两者属于不同的实现体系,导致模型层的类来自不同的命名空间,在模型序列化(转Estimator必须经过序列化步骤)时出现了配置不兼容问题。
问题拆解
看你的代码片段:
from tensorflow import keras
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
classifier = keras.models.Sequential()
classifier.add(tf.layers.Dense(units = 6, kernel_initializer = keras.initializers.he_uniform(), activation = tf.nn.relu, input_shape =(11,)))
这里同时引入了独立keras库的Sequential、Dense,又用了TensorFlow的tf.layers.Dense和tensorflow.keras的Sequential,这种跨库调用会让模型的配置信息混乱,触发from_config找不到的错误。
修复方案
1. 统一使用TensorFlow内置Keras
完全移除独立keras库的导入,所有Keras相关操作都基于tensorflow.keras——毕竟TensorFlow Estimator和它是原生兼容的,不会有适配问题。
修改后的导入代码:
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense
2. 重构模型构建代码
把所有层的调用都统一为tensorflow.keras下的API,避免跨模块混用:
classifier = Sequential() # 用tensorflow.keras的Dense层,参数也统一用对应模块的实现 classifier.add(Dense( units=6, kernel_initializer=tf.keras.initializers.HeUniform(), activation='relu', input_shape=(11,) )) # 如果有后续层,比如输出层,也保持同样风格 classifier.add(Dense(units=1, activation='sigmoid'))
3. 正确转换为Estimator
使用TensorFlow提供的官方转换函数,确保路径正确:
estimator = tf.keras.estimator.model_to_estimator(keras_model=classifier)
额外建议
- 如果你之前安装了独立的
keras包,建议直接卸载它,彻底避免冲突:pip uninstall keras - 后续写代码时,所有Keras相关的导入都要从
tensorflow.keras下引入,不要同时使用两个库的API。
内容的提问来源于stack exchange,提问作者NgDriver

