【问题标题】:How do I assign names to Ouputs in a subclassed Keras Model?如何在子类 Keras 模型中为输出分配名称?
【发布时间】:2020-01-29 00:14:42
【问题描述】:

我想将子类 TensorFlow Keras 的输出命名为 Model,因此我可以在 fit() 中将目标传递给它们,例如self.model.fit(np_inputs, {'q_values': np_targets}, verbose=0)

模型如下所示:

class MyModel(tf.keras.models.Model):
    def __init__(self, name):
        super(MyModel, self).__init__()
        self.input_layer = tf.keras.Input(shape=(BOARD_SIZE * 3,))
        self.d1 = tf.keras.layers.Dense(BOARD_SIZE * 3 * 9, activation='relu')
        self.d2 = tf.keras.layers.Dense(BOARD_SIZE * 3 * 100, activation='relu')
        self.d3 = tf.keras.layers.Dense(BOARD_SIZE * 3 * 9, activation='relu')
        self.q_values_l = tf.keras.layers.Dense(BOARD_SIZE, activation=None, name='q_values')
        self.probabilities_l = tf.keras.layers.Softmax(name='probabilities')

    @tf.function
    def call(self, input_data):
        x = self.d1(input_data)
        x = self.d2(x)
        x = self.d3(x)
        q = self.q_values_l(x)
        p = self.probabilities_l(q)
        return p, q

我天真地假设相应层的名称也会分配给输出,但事实并非如此。

我只有 1 个输出的目标,因此在调用 fit() 时需要准确指定目标的输出。

在使用 Keras 的函数式方法中,这很有效,但我无法在子类方法中复制它。由于不相关的原因,我无法在我的案例中使用功能性 Keras 方式。

【问题讨论】:

    标签: python tensorflow keras tf.keras


    【解决方案1】:

    为什么不只是传递一个虚拟目标?

    model.fit(np_inputs, [np.zeros((len(np_inputs),)), np_targets], ...)
    

    甚至可以传递None 而不是np.zeros

    你可以用完全相同的方式编译模型:

    model.compile(loss=[p_loss, q_loss], ...)
    

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2021-03-21
      • 2023-02-23
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多