Keras中有很多目标函数here.
但是你如何创建自己的目标函数,我尝试创建一个非常基本的目标函数,但它给出了一个错误,我无法知道在运行时传递给该函数的参数的大小。
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 行从
loss = 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)>
最佳答案
这是我编写新损失函数并在使用前测试它们的小片段:
import numpy as np
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 损失,并定义了 2 个单独的损失,一个是 numpy 版本 (_loss_np),另一个是张量版本 (_loss_tensor) Theano 和 Tensorflow...但如果您依赖其中之一,您也可以通过 K.theano.tensor.function 或 K.tf.function 引用它们]
稍后我将比较输出形状和输出的 L2 范数(应该几乎相等)和差值的 L2 范数(应该接近 0)
一旦您对损失函数正常工作感到满意,您就可以将其用作:
model.compile(loss=_loss_tensor, optimizer=sgd)
关于python - 如何在 Keras 中创建自定义目标函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33859864/