У меня есть уравнение, которое описывает кривую в двух измерениях. Это уравнение имеет 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%, и это недопустимо.