【问题标题】:Custom Loss Function of Keras Model Giving Incorrect AnswerKeras 模型的自定义损失函数给出不正确的答案
【发布时间】:2021-02-18 21:25:21
【问题描述】:

我正在尝试为 keras NN 模型编写自定义损失函数,但似乎损失函数输出了错误的值。我的损失函数是

def tangle_loss3(input_tensor):
    def custom_loss(y_true, y_pred):
        true_diff = y_true - input_tensor
        pred_diff = y_pred - input_tensor
        
        normalized_diff = K.abs(tf.math.divide(pred_diff, true_diff))
        normalized_diff = tf.reduce_mean(normalized_diff)
        
        return normalized_diff
    
    return custom_loss

然后我在这个简单的前馈网络中使用它:

input_layer = Input(shape=(384,), name='input')
hl_1 = Dense(64, activation='elu', name='hl_1')(input_layer)
hl_2 = Dense(32, activation='elu', name='hl_2')(hl_1)
hl_3 = Dense(32, activation='elu', name='hl_3')(hl_2)
output_layer = Dense(384, activation=None, name='output')(hl_3)

optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

model = tf.keras.models.Model(input_layer, output_layer)
model.compile(loss=tangle_loss3(input_layer), optimizer=optimizer)

然后为了测试损失函数是否有效,我创建了一个随机输入和目标向量,并按照我的预期进行了 numpy 计算,但这似乎与 keras 的结果不匹配。

X = np.random.rand(1, 384)
y = np.random.rand(1, 384)

np.mean(np.abs((model.predict(X) - X)/(y - X)))
# returns some number 

model.test_on_batch(X, y)
# always returns 0.0

为什么我的损失函数总是返回零?这些答案应该匹配吗?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    我误解了你的问题,我已经更新了我的方法。它现在应该可以工作了。我将输入层和输出层堆叠起来,得到一个传递给输出的新层。

    
        def tangle_loss3(y_true, y_pred):
            true_diff = y_true - y_pred[0]
            pred_diff = y_pred[1] - y_pred[0]
        
            normalized_diff = tf.abs(tf.math.divide(pred_diff, true_diff))
            normalized_diff = tf.reduce_mean(normalized_diff)
        
            return normalized_diff
    
        input_layer = Input(shape=(384,), name='input')
        hl_1 = Dense(64, activation='elu', name='hl_1')(input_layer)
        hl_2 = Dense(32, activation='elu', name='hl_2')(hl_1)
        hl_3 = Dense(32, activation='elu', name='hl_3')(hl_2)
        output_layer = Dense(384, activation=None, name='output')(hl_3)
        out = tf.stack([input_layer, output_layer])
        
        optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
        
        model = tf.keras.models.Model(input_layer, out)
        model.compile(loss=tangle_loss3, optimizer=optimizer)
    

    现在当我计算损失时它起作用了

    
        X = np.random.rand(1, 384)
        y = np.random.rand(1, 384)
        
        np.mean(np.abs((model.predict(X)[1] - X)/(y - X)))
        # returns some number
        
        model.test_on_batch(X, y)
    

    请注意,我必须使用 model.predict(X)[1],因为我们得到两个输出,即输入层和输出层的结果。这只是一种 hacky 解决方案,但它确实有效。

    【讨论】:

      【解决方案2】:

      自定义损失适用于单个非嵌套custom_loss(y_true,y_pred)。您可以尝试添加Subtract keras 层作为输出,然后在添加到训练管道之前尝试使用新标签作为new_label = label - input

      现在只使用 customloss

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-08
        • 2019-01-23
        • 2020-09-08
        • 2020-12-19
        • 2017-12-18
        • 2020-03-27
        • 1970-01-01
        • 2020-02-27
        相关资源
        最近更新 更多