如何将pytorch的adaptive_avg_pool2d方法转换为keras或tensorflow

问题描述 投票:0回答:2

我不知道如何将 PyTorch 方法

adaptive_avg_pool2d
转换为 Keras 或 TensorFlow。有人可以帮忙吗? PyTorch 方法是

adaptive_avg_pool2d(14,[14])

我尝试使用平均池化,在 Keras 中重塑张量,但收到错误:

ValueError:新数组的总大小必须保持不变

tensorflow keras deep-learning pytorch spatial-pooling
2个回答
1
投票

我不确定我是否理解你的问题,但在 PyTorch 中,你将空间维度传递给

AdaptiveAvgPool2d
。例如,如果您想要输出大小为 5x7,则可以使用
nn.AdaptiveAvgPool2d((5,7))

如果你想要一个全局平均池化层,你可以使用

nn.AdaptiveAvgPool2d(1)
。在 Keras 中,您只需使用
GlobalAveragePooling2D

对于Keras中的其他输出尺寸,需要使用

AveragePooling2D
,但不能直接指定输出形状。您需要根据您想要的输出形状来计算/定义
pool_size
stride
padding
参数。如果您需要计算方面的帮助,请查看CS231n 课程的此页面


0
投票

我没有完整的 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 类型以适合您的工作。请注意,如果您想让输出维度大于输入维度(逆转换),我的示例代码将无法工作。

© www.soinside.com 2019 - 2024. All rights reserved.