首页 > 解决方案 > 当我将列表对象添加到 keras 子类模型时,`tf.model_to_estimator` 引发 AttributeError

问题描述

我已经像这样创建了一个 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这是添加到模型中的属性导致此错误。在转换为估计器时,它把特征作为模型的一个,并在克隆模型时layer尝试调用该函数。get_config似乎添加到模型中的所有属性都将被视为layer克隆模型时。

但我真的很想features用作模型的一部分,以便可以通过该模型的其他功能访问它,例如call. 还有其他方法可以解决这个问题吗?

标签: tensorflowkerastensorflow-estimator

解决方案


我认为tf.keras.model_to_estimator与Keras 模型完美兼容,但与模型很差,Sequential尤其是在子类中实现复杂操作时。Functional APISubclass

因此,如果您已经定义了一个子类 keras 模型,并且想将其转换为 estimator,最好的方法是定义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(...)

推荐阅读