如何为2D数据添加池化层?GlobalAveragePooling2D后遇张量维度问题
解决方案
你不需要自定义层,用Keras自带的层就能实现需求,以下是几种高效的实现方式:
方法1:Reshape + MaxPooling2D
先把GlobalAveragePooling2D输出的2D张量转成4D,用MaxPooling2D完成维度压缩后再转回来:
x_temp = conv_base2(input_temp) x_temp = tf.keras.layers.GlobalAveragePooling2D()(x_temp) # 将(None, 1536)转为(None, 2, 768, 1),适配MaxPooling2D的4D输入要求 x_temp = tf.keras.layers.Reshape((2, 768, 1))(x_temp) # 在第1维度做池化,把2维压缩为1维 x_temp = tf.keras.layers.MaxPooling2D(pool_size=(2, 1), padding="valid")(x_temp) # 转回(None, 768)的2D张量 x_temp = tf.keras.layers.Reshape((768,))(x_temp)
方法2:Reshape + MaxPool1D
用1D池化更贴合当前的特征维度场景,步骤更直观:
x_temp = conv_base2(input_temp) x_temp = tf.keras.layers.GlobalAveragePooling2D()(x_temp) # 转为3D张量(None, 1536, 1),适配MaxPool1D的输入要求 x_temp = tf.keras.layers.Reshape((1536, 1))(x_temp) # 以窗口大小2做1D最大池化,直接把1536维压缩到768维 x_temp = tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding="valid")(x_temp) # 转回2D张量 x_temp = tf.keras.layers.Reshape((768,))(x_temp)
方法3:Lambda层直接分组取最大值
如果你的需求本质是把1536维特征分成两组、每组取最大值,用Lambda层可以一步完成,不需要额外的池化层:
x_temp = conv_base2(input_temp) x_temp = tf.keras.layers.GlobalAveragePooling2D()(x_temp) # 把特征张量reshape为(None, 2, 768),沿第1维度取最大值得到(None, 768) x_temp = tf.keras.layers.Lambda(lambda x: tf.reduce_max(tf.reshape(x, (-1, 2, 768)), axis=1))(x_temp)
以上三种方法都能实现你想要的维度变化,且都是基于Keras原生层,稳定性和兼容性更好,不需要自定义层。
内容的提问来源于stack exchange,提问作者Pepeeeee
相关产品推荐
相关产品推荐

