`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_estimatorSequentialFunctional 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(...)