Keras: GlobalMaxPooling vs. MaxPooling

Keras: GlobalMaxPooling vs. MaxPooling

1D最大池化(1D Max Pooling)

# MaxPooling1D
keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')

# GlobalMaxPooling1D
keras.layers.GlobalMaxPooling1D(data_format='channels_last')

顾名思义,Max Pooling是指在池化的窗口中选择最大值。可以看到,GlobalMaxPooling1D 和 MaxPooling1D相比少了三个参数,其实这三个参数描述的是一件事情: 池化时的窗口大小。

MaxPooling1D和GlobalMaxPooling1D示例

如上图所示,在1x1x5的网络上进行MaxPooling1D时,如果选择窗口大小为2,则面临两个问题:
1. 滑动窗口的步长选多少?(一般默认为pool_size
2. 如果在上图中步长选2,最后一行还要不要了?(图中选择valid,即不做padding, 放弃最后一行)

而对于GlobalMaxPooling1D来说,pool_size是固定的——就是最长那个维度(“全局”最大池化)。所以,步长不需要考虑——因为没有滑动空间了;因此,padding的问题也不存在了。

与此相应的,两种池化后结果的维度也不同:

MaxPooling1D和GlobalMaxPooling1D结果示例

 2D最大池化(2D Max Pooling)

  和1D时一样,有:

  

# MaxPooling2D
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

# GlobalMaxPooling2D
keras.layers.GlobalMaxPooling2D(data_format='channels_last')

 GlobalMaxPooling2D对全局做最大池化。

MaxPooling2D和GlobalMaxPooling2D结果示例

 3D最大池化(3D Max Pooling)

  就不写了,同理。

 应用场景

  NLP领域更常使用Global Max Pooling, 计算机视觉领域更常使用Max Pooling (非Global).

 概念迁移

  除了最大池化,Keras.layers还有平均池化(Average Pooling)—— 计算池化窗口中的平均值。使用时,把以上提到的Max全    部替换为Average就可以了。

  参考文献

    Keras官方文档

    What does GlobalMaxPooling1D() do to output of LSTM unit in Keras?

    What is the difference between Keras’ MaxPooling1D and GlobalMaxPooling1D functions?

    What is global max pooling layer and what is its advantage over maxpooling layer?

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
def MEAN_Spot(opt): # channel 1 inputs1 = layers.Input(shape=(42,42,1)) conv1 = layers.Conv2D(3, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs1) bn1 = layers.BatchNormalization()(conv1) pool1 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(bn1) do1 = layers.Dropout(0.3)(pool1) # channel 2 inputs2 = layers.Input(shape=(42,42,1)) conv2 = layers.Conv2D(3, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs2) bn2 = layers.BatchNormalization()(conv2) pool2 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(bn2) do2 = layers.Dropout(0.3)(pool2) # channel 3 inputs3 = layers.Input(shape=(42,42,1)) conv3 = layers.Conv2D(8, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs3) bn3 = layers.BatchNormalization()(conv3) pool3 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(bn3) do3 = layers.Dropout(0.3)(pool3) # merge 1 merged = layers.Concatenate()([do1, do2, do3]) # interpretation 1 merged_conv = layers.Conv2D(8, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.1))(merged) merged_pool = layers.MaxPooling2D(pool_size=(2, 2), padding='same', strides=(2,2))(merged_conv) flat = layers.Flatten()(merged_pool) flat_do = layers.Dropout(0.2)(flat) # outputs outputs = layers.Dense(1, activation='linear', name='spot')(flat_do) #Takes input u, v, os model = keras.models.Model(inputs=[inputs1, inputs2, inputs3], outputs=[outputs]) model.compile( loss={'spot':'mse'}, optimizer=opt, metrics={'spot':tf.keras.metrics.MeanAbsoluteError()}, ) return model 更改模型加入CBAM模块
06-10
可以尝试在每个卷积层后加入CBAM模块,CBAM模块可以用来增强模型的注意力机制。 以下是修改后的代码: ```python from keras.layers import GlobalAveragePooling2D, Reshape, Dense, multiply, Permute def channel_attention(input_feature, ratio=8): channel_axis = 1 if K.image_data_format() == "channels_first" else -1 channel = input_feature._keras_shape[channel_axis] shared_layer_one = Dense(channel//ratio, activation='relu', kernel_initializer='he_normal', use_bias=True, bias_initializer='zeros') shared_layer_two = Dense(channel, kernel_initializer='he_normal', use_bias=True, bias_initializer='zeros') avg_pool = GlobalAveragePooling2D()(input_feature) avg_pool = Reshape((1,1,channel))(avg_pool) assert avg_pool._keras_shape[1:] == (1,1,channel) avg_pool = shared_layer_one(avg_pool) assert avg_pool._keras_shape[1:] == (1,1,channel//ratio) avg_pool = shared_layer_two(avg_pool) assert avg_pool._keras_shape[1:] == (1,1,channel) max_pool = GlobalMaxPooling2D()(input_feature) max_pool = Reshape((1,1,channel))(max_pool) assert max_pool._keras_shape[1:] == (1,1,channel) max_pool = shared_layer_one(max_pool) assert max_pool._keras_shape[1:] == (1,1,channel//ratio) max_pool = shared_layer_two(max_pool) assert max_pool._keras_shape[1:] == (1,1,channel) cbam_feature = Add()([avg_pool,max_pool]) cbam_feature = Activation('sigmoid')(cbam_feature) if K.image_data_format() == "channels_first": cbam_feature = Permute((3, 1, 2))(cbam_feature) return multiply([input_feature, cbam_feature]) def spatial_attention(input_feature): kernel_size = 7 if K.image_data_format() == "channels_first": channel = input_feature._keras_shape[1] cbam_feature = Permute((2,3,1))(input_feature) else: channel = input_feature._keras_shape[-1] cbam_feature = input_feature avg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature) assert avg_pool._keras_shape[-1] == 1 max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature) assert max_pool._keras_shape[-1] == 1 concat = Concatenate(axis=3)([avg_pool, max_pool]) assert concat._keras_shape[-1] == 2 cbam_feature = Conv2D(filters = 1, kernel_size=kernel_size, strides=1, padding='same', activation='sigmoid', kernel_initializer='he_normal', use_bias=False)(concat) assert cbam_feature._keras_shape[-1] == 1 if K.image_data_format() == "channels_first": cbam_feature = Permute((3, 1, 2))(cbam_feature) return multiply([input_feature, cbam_feature]) def CBAM(input_feature): cbam_feature = channel_attention(input_feature) cbam_feature = spatial_attention(cbam_feature) return cbam_feature def MEAN_Spot_CBAM(opt): # channel 1 inputs1 = layers.Input(shape=(42,42,1)) conv1 = layers.Conv2D(3, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs1) bn1 = layers.BatchNormalization()(conv1) cbam1 = CBAM(bn1) pool1 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(cbam1) do1 = layers.Dropout(0.3)(pool1) # channel 2 inputs2 = layers.Input(shape=(42,42,1)) conv2 = layers.Conv2D(3, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs2) bn2 = layers.BatchNormalization()(conv2) cbam2 = CBAM(bn2) pool2 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(cbam2) do2 = layers.Dropout(0.3)(pool2) # channel 3 inputs3 = layers.Input(shape=(42,42,1)) conv3 = layers.Conv2D(8, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.001))(inputs3) bn3 = layers.BatchNormalization()(conv3) cbam3 = CBAM(bn3) pool3 = layers.MaxPooling2D(pool_size=(3, 3), padding='same', strides=(3,3))(cbam3) do3 = layers.Dropout(0.3)(pool3) # merge 1 merged = layers.Concatenate()([do1, do2, do3]) # interpretation 1 merged_conv = layers.Conv2D(8, (5,5), padding='same', activation='relu', kernel_regularizer=l2(0.1))(merged) merged_cbam = CBAM(merged_conv) merged_pool = layers.MaxPooling2D(pool_size=(2, 2), padding='same', strides=(2,2))(merged_cbam) flat = layers.Flatten()(merged_pool) flat_do = layers.Dropout(0.2)(flat) # outputs outputs = layers.Dense(1, activation='linear', name='spot')(flat_do) #Takes input u, v, os model = keras.models.Model(inputs=[inputs1, inputs2, inputs3], outputs=[outputs]) model.compile( loss={'spot':'mse'}, optimizer=opt, metrics={'spot':tf.keras.metrics.MeanAbsoluteError()}, ) return model ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值