Керас не может срезать модель по слою, используемому в потерях, не выводя его - PullRequest
0 голосов
/ 10 ноября 2019

Я получил два выхода, и только один из них (x1) является выходом модели. Я также хочу получить 2-й (x2), но он используется только с потерями.

import tensorflow as tf

def myloss2(sigma):
    gtsigma = 0.5
    kl = sigma / gtsigma

    def temp(gt, pr):
        return kl + (gtsigma ** 2 + (pr - gt) ** 2) / (2 * sigma ** 2) - 0.5

    return temp

def buildmodel2():
    inputs = tf.keras.Input(shape=(10,))
    x1 = tf.keras.layers.Dense(1, activation='linear')(inputs)
    x2 = tf.keras.layers.Dense(1, activation='sigmoid')(inputs)
    model = tf.keras.Model(inputs, x1)
    model.compile(loss=myloss2(x2), optimizer=tf.keras.optimizers.Adam())
    return model

И теперь я не могу видеть слой x2 в model2.summary(), поэтому я не могу нарезать свою модель, чтобы получитьего вывод. Да, я могу сделать так:

def myloss(data):
    pr, sigma, gt = data
    gtsigma = 0.5
    kl = sigma / gtsigma
    return kl + (gtsigma ** 2 + (pr - gt) ** 2) / (2 * sigma ** 2) - 0.5

def buildmodel():
    inputs = tf.keras.Input(shape=(10,))
    gt = tf.keras.Input(shape=(10,))
    x1 = tf.keras.layers.Dense(1, activation='linear')(inputs)
    x2 = tf.keras.layers.Dense(1, activation='sigmoid')(inputs)
    out = tf.keras.layers.Lambda(myloss)([x1, x2, gt])
    model = tf.keras.Model([inputs, gt], out)
    model.compile(loss=lambda a, b: b, optimizer=tf.keras.optimizers.Adam())
    return model

Но для меня не очень удобно использовать такую ​​модель, как эта. Есть ли другие способы?

...