如何创建 Keras 层来执行 4D 卷积 (Conv4D)?

fej*_*kso 7 convolution conv-neural-network keras tensorflow

看起来tf.nn.convolution应该能够进行 4D 卷积,但是我还没有能够成功创建一个 Keras 层来使用这个函数。

我尝试过使用 KerasLambda层来包装该tf.nn.convolution函数,但也许其他人有更好的主意?

我想利用数据的高维结构,因此重塑可能无法捕获数据集的性质。

Dan*_*ler 8

超级酷的问题。

这需要一个自定义层(具有可训练的参数)。
以下接受任意数量的维度,您可以通过 进行控制kernel_size

class Conv(Layer):
    def __init__(self, filters, kernel_size, padding='VALID', **kwargs):
        self.filters = filters
        self.kernel_size = kernel_size #must be a tuple!!!!
        self.padding=padding

        super(Conv, self).__init__(**kwargs)

    #using channels last!!!
    def build(self, input_shape):
        spatialDims = len(self.kernel_size)
        allDims = len(input_shape)
        assert allDims == spatialDims + 2 #spatial dimensions + batch size + channels

        kernelShape = self.kernel_size + (input_shape[-1], self.filters)
            #(spatial1, spatial2,...., spatialN, input_channels, output_channels)

        biasShape = tuple(1 for _ in range(allDims-1)) + (self.filters,)


        self.kernel = self.add_weight(name='kernel', 
                                      shape=kernelShape
                                      initializer='uniform',
                                      trainable=True)
        self.bias = self.add_weight(name='bias', 
                                    shape = biasShape, 
                                    initializer='zeros',
                                    trainable=True)
        self.built = True

    def call(self, inputs):
        results = tf.nn.convolution(inputs, self.kernel, padding=self.padding)
        return results + self.bias

    def compute_output_shape(self, input_shape)
        sizes = input_shape[1:-1]

        if self.padding='VALID' or self.padding='valid':
            sizes = [s - kSize + 1 for s, kSize in zip(sizes, self.kernel_size)]

        return input_shape[:1] + sizes + (self.filters,)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,它不适用于 TF 2.3,其中 tf.nn.convolution 仅处理 Conv1D、Conv2D 或 Conv3D。(`num_spatial_dims (input.shape.ndims - num_batch_dims - 1) 必须是 1、2 或 3 之一`) (3认同)

小智 6

你是对的,目前对 Tensorflow Conv4D 的支持不多。我编写了这个存储库(https://github.com/Vincentx15/Conv4D)来解决这个问题,并包括灵活的跨步和填充。

它添加了对 Sonnet 的轻量级依赖以使用高级填充,但这应该无缝地融入张量流代码中。

最好的 :)


归档时间:

查看次数:

2766 次

最近记录:

4 年 前