我不知道如何将 PyTorch 方法
adaptive_avg_pool2d
转换为 Keras 或 TensorFlow。有人可以帮忙吗?
PyTorch 方法是
adaptive_avg_pool2d(14,[14])
我尝试使用平均池化,在 Keras 中重塑张量,但收到错误:
ValueError:新数组的总大小必须保持不变
我不确定我是否理解你的问题,但在 PyTorch 中,你将空间维度传递给
AdaptiveAvgPool2d
。例如,如果您想要输出大小为 5x7,则可以使用 nn.AdaptiveAvgPool2d((5,7))
。
如果你想要一个全局平均池化层,你可以使用
nn.AdaptiveAvgPool2d(1)
。在 Keras 中,您只需使用 GlobalAveragePooling2D
。
AveragePooling2D
,但不能直接指定输出形状。您需要根据您想要的输出形状来计算/定义 pool_size
、stride
和 padding
参数。如果您需要计算方面的帮助,请查看CS231n 课程的此页面。
我没有完整的 2D 池化解决方案,但这是一个简单的 1D 池化解决方案,应该与获取 2D 版本非常相似:
import numpy as np
import tensorflow as tf
class MyAdaptiveAvgPooling1D(tf.keras.Model):
def __init__(self, target_dim):
super().__init__()
self.target_dim = target_dim
self.avg_pool_1d = None
def build_adaptive_avg_pooling_layer(self, features):
strides = features.shape[1]//self.target_dim
self.avg_pool_1d = tf.keras.layers.AveragePooling1D(
pool_size = strides,
strides = strides,
padding = "valid"
)
def __call__(self, features):
if self.avg_pool_1d is None:
self.build_adaptive_avg_pooling_layer(features)
features = self.avg_pool_1d(features)
return features
dumb_input = np.random.random((32, 100, 1)) # [bs, dim, channel]
adaptive_avg_pool_1d = MyAdaptiveAvgPooling1D(target_dim = 7)
result = adaptive_avg_pool_1d(dumb_input).numpy()
print(result.shape)
然后你应该得到形状为 [32, 7, 1] 的输出。您可能还想处理 pool_size 和 padding 类型以适合您的工作。请注意,如果您想让输出维度大于输入维度(逆转换),我的示例代码将无法工作。