Isa*_*man 6 machine-learning keras
Keras支持添加一个计算用户定义的lambda函数的层。我不知道Keras如何知道为反向传播计算此用户定义函数的梯度。
使用Theano / Tensorflow和库的好处之一就是建立在它们之上。它们可以为您提供数学函数和运算的自动梯度计算。
Keras通过致电:
# keras/theano_backend.py
def gradients(loss, variables):
return T.grad(loss, variables)
# keras/tensorflow_backend.py
def gradients(loss, variables):
'''Returns the gradients of `variables` (list of tensor variables)
with regard to `loss`.
'''
return tf.gradients(loss, variables, colocate_gradients_with_ops=True)
Run Code Online (Sandbox Code Playgroud)
进而由优化程序(keras / optimizers.py)调用,grads = self.get_gradients(loss, params)以获取用于为所有编写更新规则的渐变params。params这是各层的可训练权重。但是由Lambda功能图层创建的图层没有任何可训练的权重。但是它们通过前向概率影响损失函数,因此间接影响其他层可训练权重的梯度的计算。
唯一需要编写新的梯度计算的时间是在定义新的基本数学运算/函数时。同样,当您编写自定义损失函数时,自动渐变几乎总是照顾梯度计算。但是,如果您实现自定义函数的分析梯度,则可以选择优化培训(并非总是如此)。例如softwax函数可以用exp,sum和div表示,而auto grad可以解决这个问题,但是其解析/符号grad通常在Theano / Tensorflow中实现。
要实施新的Op,您可以查看以下链接:http : //deeplearning.net/software/theano/extending/extending_theano.html https://www.tensorflow.org/versions/r0.12/how_tos/adding_an_op/ index.html