加权绝对误差实现不';t在tensorflow(keras)中工作

加权绝对误差实现不';t在tensorflow(keras)中工作,tensorflow,keras,Tensorflow,Keras,我在keras中创建了自定义损失(加权绝对误差),但实现不起作用-我得到一个错误ValueError:没有为任何变量提供梯度:['my_model/conv2d/kernel:0','my_model/conv2d/bias:0'. 我想为每个像素应用不同的权重 class WeightedMeanAbsoluteError(tf.keras.metrics.Metric): def __init__(self, name='weighted_mean_absolute_error')

我在keras中创建了自定义损失(加权绝对误差),但实现不起作用-我得到一个错误
ValueError:没有为任何变量提供梯度:['my_model/conv2d/kernel:0','my_model/conv2d/bias:0'.

我想为每个像素应用不同的权重

class WeightedMeanAbsoluteError(tf.keras.metrics.Metric):

    def __init__(self, name='weighted_mean_absolute_error'):
        super(WeightedMeanAbsoluteError, self).__init__(name=name)
        self.wmae = self.add_weight(name='wmae', initializer='zeros')

    def update_state(self, y_true, y_pred, loss_weights):
        values = tf.math.abs(y_true - y_pred) * loss_weights
        return self.wmae.assign_add(tf.reduce_sum(values))

    def result(self):
        return self.wmae

    def reset_states(self):
        # The state of the metric will be reset at the start of each epoch.
        self.wmae.assign(0.)
loss_object = WeightedMeanAbsoluteError()
train_loss = WeightedMeanAbsoluteError()
我使用以下代码实现培训步骤:

@tf.function
def train_step(input_images, output_images):
    with tf.GradientTape() as tape:
        # training=True is only needed if there are layers with different
        # behavior during training versus inference (e.g. Dropout).
        result_images = model(input_images, training=True)
        loss = loss_object(output_images, result_images)
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
如果我使用

loss_object = tf.keras.losses.MeanAbsoluteError()
train_loss = tf.keras.metrics.MeanAbsoluteError()

最小化加权标准损失(如mae)的最佳且简单的方法是在拟合方法中使用sample_weights参数,在该方法中,我们传递一个带有每个样本所需权重的数组

X = np.random.uniform(0,1, (1000,50))
y = np.random.uniform(0,1, 1000)
W = np.random.randint(1,10, 1000)

inp = Input((50))
x = Dense(64, activation='relu')(inp)
out = Dense(10)(x)
model = Model(inp, out)
model.compile('adam','mae')

model.fit(X,y, epochs=100, sample_weights=W)

最小化加权标准损失(如mae)的最佳且简单的方法是在拟合方法中使用sample_weights参数,在该方法中,我们传递一个带有每个样本所需权重的数组

X = np.random.uniform(0,1, (1000,50))
y = np.random.uniform(0,1, 1000)
W = np.random.randint(1,10, 1000)

inp = Input((50))
x = Dense(64, activation='relu')(inp)
out = Dense(10)(x)
model = Model(inp, out)
model.compile('adam','mae')

model.fit(X,y, epochs=100, sample_weights=W)