我正在处理眼动轨迹数据和卷积神经网络。我被要求使用 tf.reduce_max(lastconv, axis=2)
来替代最大池化层,并使用 tf.reduce_sum(lastconv,axis=2) / tf.reduce_sum(tf.cast(tf.greater(lastconv, 0), tf.float32), axis=2)
来替代平均池化层。
我有一些问题没有得到清晰的解答。如果您能帮我理解,将不胜感激。
- reduce_max 函数的内部计算与传统的最大池化层是否相同?两者的输出在维度上不同,为什么会这样?我不太理解其中的原因?
- 为什么我们不能直接使用
tf.reduce_mean
函数来进行平均池化,就像使用tf.reduce_max
来进行最大池化一样? tf.reduce_sum(lastconv,axis=2) / tf.reduce_sum(tf.cast(tf.greater(lastconv, 0), tf.float32), axis=2)
这个表达式在计算上是如何作为平均池化的?它与tf.reduce_mean
有什么不同?
我相信您能看出我对 reduce_max/min/mean/sum
如何处理输入张量,以及模型从这些函数中学到什么不太理解。
关于数据:数据的形状是 (24,4,15,2,87236),其中24是受试者,4是温度变化,15是试验次数,2×87236是连续的眼动数据(2是因为有x轴和y轴)。我使用的是留一法交叉验证,其中在22个受试者上训练,并在每个受试者上测试和验证。
在创建训练、验证和测试集后,输入到模型中的最终数据形状分别是 (22,60[4×15],2,87236) , (1,60,2,87236) 和 (1,60,2,87236)。
我希望我提供了足够的信息来帮助您理解我所面临的困境。提前感谢您的帮助。
回答:
reduce_max 会在整个维度上取最大值,例如,如果dim=1,它会将
[[1,2,3], [2,1,3], [1,4,0]]
简化为
[3,3,4]
而最大池化则是查看某个移动窗口中的最大值,例如请参见 https://computersciencewiki.org/index.php/Max-pooling_/_Pooling。这里的主要区别在于窗口的形状。对于 reduce_max,窗口是整个张量的一片,而对于最大池化,它是一个指定的矩形。这也导致了不同的维度(要真正理解这一点,您可以查看在 reduce_max 中使用 keepdims=True 时会发生什么)。
您用来替代平均池化层的表达式似乎不是取算术平均值,而是除以正元素的数量(而不是总的元素数量)。这可能是为什么您不能使用 reduce_mean 的原因。