Как создать пользовательскую целевую функцию в Keras?

В Keras здесь много объективных функций .

Но как вы можете создать свою собственную целевую функцию, я попытался создать очень базовую целевую функцию, но она дает ошибку, и я не знаю, как определить размер параметров, переданных функции во время выполнения.

def loss(y_true,y_pred): loss = T.vector('float64') for i in range(1): flag = True for j in range(y_true.ndim): if(y_true[i][j] == y_pred[i][j]): flag = False if(flag): loss = loss + 1.0 loss /= y_true.shape[0] print loss.type print y_true.shape[0] return loss 

Я получаю 2 противоречащих ошибки,

 model.compile(loss=loss, optimizer=ada) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/models.py", line 75, in compile updates = self.optimizer.get_updates(self.params, self.regularizers, self.constraints, train_loss) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/optimizers.py", line 113, in get_updates grads = self.get_gradients(cost, params, regularizers) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/optimizers.py", line 23, in get_gradients grads = T.grad(cost, params) File "/usr/local/lib/python2.7/dist-packages/theano/gradient.py", line 432, in grad raise TypeError("cost must be a scalar.") TypeError: cost must be a scalar. 

Он говорит, что стоимость или потеря, возвращаемые функцией, должны быть скаляром, но если я изменю строку 2 от потери = T.vector ('float64'),
в
loss = T.scalar ('float64')

он показывает эту ошибку

  model.compile(loss=loss, optimizer=ada) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/models.py", line 75, in compile updates = self.optimizer.get_updates(self.params, self.regularizers, self.constraints, train_loss) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/optimizers.py", line 113, in get_updates grads = self.get_gradients(cost, params, regularizers) File "/usr/local/lib/python2.7/dist-packages/Keras-0.0.1-py2.7.egg/keras/optimizers.py", line 23, in get_gradients grads = T.grad(cost, params) File "/usr/local/lib/python2.7/dist-packages/theano/gradient.py", line 529, in grad handle_disconnected(elem) File "/usr/local/lib/python2.7/dist-packages/theano/gradient.py", line 516, in handle_disconnected raise DisconnectedInputError(message) theano.gradient.DisconnectedInputError: grad method was asked to compute the gradient with respect to a variable that is not part of the computational graph of the cost, or is used only by a non-differentiable operator: <TensorType(float64, matrix)> 

2 Solutions collect form web for “Как создать пользовательскую целевую функцию в Keras?”

Вот мой небольшой фрагмент, чтобы написать новые функции потерь и проверить их перед использованием:

 import numpy as np from keras import objectives from keras import backend as K _EPSILON = K.epsilon() def _loss_tensor(y_true, y_pred): y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON) out = -(y_true * K.log(y_pred) + (1.0 - y_true) * K.log(1.0 - y_pred)) return K.mean(out, axis=-1) def _loss_np(y_true, y_pred): y_pred = np.clip(y_pred, _EPSILON, 1.0-_EPSILON) out = -(y_true * np.log(y_pred) + (1.0 - y_true) * np.log(1.0 - y_pred)) return np.mean(out, axis=-1) def check_loss(_shape): if _shape == '2d': shape = (6, 7) elif _shape == '3d': shape = (5, 6, 7) elif _shape == '4d': shape = (8, 5, 6, 7) elif _shape == '5d': shape = (9, 8, 5, 6, 7) y_a = np.random.random(shape) y_b = np.random.random(shape) out1 = K.eval(_loss_tensor(K.variable(y_a), K.variable(y_b))) out2 = _loss_np(y_a, y_b) assert out1.shape == out2.shape assert out1.shape == shape[:-1] print np.linalg.norm(out1) print np.linalg.norm(out2) print np.linalg.norm(out1-out2) def test_loss(): shape_list = ['2d', '3d', '4d', '5d'] for _shape in shape_list: check_loss(_shape) print '======================' if __name__ == '__main__': test_loss() 

Здесь, как вы можете видеть, я тестирую потерю binary_crossentropy и имею две отдельные потери, одну версию numpy (_loss_np), другую версию тензора (_loss_tensor) [Примечание: если вы просто используете функции keras, то он будет работать как с Theano, так и с Tensorflow … но если вы зависите от одного из них, вы также можете ссылаться на них по K.theano.tensor.function или K.tf.function]

Позже я сравниваю выходные формы и норму L2 выходов (которые должны быть почти равны) и норма L2 разницы (которая должна быть в направлении 0)

Как только вы убедитесь, что ваша функция потерь работает правильно, вы можете использовать ее как:

 model.compile(loss=_loss_tensor, optimizer=sgd) 

Фактически вы можете получить убыток от класса обратных вызовов:

 class LossHistory(keras.callbacks.Callback): def on_train_begin(self, logs={}): self.losses = [] def on_epoch_end(self, batch, logs={}): self.losses.append(logs.get('loss')) 

Затем разработайте свою модель:

 model = Sequential() model.add(Dense(20, input_dim=2, init='uniform')) model.add(Activation('tanh')) model.add(Dropout(0.5)) model.add(Dense(2, init='uniform')) model.add(Activation('softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.97, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=['accuracy']) history=LossHistory() model.fit(X_train, y_train,nb_epoch=200,batch_size=16,callbacks=[history]) 
  • Как подготовить набор данных для Keras?
  • Keras train_on_batch потеря / точность 0
  • Преобразование последовательности в функционал в Keras
  • Keras использует слишком много памяти GPU при вызове train_on_batch, fit и т. Д.
  • Признание мниста с использованием кера
  • как реализовать пользовательскую метрику в keras?
  • Keras: вес класса (class_weight) для однократной кодировки
  • Неверное количество измерений на model.fit
  • Python - лучший язык программирования в мире.