如何在训练tensorflow 期间获取输出图层值

xriantvc  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(148)

是否可以在训练过程中获取输出图层值,以便构建自定义损失函数。更具体地说,我想获取输出值并使用外部方法计算损失。我的问题是,在使用tf.global_variables_initializer()初始化变量之前,我无法传递tf.eval()

def run_command(im_path,p):
    s = 'cmd'+p.eval()
    os.system(s)
    im = imread(im_path)
    return im
def cross_corr(y_true, y_pred):
    path1 = 'path_to_input_image'
    true_image = run_command(path1, y_pred)
    path2 = 'path_to_predicted_image'
    predicted_image = run_command(path2,y_true)
    pearson_r, update_op = tf.contrib.metrics.streaming_pearson_correlation(predicted_image, true_image, name='pearson_r')
    loss = 1-(tf.math.square(pearson_r)) 
    return loss
***
***
# Create the network
***
tf.global_variables_initializer()
***
# run training
with tf.Session() as sess:
***
uplii1fm

uplii1fm1#

如果您的模型只有一个输出值,那么您可以将tf.keras.losses.Loss子类化,例如,一个普通的自定义损失函数(在训练中可能不是很好)实现:

import tensorflow as tf

class LossCustom(tf.keras.losses.Loss):
    def __init__(self, some_arg):
        super(LossCustom, self).__init__()
        self.param_some_arg = some_arg
    
    def get_config(self):
        config = super(LossCustom, self).get_config()
        config.update({
            "some_arg": self.param_some_arg,
        })
        return config
    
    def call(self, y_true, y_pred):
        result = y_pred - y_true
        return tf.math.reduce_sum(result)

但是,如果您有多个输出,并希望通过相同的损失函数运行它们,则需要人工将它们组合成一个值
我在我的一个模型中这样做,在模型的末端有一个虚拟层,如下所示:

import tensorflow as tf

class LayerCheeseMultipleOut(tf.keras.layers.Layer):
    def __init__(self, **kwargs):
        super(LayerCheeseMultipleOut, self).__init__(**kwargs)
    
    def call(self, inputs):
        return tf.stack(inputs, axis=1) # [batch_size, OUTPUTS, .... ]

然后,在您的自定义损失函数中,按如下方式再次解栈:

output_a, output_b = tf.unstack(y_pred, axis=1)

相关问题