Как отладить нестандартную loss-функцию на Keras?
Основная проблема с Loss функцией — это проблема с выводом значений переменных внутри неё, она компилируется и затем выполняется на GPU, где никакой print не работает. Методика для отладки может быть следующая.
1) Создаем 2 numpy-массива, содаржащие TRUE и PREDICTED значения. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
real = np.array([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5],]) pred = np.array([[0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], [0, 2, 3, 4, 10], ]) |
2) Делаем стандартную Python функцию которая вычисляет на основе этих переменных Loss. Убеждаемся что она работает верно.
1 2 3 4 5 6 |
def rmse_numpy(): full = 0.0 for i in range(5): r = sqrt(mean_squared_error(real[:, i], pred[:, i])) full += r return full/5 |
3) Пишем функцию для Keras с использованием бекенда и которая затем будет передваться как loss-функция в метод compile.
1 2 3 4 |
from keras import backend as K def rmse_keras(Y_true, Y_pred): rmse = K.sqrt(K.mean(K.square(Y_true - Y_pred), axis=0)) return K.mean(rmse) |
4) Вызываем numpy функцию и keras функции:
1 2 3 4 |
outn = rmse_numpy(real, pred) print('RMSE Score Numpy:', outn) outk = K.eval(rmse_loss(K.variable(real), K.variable(pred))) print('RMSE Score Keras:', outk) |
Убеждаемся что результат одинаков. Если нет правим ошибки.
Categories: FAQ, Программирование