Keras不会使用自定义损失中的导数进行训练 - python

我正在尝试使用神经网络(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参考方案

对于您的模型,您可以尝试进行超参数调整,

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

您还可以添加更多层,添加过度拟合的缺失,并尝试其他激活函数和优化方法。
通过所有这些,您将能够获得良好的模型性能。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

如何在模型内部冻结模型的特定层? - python

我的keras模型由多个模型组成。每个“子模型”都有多个层次。如何在“子模型”中调出图层并设置可训练性/冻结特定图层? python参考方案 我将使用Keras中的VGG19卷积神经网络的示例,尽管它适用于任何神经网络体系结构:from keras.applications.vgg19 import VGG19 model = VGG19(weights=&…

keras中的自定义RMSPE损失函数 - python

我正在尝试在keras中定义我自己的损失函数,即均方根百分比误差。 RMSPE定义为:我已经将损失函数定义为:from keras import backend as K def rmspe(y_true, y_pred): sum = K.sqrt(K.mean(K.square( (y_true - y_pred) / K.clip(K.abs(y_tr…

正确的损失函数方式 - python

嗨,我一直试图在喀拉拉邦实现损失功能。但是我无法找到一种方法来传递除loss(y_true,y_predict)以外的2个以上参数,因此我考虑将lambda层用作最后一层,并在lambda层itslef中进行计算,并简单地返回y_predict的值像这样的损失函数def loss_function(x): loss = some calculations r…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…