Керас не тренируется с производной в кастомной потере - PullRequest
3 голосов
/ 20 февраля 2020

Я пытаюсь аппроксимировать функцию синуса, используя нейронную сеть (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)

Особенно важна функция пользовательских потерь. Лямбда-определение производной происходит от этого вопроса . К сожалению, похоже, что модель не работает правильно. Потери приближаются к нулю и остаются выше 10.

Без производного термина сеть работает нормально, но я не могу найти ошибку в вычислении производной. Спасибо за помощь!

1 Ответ

0 голосов
/ 27 марта 2020

Что касается вашей модели, вы можете попытаться выполнить настройку гиперпараметров,

  • Установка более низкой скорости обучения
  • Увеличить эпоха
  • Добавить дополнительные учебные данные.

Вы также можете добавить больше слоев , добавить выпадений для переоснащения и попробуйте различные функции активации и методы оптимизации .
Делая все это, вы сможете получить хорошую производительность модели .

...