将自定义Lambda图层包含在Keras的反向传播中

时间:2017-04-08 10:12:58

标签: keras

假设我有以下lambda图层:

l = Lambda(lambda x:1 /(1 + math.e ** x))

这是一个sigmoid函数。既然我没有在任何地方指定这个函数的导数,我很好奇它是否会被包含在反向传播中。是否有一些神奇的自动机制可以帮助我?

1 个答案:

答案 0 :(得分:4)

是的,它将包含在反向传播中。但是,没有魔力。 Theano将定义一个计算图,该图具有许多基本操作的预定义导数。只要您可以使用这些基本表达式来定义函数,就不必担心反向传播。

在您的情况下,可以通过首先计算cp $HADOOP_HOME/share/hadoop/**/*.jar libext/ cp $HADOOP_HOME/share/hadoop/common/*.jar libext/ cp $HADOOP_HOME/share/hadoop/common/lib/*.jar libext/ cp $HADOOP_HOME/share/hadoop/hdfs/lib/*.jar libext/ cp $HADOOP_HOME/share/hadoop/hdfs/*.jar libext/ cp $HADOOP_HOME/share/hadoop/mapreduce/*.jar libext/ cp $HADOOP_HOME/share/hadoop/mapreduce/lib/*.jar libext/ cp $HADOOP_HOME/share/hadoop/yarn/lib/*.jar libext/ cp $HADOOP_HOME/share/hadoop/yarn/*.jar libext/ ,然后计算exp(x),最后计算1 + exp(x)来构建正向传递。请注意,每个步骤都基于上一步构建。对于向后传递,情况也是如此。

在你的向后传球中,你有三个操作。首先,1/(1 + exp(x))的导数,然后是1/Z (Z = 1 + exp(x))的导数,最后是1 + Y (Y = exp(x))的导数。

Theano很容易为这三个操作构建计算图。现在,如果你有一个函数,比如exp(x),其中Theano既不知道1/(1 + f(x))的导数,也不能将它分解为一组基本表达式,那么你必须通过修改Theano源来手动定义它的渐变代码。