我的需求:
我想通过添加样本权重来修改神经网络中的损失函数。 (我知道 .fit method 有 sample_weight
参数)。
我的想法是为我的神经网络创建额外的输入,并为每个训练数据行预先计算权重,如下所示:
# Generating mock data
train_X = np.random.randn(100, 5)
train_Y = np.random.randn(100, 1)
train_sample_weights = np.random.randn(*train_Y.shape)
# Designing loss function that uses my pre-computed weights
def example_loss(y_true, y_pred, sample_weights_):
return K.mean(K.sqrt(K.sum(K.pow(y_pred - y_true, 2), axis=-1)), axis=0) * sample_weights_
# Two inputs for neural network, one for data, one for weights
input_tensor = Input(shape=(train_X.shape[1],))
weights_tensor = Input(shape=(train_sample_weights.shape[1],))
# Model uses only 'input_tensor'
x = Dense(100, activation="relu")(input_tensor)
out = Dense(1)(x)
# The 'weight_tensor' is inserted into example_loss() functon
loss_function = partial(example_loss, sample_weights_=weights_tensor)
# Model takes as an input both data and weights
model = Model([input_tensor, weights_tensor], out)
model.compile("Adam", loss_function)
model.fit(x=[train_X, train_sample_weights], y=train_Y, epochs=10)
我的问题:
当我使用 Keras 2.2.4 导入来运行以下代码时,它有效:
import numpy as np
from functools import partial
import keras.backend as K
from keras.layers import Input, Dense
from keras.models import Model
当我使用 tf.keras 2.2.4-tf 导入运行以下代码时崩溃:
import numpy as np
from functools import partial
import tensorflow.keras.backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
出现以下错误:
TypeError: example_loss() got an unexpected keyword argument 'sample_weight'
我的问题:
- 为什么会发生这种情况?
- 如何重写代码,以便此类架构也可以在 2.2.4-tf 上运行?
- 适用于 Keras/tf.keras 框架的提议对我来说也是一个可以接受的答案。
错误很容易重现。只需复制代码并运行即可。
最佳答案
您需要像这样定义损失,以便向其传递新参数:
def custom_loss(sample_weights_):
def example_loss(y_true, y_pred):
return K.mean(K.sqrt(K.sum(K.pow(y_pred - y_true, 2), axis=-1)), axis=0) * sample_weights_
return example_loss
并这样调用它:
model.compile("Adam", custom_loss(weights_tensor))
关于python - 如何为使用附加参数的 tf.keras 创建自己的损失函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298349/