在Keras中创建类似的头部

在Keras中创建类似的头部,keras,keras-layer,tf.keras,fast-ai,Keras,Keras Layer,Tf.keras,Fast Ai,当我使用转移学习在快速人工智能中创建CNN时,会创建这样的头部: (1): Sequential( (0): AdaptiveConcatPool2d( (ap): AdaptiveAvgPool2d(output_size=1) (mp): AdaptiveMaxPool2d(output_size=1) ) (1): Flatten() (2): BatchNorm1d(3840, eps=1e-05, momentum=0.1, af

当我使用转移学习在快速人工智能中创建CNN时,会创建这样的头部:

(1): Sequential(
    (0): AdaptiveConcatPool2d(
      (ap): AdaptiveAvgPool2d(output_size=1)
      (mp): AdaptiveMaxPool2d(output_size=1)
    )
    (1): Flatten()
    (2): BatchNorm1d(3840, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout(p=0.05005, inplace=False)
    (4): Linear(in_features=3840, out_features=512, bias=True)
    (5): ReLU(inplace=True)
    (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout(p=0.1001, inplace=False)
    (8): Linear(in_features=512, out_features=3, bias=True)
我想在Keras中创建一个尽可能接近这个的,但是我仍然停留在AdaptiveCatPool2D部分。目前似乎没有这样的类可用。关于如何在Keras中尽可能地复制这一点,您有什么想法吗?

您可以在tf.Keras中编写自己的AdaptiveCatPool2D。组成AdaptiveConcatPool2d的AdaptiveAveragePoolG2D和AdaptiveMaxPoolG2D层在中可用,这些层的输出必须连接起来。另请参阅。请注意,FastAI所基于的PyTorch使用通道_-first数据格式

必须安装TensorFlow插件:python-m pip install-no cache dir TensorFlow插件

测验
import tensorflow as tf
import tensorflow_addons as tfa

tfkl = tf.keras.layers

class AdaptiveConcatPool2D(tfkl.Layer):

    def __init__(self, output_size=None, data_format="channels_last"):
        super().__init__()
        self.output_size = output_size or 1
        self.data_format = data_format
        self.avg_layer = tfa.layers.AdaptiveAveragePooling2D(self.output_size, data_format=self.data_format)
        self.max_layer = tfa.layers.AdaptiveMaxPooling2D(self.output_size, data_format=self.data_format)

    def call(self, x):
        # See https://github.com/fastai/fastai/blob/23695330a9b8fe173b16013362047ca635e92ea4/fastai2/layers.py#L112-L118
        if self.data_format == "channels_last":
            return tfkl.Concatenate(axis=-1)([self.max_layer(x), self.avg_layer(x)])
        elif self.data_format == "channels_first":
            return tfkl.Concatenate(axis=1)([self.max_layer(x), self.avg_layer(x)])
import fastai.layers
import numpy as np
import torch

a = np.random.uniform(size=[2, 3, 16, 16]).astype(np.float32)

for output_size in [1, 2, 4, 8]:
    out_tf = AdaptiveConcatPool2D(output_size, data_format="channels_first")(a)
    out_fastai = fastai.layers.AdaptiveConcatPool2d(output_size)(torch.from_numpy(a))
    assert np.allclose(out_tf.numpy(), out_fastai.numpy())