Keras自定义丢失功能:访问当前输入模式

jtr*_*ans 13 python loss keras tensorflow

在Keras(使用Tensorflow后端),我的自定义丢失功能可以使用当前输入模式吗?

当前输入模式被定义为用于产生预测的输入向量.例如,请考虑以下事项:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, shuffle=False).然后将当前输入模式是与y_train(在损耗函数称为y_true)相关联的当前X_train矢量.

在设计自定义损失函数时,我打算优化/最小化需要访问当前输入模式的值,而不仅仅是当前预测.

我已经浏览了https://github.com/fchollet/keras/blob/master/keras/losses.py

我还查看了" 不只是y_pred的成本函数,y_true? "

我也熟悉以前的例子来产生一个定制的损失函数:

import keras.backend as K

def customLoss(y_true,y_pred):
    return K.sum(K.log(y_true) - K.log(y_pred))
Run Code Online (Sandbox Code Playgroud)

据推测(y_true,y_pred),其他地方也有定义.我已经看了一下源代码没有成功,我想知道我是否需要自己定义当前的输入模式,或者我的丢失函数是否已经可以访问它.

Yu-*_*ang 22

您可以将损失函数包装为内部函数并将输入张量传递给它(通常在将其他参数传递给loss函数时).

def custom_loss_wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor)
    return custom_loss

input_tensor = Input(shape=(10,))
hidden = Dense(100, activation='relu')(input_tensor)
out = Dense(1, activation='sigmoid')(hidden)
model = Model(input_tensor, out)
model.compile(loss=custom_loss_wrapper(input_tensor), optimizer='adam')
Run Code Online (Sandbox Code Playgroud)

您可以验证input_tensor并且损失值将随着不同K.mean(input_tensor)传递给模型而发生变化.

X = np.random.rand(1000, 10)
y = np.random.randint(2, size=1000)
model.test_on_batch(X, y)  # => 1.1974642

X *= 1000
model.test_on_batch(X, y)  # => 511.15466
Run Code Online (Sandbox Code Playgroud)

  • 这在具有急切执行的 tf.keras 中不起作用。知道怎么做吗? (11认同)
  • 我认为您可以对`Sequential`使用`loss = custom_loss_wrapper(model.input)`。 (4认同)
  • 它不适用于“tf.keras”急切执行:(它说:“tensorflow.python.eager.core._SymbolicException:急切执行函数的输入不能是 Keras 符号张量,但发现 [<tf.Tensor 'input_2:0 ' 形状=(无, 10) dtype=float32>]` (4认同)
  • 当然。很高兴能帮到您。 (2认同)