训练期间如何使用Lambda函数更改图层的激活

时间:2019-05-14 12:16:11

标签: machine-learning lambda keras

我是Keras的新手,正在尝试在培训期间修改图层的输出。我想编写一个函数,该函数接受层输出并将学习后的经过调制的输出返回到下一层。我试过使用lambda函数,但并没有真正掌握它。

def fun(x):
  a = min(x)
  y = np.round(x*(2**a))
return y

layer_1 = Dense(32, activation='relu')(input)
layer_2 = Dense(12, activation='relu')(layer_1)
lambda_layer = Lambda(fun, output_shape=(12,))(layer_2)
layer_3 = dense(32, activation='relu')(lambda_layer)

在将其输出传递到下一层之前,如何获取并修改它们的输出?

2 个答案:

答案 0 :(得分:1)

使用lambda函数是解决问题的正确方法。但是,请记住,lambda函数将成为您的计算图的一部分,并且在训练期间必须为整个图计算梯度。

例如,您不应像以前那样使用min()函数,而应使用Keras Backend中的函数。用其keras后端等效项替换所有操作将导致:

import keras.backend as K

def fun(x):
    a = K.min(x)
    y = K.round(K.dot(x, (K.pow(2, a))))
    return y

您的最终模型(以及所有Lambda层)应该只包含本地Keras函数,以便在训练过程中安全地执行所有计算。

答案 1 :(得分:0)

之所以失败,是因为您在np.round函数中使用了非本地操作(如Lambda),该函数期望进行keras操作

检查keras.backend文档,并从那里获取要使用的功能。

所以您的函数应该看起来像这样

from keras import backend as K

def fun(x):
    a = K.min(x, axis=-1)  # Specify the axis you need!
    y = K.round(x*(2**a))

    return y