Ожидается то, что вы получаете.Ваша модель работает правильно, это ваши метрики измерения, которые неверны.Целью функции потерь является минимизация потерь, а не повышение точности.
Поскольку вы используете PRelu в качестве функции активации вашего последнего слоя, вы всегда получаете плавающий вывод из сети.Сравнение этих выводов с плавающей точкой с фактической меткой для измерения точности не кажется правильным вариантом.Это связано с тем, что если модель прогнозирует значения, очень близкие к истинному значению метки, точность модели все равно будет равна нулю, если только модель не предсказывает точно такое же значение, как истинная метка.
Например, если y_true равно 1,0, а модель прогнозирует 0,999999тем не менее, это значение не добавляет значения точности модели, поскольку 1.0! = 0.99999
Обновление Выбор функции метрик зависит от типа проблемы.Keras также предоставляет функциональность для реализации пользовательских метрик .Предполагая, что рассматриваемой проблемой является линейная регрессия, и два значения равны, если разница между двумя значениями меньше 0,01, пользовательские метрики потерь могут быть определены как: -
import keras.backend as K
import tensorflow as tf
accepted_diff = 0.01
def linear_regression_equality(y_true, y_pred):
diff = K.abs(y_true-y_pred)
return K.mean(K.cast(diff < accepted_diff, tf.float32))
Теперь вы можете использовать эти метрики дляваша модель
model.compile(loss='mse',optimizer=Adamx,metrics=[linear_regression_equality])