Почему моя пользовательская функция потерь не принимает преобразованные массивы? - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь написать пользовательскую функцию потерь, которая будет работать с выходом NN после прямого прохода, но до обратного пропуска, вызывая внешнюю функцию (не записанную с внутренними функциями keras / tenorflow). Разница между этим оперируемым выходом и идеальным выходом - это то, что я хочу использовать для вычисления ошибки.

У меня есть пользовательская функция потерь, loss_function (y_true, y_pred), которая использует tf.py_function для вызова внешней функции, передавая аргумент y_pred функции.

В идеале я хотел бы преобразовать аргумент y_pred в массив numpy, использовать этот массив с моей функцией для возврата другого массива numpy, преобразовать этот массив numpy в tf-тензор, а затем использовать его в функции потерь по мере необходимости.

Вот пользовательская функция ошибки:

def loss_function(y_true,y_pred):

    y_pred2 = tf.py_function(func=SOA, inp=[y_pred], Tout=tf.float32)

    return tf.reduce_mean(tf.pow(y_true - y_pred2,2))

А вот внешняя функция 'SOA', которую она вызывает, которая просто преобразует ее в пустой массив, а затем обратно в tf-тензор:


def SOA(y_pred):

    y_pred0 = np.square(np.copy(y_pred))
    print(type(y_pred0))
    y_pred1 = tf.convert_to_tensor((y_pred0))
    print(type(y_pred1))


    return y_pred1

Я могу работать непосредственно с y_pred во внешней функции, используя различные функции tf, но если я преобразую его в массив numpy (например, используя np.copy (...)), затем преобразую его обратно, используя tf.convert_to_tensor выдает следующую ошибку:

InvalidArgumentError: In[0] is not a matrix
     [[{{node training_188/Adam/gradients/dense_299/MatMul_grad/MatMul}}]]

Кроме того, если я использую y_true вместо y_pred, это выдаст другую ошибку:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

Мне это кажется странным, поскольку, похоже, он различает объекты одного и того же типа ().

1 Ответ

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

Ваш пост немного сбивает с толку, но согласно документации tf.py_func ваша функция SOA должна возвращать ndarray (что является типом массива numpy), а не тензор .Поэтому пропустите преобразование и посмотрите, поможет ли это.

Попробуйте:

def SOA(y_pred):

    y_pred0 = np.square(np.copy(y_pred))
    print(type(y_pred0))

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