Как я могу взять поэлементное логарифм тензора тензоров, а затем умножить каждый тензор на разные скаляры в tf? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать пользовательскую функцию потерь для использования Keras, и у меня возникли некоторые проблемы.После этого поста здесь: Пользовательская функция потерь в Keras Я знаю синтаксис для создания функции, но я не знаю, как работать с тензорами.Я заполнил yTrue скалярами, а yPred - это фактические предсказанные значения.Я хочу взять взвешенную сумму логов предсказанных значений, взвешенных по скалярам в yTrue.Когда я делаю что-то вроде этого:

def customLoss(yTrue,yPred):
        L = 0
        for i in range(len(yTrue)):
            L += tf.math.scalar_mul(yTrue[i], K.log(yPred[i]))
        return L

Программа падает, когда я пытаюсь скомпилировать модель с пользовательской функцией потерь, потому что кажется, что она передает некоторые тензоры и запускает функцию потерь, когда я делаю модель.компиляции.Распечатывая yTrue и yPred, я получаю Tensor("dense_4_target:0", shape=(?, ?), dtype=float32) Tensor("dense_4/Softmax:0", shape=(?, 4), dtype=float32), который говорит мне, что я должен заставить мою пользовательскую функцию потерь работать с тензорами.

Я пробовал return K.sum(K.prod(yTrue,K.log(yPred))), но я получаю

    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 1722, in reduce_prod
    name=name))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 6239, in prod
    name=name)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 610, in _apply_op_helper
    param_name=input_name)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 60, in _SatisfiesTypeConstraint
    ", ".join(dtypes.as_dtype(x).name for x in allowed_list)))

который мне не очень полезен

1 Ответ

0 голосов
/ 19 марта 2019

Я разобрался, как это сделать.Я перехожу к model.fit (x = states, y = G), где G - массив, соответствующий размеру yPred.Вот где я положил значения своих скаляров.Тогда моя функция потерь может быть return K.sum(K.sum(yTrue*K.log(yPred)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...