Проблемы с пользовательской функцией потерь в Керасе - PullRequest
0 голосов
/ 17 марта 2020

Мне нужна функция потери Keras. Следующий код работает с функцией потерь loss2 , но не использует функцию потерь loss1 . Я получаю ошибки как

OperatorNotAllowedInGraphError: использование tf.Tensor в качестве Python bool не допускается при выполнении графика. Используйте Eager для выполнения или украсьте эту функцию с помощью @ tf.function.

Я украсил функцию с помощью @ tf.function, но она не работает.

import numpy as np
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense, LeakyReLU

def individual_model(keys, labels):
    model = Sequential()
    size = 32
    model.add(Dense(32, input_dim=1))
    model.add(LeakyReLU())
    for i in range(2):
        model.add(Dense(size))
        model.add(LeakyReLU())
    model.add(Dense(1))
    model.compile(optimizer='adam', loss=my_loss, metrics=[
                my_loss])
    model.fit(keys, labels, epochs=256, batch_size=32, verbose=1)
    return model


def loss1(v):
    if v<0:
        return -100 * v
    else: 
        return v

def loss2(v):
    return v*v

def my_loss(y_true, y_pred):
    return K.map_fn(loss1,y_true-y_pred) #with loss2 this works


x=np.random.exponential(100,1000)
x.sort()
labels=np.arange(0,1000)
m=individual_model(x,labels)

Ответы [ 2 ]

1 голос
/ 17 марта 2020

tf.where может использоваться в определении потери v1 примерно так: ссылка :

import tensorflow as tf 
import numpy as np 
arr = np.array([1., -1])
sess = tf.Session()
print(sess.run(tf.where(arr<0., arr*100., arr*10.))

Вывод:

array([  10., -100.])
0 голосов
/ 18 марта 2020

На основании рекомендации @Engineero.

Следующий код работает

def cond_switch(x):
    return K.relu(-x)*10 + K.relu(x)

def my_loss(y_true, y_pred):
    return cond_switch(y_true-y_pred)

Я все еще пытаюсь выяснить причину.

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