`tf.model_to_estimator` 当我将列表对象添加到 keras 子类模型时引发 AttributeError
`tf.model_to_estimator` raise AttributeError when I add a list object to keras subclass model
我已经像这样创建了一个 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__
函数中有一个 features arrtibute,将在该模型的 call
方法中使用。当我用 keras 风格训练和评估模型时,一切都很好。
但是,现在我想使用 tf.keras.model_to_estimator
函数将此模型转换为估算器。它引发错误:AttributeError: '_ListWrapper' object has no attribute 'get_config'
。
根据我的调试,这是添加到模型的 features
属性导致此错误的原因。 convertint转estimator时,将features看做是模型的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(...)
我已经像这样创建了一个 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__
函数中有一个 features arrtibute,将在该模型的 call
方法中使用。当我用 keras 风格训练和评估模型时,一切都很好。
但是,现在我想使用 tf.keras.model_to_estimator
函数将此模型转换为估算器。它引发错误:AttributeError: '_ListWrapper' object has no attribute 'get_config'
。
根据我的调试,这是添加到模型的 features
属性导致此错误的原因。 convertint转estimator时,将features看做是模型的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(...)