Как исправить очень медленный keras.backend.eval - PullRequest
0 голосов
/ 03 июня 2019

Я хочу оценить функцию потерь модели для каждого образца после тренировки.Простой вызов потерь приводит к отдельному значению для каждого пакета, поэтому я вызываю функцию потерь вручную для значения предиката ().

Это требует оценки тензора, поскольку потеря возвращает тензор.Оценить этот тензор достаточно просто, но вызов длится вечно, несмотря на то, что это простая операция.

Я пробовал session.run из сеанса keras, а также keras.backend.eval, оба имеют одинаковыевопрос.Я также пытался обновить keras, но он уже на 2.2.4

import keras
indim = 28
model = Sequential([Dense(8,input_shape=(indim,),activation='tanh'),Dense(4,activation='tanh'),Dense(1,activation='linear')])
model.compile(optimizer='adam',loss='mae')
def foo():
    for i in range(0,500):
        input = np.random.rand(32,28)
        Y     = np.random.rand(32,1)
        Ypred = model.predict(input)
        loss = model.loss_functions[0](Y,Ypred)
        loss = keras.backend.eval(loss)
%prun foo()

. Я ожидал, что приведенный выше пример завершится за доли секунды.Сначала это займет 20 секунд, а во втором - 40 секунд, а профилировщик вернет:

      500   27.580    0.055   27.580    0.055 {built-in method _pywrap_tensorflow_internal.ExtendSession}
      500   18.866    0.038   18.866    0.038 {built-in method _pywrap_tensorflow_internal.TF_SessionRun_wrapper}
    16500    0.124    0.000    0.129    0.000 pywrap_tensorflow_internal.py:39(_swig_setattr_nondynamic)

последующие вызовы будут длиться дольше (20, 40, 80 секунд!)

1 Ответ

0 голосов
/ 06 июня 2019

Решение заканчивается использованием K.placeholder.В противном случае глобальный график увеличивается с каждым вызовом функции потери модели.

import time

import numpy as np

import keras.backend as K
from keras.layers import Dense
from keras.models import Sequential

indim = 28
model = Sequential([Dense(8, input_shape=(indim,), activation='tanh'), Dense(4, activation='tanh'),
                    Dense(1, activation='linear')])
model.compile(optimizer='adam', loss='mae')
y_pred = K.placeholder([None, 1])
y_true = K.placeholder([None, 1])
loss_fn = model.loss_functions[0](y_true, y_pred)

for i in range(0, 500):
    s = time.time()
    input = np.random.rand(32, 28)
    Y = np.random.rand(32, 1)
    Ypred = model.predict(input)
    _ = K.get_session().run(loss_fn, feed_dict={y_true: Y, y_pred: Ypred})
    print("Took", time.time() - s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...