自定义激活功能Keras:将不同的激活应用于不同的图层

时间:2018-06-29 03:06:35

标签: python tensorflow keras

我的自定义激活函数的i / p将是19 * 19 * 5张量,即x。该函数的功能必须是将S形应用于第一层,即x [:,:,0:1],将relu应用于其余的层,即x [:,:,1:5]。我使用以下代码定义了自定义激活功能:

def custom_activation(x):
    return tf.concat([tf.sigmoid(x[:,:,:,0:1]) , tf.nn.relu(x[:,:,:,1:5])],axis = 3)

get_custom_objects().update({'custom_activation': Activation(custom_activation)})

第四个维度出现在图片中,因为在输入处获得的函数custom_activation具有批次大小作为另一个维度。因此输入张量的形状为[bathc_size,19,19,5]。

有人可以告诉我这样做是否正确吗?

1 个答案:

答案 0 :(得分:1)

Keras Activation被设计为在几乎任何可想象的前馈层(例如Tanh,Relu,Softmax等)的任意大小的层上工作。您描述的转换声音特定于您所使用的体系结构中的特定层。因此,我建议您使用Lambda层来完成任务:

from keras.layers import Lambda

def custom_activation_shape(input_shape):
     # Ensure there is rank 4 tensor
     assert len(input_shape) == 4
     # Ensure the last input component has 5 dimensions
     assert input_shape[3] == 5

     return input_shape  # Shape is unchanged

然后可以使用以下哪个添加到模型中

Lambda(custom_activation, output_shape=custom_activation_shape)

但是,如果您打算在网络中的许多不同层之后使用此转换,从而真正希望使用自定义定义的Activation,请参阅How do you create a custom activation function with Keras?,这建议您执行问题中所写的内容