我已经像这样创建了一个keras子类模型:
class SubModel(tf.Keras.Model):
def __init__(self, features, **kwargs):
"""Init function of Model.
Args:
features: A list of SparseFeature and DenseFeature.
"""
assert len(features) > 0
super(SubModel, self).__init__(name='SubModel', **kwargs)
self.features = features
请注意,__init__
函数中有一个特性,该特性将在该模型的call
方法中使用。当我训练和评估具有keras风格的模型时,一切正常。
但是,现在我想使用tf.keras.model_to_estimator
函数将此模型转换为估计量。它将引发错误:AttributeError: '_ListWrapper' object has no attribute 'get_config'
。
根据我的调试,是添加到模型的features
属性导致此错误。当将convertint转换为estimator时,它将要素视为模型的layer
,并在克隆模型时尝试调用get_config
函数。克隆模型时,似乎所有添加到模型的属性都将被视为layer
。
但是我真的想将features
用作模型的一部分,以便可以通过该模型的其他功能(例如call
)进行访问。还有其他解决方法吗?
[我认为tf.keras.model_to_estimator
与Sequential
或Functional API
Keras模型完全兼容,但与Subclass
模型不兼容,特别是在子类中实现复杂的操作时。
因此,如果您已经定义了一个子类keras模型,并且希望将其隐含到估计器中,最好的方法是定义model_fn
函数,并将其像下面的代码一样放入keras模型中:
def model_fn(features, labels, mode):
model = SubModel()
outputs = model(features)
loss = tf.keras.losses.xx(labels, outputs)
return tf.estimator.EstimatorSpec(...)