У меня есть код, который получает 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)