Как узнать значения переменных уравнения с керасом / тензорным потоком? - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть уравнение, которое описывает кривую в двух измерениях. Это уравнение имеет 5 переменных. Как узнать их значения с помощью keras / tenorflow для набора данных? Является ли это возможным? Кто-нибудь знает учебник о чем-то подобном?

Я сгенерировал некоторые данные для обучения сети, которая имеет формат: sample => [150, 66, 2] 150 устанавливает с 66 * 2 с данными что-то вроде «время» х «ускорение» цели => [150, 5] 150 наборов с 5 переменными числами.

Obs: я знаю диапазон переменных. Я также знаю, что 150 наборов данных - это слишком мало выборок, но мне нужно, после работы с кодом, обучить новую сеть экспериментальным данным, и это тоже ограничено. Визуально кривая проста: в начале она имеет нисходящую линейную часть, а в конце опускается «как экспонента».

Мой код выглядит следующим образом:

def build_model():
    model = models.Sequential()
    model.add(layers.Dense(512, activation='relu', input_shape=(66*2,)))
    model.add(layers.Dense(5, activation='softmax'))
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy', 
                  metrics=['mae'])
    return model

def smooth_curve(points, factor=0.9):
  [...]
  return smoothed_points

#load the generated data
train_data = np.load('samples00.npy')
test_data = np.load('samples00.npy')
train_targets = np.load('labels00.npy')
test_targets = np.load('labels00.npy')

#normalizing the data
mean = train_data.mean()
train_data -= mean
std = train_data.std()
train_data /= std
test_data -= mean
test_data /= std

#k-fold validation: 
k = 3
num_val_samples = len(train_data)//k
num_epochs = 100
all_mae_histories = []

for i in range(k):
    val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]
    val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]

    partial_train_data = np.concatenate(
        [train_data[:i * num_val_samples],
         train_data[(i + 1) * num_val_samples:]],
        axis=0)

    partial_train_targets = np.concatenate(
        [train_targets[:i * num_val_samples],
         train_targets[(i + 1) * num_val_samples:]],
        axis=0)

    model = build_model()

    #reshape the data to get the format (100, 66*2)
    partial_train_data = partial_train_data.reshape(100, 66 * 2)
    val_data = val_data.reshape(50, 66 * 2)

    history = model.fit(partial_train_data,
                        partial_train_targets,
                        validation_data = (val_data, val_targets),
                        epochs = num_epochs,
                        batch_size = 1,
                        verbose = 1)

    mae_history = history.history['val_mean_absolute_error']
    all_mae_histories.append(mae_history)

average_mae_history = [
    np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]

smooth_mae_history = smooth_curve(average_mae_history[10:])

plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

Очевидно, что мне нужно получить максимально возможную точность, но я получаю "срединную абсолютную ошибку (MAE)", такую ​​как 96%, и это недопустимо.

1 Ответ

0 голосов
/ 26 апреля 2019

Я вижу некоторые основные ошибки в этой методологии.Ваш последний уровень сети имеет слой softmax.Это будет означать, что он выведет 5 значений, которые в сумме равны 1, и будет вести себя как распределение вероятностей.То, что вы на самом деле хотите предсказать, - это истинные числа или, скорее, значения с плавающей запятой (по некоторой арифметике с фиксированной точностью).

Если у вас есть диапазон, то, вероятно, использование сигмоиды и изменение масштаба последнего слоя будет соответствовать диапазону (просто умножьте на максимальное значение).По умолчанию сигмоид гарантирует, что вы получите 5 чисел от 0 до 1.

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

Здесь проделана определенная работа: https://julialang.org/blog/2017/10/gsoc-NeuralNetDiffEq, которая пытается решить DE и может иметь отношение к вашей работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...