如何在张量流中组合多个输出以创建度量?

时间:2019-11-15 07:00:53

标签: python tensorflow keras

我正在研究一个多任务神经网络,该网络具有两个输出,即分割“掩码”和分类“标签”:

inputs = tf.keras.Input(shape=(352, 512, 3), name='image')
outputs = base_model(inputs)

mask = tf.keras.layers.Conv2D(4, (3,3), strides=1, padding='same', activation='sigmoid', name='mask')(outputs)

label = tf.keras.layers.GlobalAveragePooling2D()(outputs)
label = tf.keras.layers.Dense(4, activation='sigmoid', name='label')(label)
model = tf.keras.models.Model(inputs, [mask, label])

从该模型中,我获得一个预测“掩码”和一个预测“标签”。问题是:我想创建一个度量,使其仅在相应的“标签”> 0.5时才评估“蒙版”的骰子系数。

我已经搜索了很长时间,并且在tensorflow官方网站上我只能找到如何计算每个输出的指标,但是找不到有关如何访问所有预测并将其组合的文档。

metrics = {'mask': [dice_coef(threshold=0.5)],
        'label': [tf.keras.metrics.binary_accuracy]}

此处每个指标仅接受两个参数(y_true,y_pred)。

更新:

我想出了一个解决方案,我没有在指标中组合结果,而是在网络中添加了一个lambda层,并添加了另外一个输出

inputs = tf.keras.Input(shape=(352, 512, 3), name='image')
outputs = base_model(inputs)

mask = tf.keras.layers.Conv2D(4, (3,3), strides=1, padding='same', activation='sigmoid', name='mask')(outputs)

label = tf.keras.layers.GlobalAveragePooling2D()(outputs)
label = tf.keras.layers.Dense(4, activation='sigmoid', name='label')(label)

label_exp = tf.keras.layers.Lambda(lambda label: tf.cast(tf.math.greater(label, 0.5), tf.float32))(label)
label_exp = tf.keras.layers.Reshape([1,1,4])(label_exp)
filtered = tf.keras.layers.Multiply(name='filtered')([mask, label_exp])

model = tf.keras.models.Model(inputs, [mask, filtered, label])

现在将指标设置为:

metrics = {'mask': [dice_coef(threshold=0.5)],
            'filtered': [dice_coef(threshold=0.5)],
            'label': [tf.keras.metrics.binary_accuracy]}

这有效,但似乎会占用更多内存。还在寻找一个整洁的解决方案...

0 个答案:

没有答案