`tf.model_to_estimator`在将列表对象添加到keras子类模型时引发AttributeError

问题描述 投票:0回答:1

我已经像这样创建了一个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)进行访问。还有其他解决方法吗?

tensorflow keras tensorflow-estimator
1个回答
0
投票

[我认为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(...)
© www.soinside.com 2019 - 2024. All rights reserved.