Производная по функции потерь в Керасе - PullRequest
0 голосов
/ 11 мая 2018

Я хочу сделать следующую функцию потерь в керасе:

Loss = mse + double_derivative(y_pred,x_train)

Я не могу включить производный термин. Я пробовал K.gradients(K.gradients(y_pred,x_train),x_train), но это не помогает.

Я получаю сообщение об ошибке:

AttributeError: объект 'NoneType' не имеет атрибута 'op'

def _loss_tensor(y_true, y_pred,x_train):
    l1 = K.mean(K.square(y_true - y_pred), axis=-1)
    sigma = 0.01
    lamda = 3
    term = K.square(sigma)*K.gradients(K.gradients(y_pred,x_train),x_train)
    l2 = K.mean(lamda*K.square(term),axis=-1)
    return l1+l2

def loss_func(x_train):
        def loss(y_true,y_pred):
            return _loss_tensor(y_true,y_pred,x_train)
        return loss

def create_model_neural(learning_rate, num_layers,
                 num_nodes, activation):

    model_neural = Sequential()

    x_train = model_neural.add(Dense(num_nod, input_dim=num_input, activation=activation))

    for i in range(num_layers-1):
        model_neural.add(Dense(num_nodes,activation=activation,name=name))

    model_neural.add(Dense(1, activation=activation))

    optimizer = SGD(lr=learning_rate)
    model_loss = loss_func(x_train=x_train)

    model_neural.compile(loss=model_loss,optimizer=optimizer)

    return model_neural

1 Ответ

0 голосов
/ 13 мая 2018

Проблема в том, что x_train всегда None, и keras не может получить производную по None. И это происходит потому, что model_neural.add(...) ничего не возвращает.

Я предполагаю, что x_train - это вход, который передается в сеть. В этом случае x_train, вероятно, должен быть другим аргументом create_model_neural, или же вы можете попробовать model_neural.input тензор.

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