我是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)
在将其输出传递到下一层之前,如何获取并修改它们的输出?
答案 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