我的自定义激活函数的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]。
有人可以告诉我这样做是否正确吗?
答案 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?,这建议您执行问题中所写的内容