【问题标题】:Keras doesn't train with derivative in custom lossKeras 不会在自定义损失中使用导数进行训练
【发布时间】:2020-06-05 02:32:15
【问题描述】:

我正在尝试使用神经网络 (Keras) 以及数据和事实 d/dx d/dx sin(x) = -sin(x) 来近似正弦函数。正弦函数的这个属性用于神经网络的自定义损失函数。

我的代码目前看起来像这样

import tensorflow as tf
import numpy as np

from tensorflow import keras
from numpy import random

# --- Disable eager execution
tf.compat.v1.disable_eager_execution()

# --- Settings
x_min = 0
x_max = 2*np.pi

n_train = 64
n_test = 64

# --- Generate dataset
x_train = random.uniform(x_min, x_max, n_train)
y_train = np.sin(x_train)

x_test = random.uniform(x_min, x_max, n_test)
y_test = np.sin(x_test)

# --- Create model
model = keras.Sequential()

model.add(keras.layers.Dense(64, activation="tanh", input_dim=1))
model.add(keras.layers.Dense(64, activation="tanh"))

model.add(keras.layers.Dense(1, activation="tanh"))

def grad(input_tensor, output_tensor):
    return keras.layers.Lambda( lambda z: keras.backend.gradients( z[ 0 ], z[ 1 ] ), output_shape = [1] )( [ output_tensor, input_tensor ] )

def custom_loss_wrapper(input_tensor, output_tensor):

    def custom_loss(y_true, y_pred):
        mse_loss = keras.losses.mean_squared_error(y_true, y_pred)
        derivative_loss = keras.losses.mean_squared_error(input_tensor, -grad(input_tensor, grad(input_tensor, output_tensor))[0])
        return mse_loss + derivative_loss

    return custom_loss

# --- Configure learning process
model.compile(
        optimizer=keras.optimizers.Adam(0.01),
        loss=custom_loss_wrapper(model.input, model.output),
        metrics=['MeanSquaredError'])

# --- Train from dataset
model.fit(x_train, y_train, batch_size=32, epochs=1000, validation_data=(x_test, y_test))

# --- Evaluate model
model.evaluate(x_test, y_test)

特别重要的是自定义损失函数。导数的 Lambda 定义来自this question。可悲的是,模型似乎没有正确训练。损失接近于零并保持在 10 以上。

没有导数项,网络工作正常,但我似乎无法在导数计算中找到错误。谢谢你的帮助!

【问题讨论】:

    标签: python tensorflow keras loss-function


    【解决方案1】:

    至于你的模型,你可以尝试做超参数调优,

    • 将学习率设置为较低的值
    • 增加纪元
    • 添加更多训练数据集。

    您还可以添加更多层,添加dropouts以进行过拟合,并尝试不同的激活函数优化方法 .
    通过这样做,您将能够获得良好的模型性能

    【讨论】:

    • 所以你说损失函数工作正常,我只需要调整超参数?
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2021-04-05
    • 2019-04-02
    • 2018-12-21
    • 2022-10-12
    • 2021-06-14
    相关资源
    最近更新 更多