如何在训练期间修改每个时期损失函数内的变量?
How to modify a variable inside the loss function in each epoch during training?
我有一个自定义损失函数。在每个时期,我想随机保留或丢弃我的输入矩阵:
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)
但这只会设置一次决策值,不会在每个时期编译损失。我如何写一个损失函数,它的变量可以在每个时期被修改?
这里有一些想法:
- 我的第一个猜测是编写一个回调来将参数传递给损失函数,但到目前为止我没有成功,基本上我不清楚当我 return 来自回调的值时如何我可以将该值传递给损失函数吗?
或
- 另一种方法是在回调中编写损失函数,但我将什么作为参数传递给回调?以及如何在回调中编译带有损失函数的模型?
损失函数基于.
只需按如下方式更改损失函数,以便在调用 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
到returntf.ones_like
,否则tf.zeros_like
。最后,掩码只是应用于你的损失。
我有一个自定义损失函数。在每个时期,我想随机保留或丢弃我的输入矩阵:
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)
但这只会设置一次决策值,不会在每个时期编译损失。我如何写一个损失函数,它的变量可以在每个时期被修改?
这里有一些想法:
- 我的第一个猜测是编写一个回调来将参数传递给损失函数,但到目前为止我没有成功,基本上我不清楚当我 return 来自回调的值时如何我可以将该值传递给损失函数吗?
或
- 另一种方法是在回调中编写损失函数,但我将什么作为参数传递给回调?以及如何在回调中编译带有损失函数的模型?
损失函数基于
只需按如下方式更改损失函数,以便在调用 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
到returntf.ones_like
,否则tf.zeros_like
。最后,掩码只是应用于你的损失。