Сеть Керас в ноль и очень низкие потери - PullRequest
0 голосов
/ 11 июня 2018

У меня есть сеть:

Tensor("input_1:0", shape=(?, 5, 1), dtype=float32)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 5, 1)              0         
_________________________________________________________________
bidirectional_1 (Bidirection (None, 5, 64)             2176      
_________________________________________________________________
activation_1 (Activation)    (None, 5, 64)             0         
_________________________________________________________________
bidirectional_2 (Bidirection (None, 5, 128)            16512     
_________________________________________________________________
activation_2 (Activation)    (None, 5, 128)            0         
_________________________________________________________________
bidirectional_3 (Bidirection (None, 1024)              656384    
_________________________________________________________________
activation_3 (Activation)    (None, 1024)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 1025      
_________________________________________________________________
p_re_lu_1 (PReLU)            (None, 1)                 1         
=================================================================
Total params: 676,098
Trainable params: 676,098
Non-trainable params: 0
_________________________________________________________________
None
Train on 27496 samples, validate on 6875 samples

Я подгоняю и компилирую его:

model.compile(loss='mse',optimizer=Adamx,metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=10,validation_data=(x_test,y_test),verbose=2)

Когда я запускаю его и оцениваю по невидимым данным, он возвращает 0,0 Точность с оченьнизкие потериЯ не могу понять, в чем проблема.

Epoch 10/10
 - 29s - loss: 1.6972e-04 - acc: 0.0000e+00 - val_loss: 1.7280e-04 - val_acc: 0.0000e+00

1 Ответ

0 голосов
/ 11 июня 2018

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

Поскольку вы используете 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])
...