如何在Keras中向Conv2D图层添加自定义“过滤器”

时间:2018-12-27 07:01:00

标签: keras

我的研究项目要求我向Keras的Conv2D层添加一些自定义“过滤器”(除了Conv2D自己训练的过滤器)。我该如何实现?我可以通过构建任何“自定义层”来实现吗?如果是,有人可以指出我可以帮助我实现这一目标的资源吗?

我尝试理解github中的Conv2D代码,但无法理解它在哪里以及如何处理过滤器。

我期望找到一种方法来将我的自定义滤镜添加为.. [[1 0 0] [0 1 0] [0 0 1]]到conv2d图层,以便在预测期间它将图像与滤镜卷积我提供的。

1 个答案:

答案 0 :(得分:0)

在喀拉拉邦,这很简单。

让我们举个例子。假设我们要将自定义过滤器应用于输入矩阵(图像)-

enter image description here

必要的导入

import keras.backend as K
import numpy as np
from keras import Input, layers
from keras.models import Model

自定义过滤器的定义

enter image description here

# custom filter
def my_filter(shape, dtype=None):

    f = np.array([
            [[[1]], [[0]], [[-1]]],
            [[[1]], [[0]], [[-1]]],
            [[[1]], [[0]], [[-1]]]
        ])
    assert f.shape == shape
    return K.variable(f, dtype='float32')

虚拟示例输入图像(1个频道)

input_mat = np.array([
    [ [4], [9], [2], [5], [8], [3] ],
    [ [3], [6], [2], [4], [0], [3] ],
    [ [2], [4], [5], [4], [5], [2] ],
    [ [5], [6], [5], [4], [7], [8] ],
    [ [5], [7], [7], [9], [2], [1] ],
    [ [5], [8], [5], [3], [8], [4] ]
])
input_mat = input_mat.reshape((1, 6, 6, 1))

虚拟转化模型,我们将在其中使用自定义过滤器

def build_model():
    input_tensor = Input(shape=(6,6,1))
    x = layers.Conv2D(1, kernel_size = 3,
                      kernel_initializer=my_filter,
                      strides=2, padding='valid') (input_tensor)
    model = Model(inputs=input_tensor, outputs=x)
    return model

测试

model = build_model()
out = model.predict(input_mat)
print(out)

输出

[[[[ 0.]
   [-4.]]

  [[-5.]
   [ 3.]]]]