【问题标题】:How to modify a variable inside the loss function in each epoch during training?如何在训练期间在每个时期修改损失函数内的变量?
【发布时间】:2021-12-11 06:49:24
【问题描述】:

我有一个自定义损失函数。在每个时期,我想随机保留或丢弃我的输入矩阵:

import random
from tensorflow.python.keras import backend
def decision(probability):
     return random.random() < probability

def my_throw_loss_in1(y_true, y_pred):
     if decision(probability=0.5):
         keep_mask = tf.ones_like(in1)
         total_loss = backend.mean(backend.square(y_true- y_pred)) * keep_mask
         print('Input1 is kept')
     else:
         throw_mask = tf.zeros_like(in1)
         total_loss =  backend.mean(backend.square(y_true- y_pred)) * throw_mask
         print('Input1 is thrown away')
     return total_loss


model.compile(loss= [ my_throw_loss_in1], 
          optimizer='Adam', 
          metrics=['mae'])

history2 = model.fit([x, y], batch_size=10, epochs=150, validation_split=0.2, shuffle=True)

但这只会设置一次决策值,并且不会编译每个时期的损失。如何编写一个损失函数,它的变量可以在每个 epoch 中修改?

这里有一些想法:

  1. 我的第一个猜测是编写一个回调来将参数传递给损失函数,但到目前为止我没有成功,基本上我不清楚当我从回调中返回一个值时,我该如何将该值传递给损失函数?

  1. 另一种方法是在回调中编写损失函数,但是我应该将什么作为参数传递给回调?以及如何在回调中编译带有损失函数的模型?

损失函数基于this post

【问题讨论】:

    标签: python tensorflow keras loss-function


    【解决方案1】:

    只需如下更改您的损失函数,以便在调用 fit(*) 时对其进行评估:

    def my_throw_loss_in1(y_true, y_pred):
    
      probability = 0.5
      random_uniform = tf.random.uniform(shape=[], minval=0., maxval=1., dtype=tf.float32)
      condition = tf.less(random_uniform, probability)
      mask = tf.cond(condition, lambda: tf.ones_like(y_true), lambda: tf.zeros_like(y_true))
    
      total_loss = tf.keras.backend.mean(tf.keras.backend.square(y_true - y_pred)* mask) 
      tf.print(mask)
      return total_loss
    

    首先生成一个随机数,然后根据该数创建一个条件(随机数小于您定义的概率)。之后,如果您的条件为True,则只需使用tf.cond 返回tf.ones_like,否则返回tf.zeros_like。最后,简单地将掩码应用于您的损失。

    【讨论】:

    • 非常感谢!我希望这个函数每次打印掩码(我也尝试了一个简单的字符串)但什么都没有打印,这是为什么呢?
    • 你使用的是tf.print(*)还是print(*)
    • 我使用 tf.print()
    • 在 Google Colab 中,我在每个时代都看到了面具。
    • 我明白了……那可能是pycharm有问题。
    猜你喜欢
    • 2017-08-24
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2022-06-30
    • 2021-12-28
    • 2021-12-27
    相关资源
    最近更新 更多