我有一個自定義損失函式。在每個時代,我想隨機保留或丟棄我的輸入矩陣:
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)
但這只會設定決策值一次,并且不會編譯每個時期的損失。如何撰寫一個可以在每個時期修改其變數的損失函式?
這里有一些想法:
- 我的第一個猜測是撰寫一個回呼函式來將一個引數傳遞給損失函式,但到目前為止我還沒有成功,基本上我不清楚當我從回呼函式回傳一個值時,我該如何將該值傳遞給損失函式?
或者
- 另一種方法是在回呼中撰寫損失函式,但是我將什么作為引數傳遞給回呼?以及如何在回呼中使用損失函式編譯模型?
損失函式基于這篇文章。
uj5u.com熱心網友回復:
只需按如下方式更改您的損失函式,以便在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
首先生成一個亂數,然后根據這個數字創建一個條件(小于你定義的概率的亂數)。之后,如果您的條件是,則您只需使用tf.condreturn ,否則。最后,面具只是簡單地應用于你的損失。tf.ones_likeTruetf.zeros_like
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337536.html
上一篇:Tensorflow綠移影像
