如何在自定义丢失Keras模型时访问Tensor的内容?

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

我正在使用Keras模型构建一个自动编码器。我想建立一个自定义的损失,其形式为 alpha* L2(x, x_pred) + beta * L1(day_x, day_x_pred). L1损失的第二项是关于时间的惩罚(day_x是一个日号)。在我的输入数据中,日期是第一个特征。我的输入数据的形式是 ['day', 'beta', 'sigma', 'gamma', 'mu'].

输入的x是形状(batch_size,特征数),我有5个特征。所以我的问题是,如何从以下的特征中提取第一个特征 x and x_pred 来计算 L1(t_x, t_x_pred).这是我目前的损失函数:

def loss_function(x, x_predicted):
    #with tf.compat.v1.Session() as sess:   print(x.eval())  
    return 0.7 * K.square(x- x_predicted) + 0.3 * K.abs(x[:,1]-x_predicted[:,1])

但这对我来说并不奏效。

python tensorflow keras autoencoder loss
1个回答
1
投票

这是你需要的损失...

你必须计算出你的误差的平均值

def loss_function(x, x_predicted):

    get_day_true = x[:,0] # get day column
    get_day_pred = x_predicted[:,0] # get day column                           
    day_loss = K.mean(K.abs(get_day_true - get_day_pred))
    all_loss = K.mean(K.square(x - x_predicted))

    return 0.7 * all_loss + 0.3 * day_loss

否则,你必须插入一个尺寸

def loss_function(x, x_predicted):

    get_day_true = x[:,0] # get day column
    get_day_pred = x_predicted[:,0] # get day column                           
    day_loss = K.abs(get_day_true - get_day_pred)
    all_loss = K.square(x - x_predicted)

    return 0.7 * all_loss + 0.3 * tf.expand_dims(day_loss, axis=-1)

编译模型时使用损失

model.compile('adam', loss=loss_function)
© www.soinside.com 2019 - 2024. All rights reserved.