【问题标题】:How can I access to content of Tensor in custom loss of Keras model如何在 Keras 模型的自定义损失中访问张量的内容
【发布时间】:2020-09-13 07:46:22
【问题描述】:

我正在使用 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])

但这对我不起作用。

【问题讨论】:

  • 为什么不起作用?
  • 当我取消注释 L1 部分时它不起作用,我认为我切片错误
  • 您收到的错误是什么?
  • InvalidArgumentError:不兼容的形状:[50,5] vs. [50] [[node BroadcastGradientArgs_7]]

标签: python tensorflow keras autoencoder loss


【解决方案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)

【讨论】:

  • 谢谢你,我在找什么!
  • 太棒了!不要忘记接受它作为答案并点赞
猜你喜欢
  • 2021-02-08
  • 2021-05-07
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2020-01-08
  • 2019-07-28
  • 2020-05-30
  • 2020-10-08
相关资源
最近更新 更多