Ошибка из-за неинициализации тензоров - PullRequest
0 голосов
/ 17 мая 2019

У меня есть код, который получает 2 тензора и преобразует их в массив numpy, а затем выполняет некоторую операцию, преобразует результат обратно в тензор и возвращает его. У меня есть ошибки, связанные с этим. Я предоставляю эту функцию в качестве пользовательской метрики для функции model.compile keras. Однако эта функция работает хорошо, когда я использую ее отдельно, т.е. подает два тензора и затем анализирует возвращаемое значение.

Я попытался выполнить инициализацию внутри функции, но проблема не решена.

def _cohen_kappa(y_true, y_pred):
    y_pred2 = K.argmax(y_pred, axis=-1)
    y_true2 = K.argmax(y_true, axis=-1)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        sess.run(y_true2)
        sess.run(y_pred2)
        y_true_ar = y_true2.eval()
        y_pred_ar = y_pred2.eval()
        kappa_score_ar = cohen_kappa_score(y_true_ar, y_pred_ar, weights='linear')
        kappa_score_ar_tf = tf.convert_to_tensor(kappa_score_ar, dtype=tf.float32)
        sess.run(kappa_score_ar_tf)
    return kappa_score_ar_tf

    # i feed this as custom metric

model.compile(optimizer=optimizers.SGD(lr=0.001, momentum=0.9),
              loss='categorical_crossentropy',
              metrics=['categorical_crossentropy',
                       'mae', _cohen_kappa])

Сообщение об ошибке:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dense_21_target' with dtype float and shape [?,?]
     [[node dense_21_target (defined at C:\ProgramData\Anaconda3\envs\py36\lib\site-packages\keras\backend\tensorflow_backend.py:517)  = Placeholder[dtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Эта функция работает, когда я пытаюсь выполнить самостоятельно.

y_true = tf.Variable([[1,0,0],[0,0,1],[0,1,0],[1,0,0],[0,0,1],[0,1,0],[1,0,0],[0,0,1],[0,1,0],[1,0,0],[0,0,1],[0,1,0]])
y_pred = tf.Variable([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0],[0,0,1]])
return_value = _cohen_kappa(y_true,y_pred)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    temp = return_value.eval()
    print(temp)

1 Ответ

1 голос
/ 17 мая 2019

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

Если вы используете его не для расчета убытков, а только для метрик, пожалуйста, проверьте этот похожий вопрос

Как я могу указать функцию потерь, чтобы быть квадратически взвешенной каппой в Керасе?

...