如何在基于 Keras 的 CNN 中包含自定义过滤器?

Ran*_*Das 3 python backpropagation gradient-descent conv-neural-network keras

我正在研究用于 CNN 的模糊卷积滤波器。我已经准备好了函数 - 它接受 2D 输入矩阵和 2D 核/权重矩阵。该函数输出卷积特征或激活图。

现在,我想使用 Keras 构建 CNN 的其余部分,这些 CNN 也将具有标准的 2D 卷积滤波器。

有什么方法可以将我的自定义过滤器插入到 Keras 模型中,使内核矩阵由 Keras 后端的内置库更新?或者,是否有任何库可用于在每次迭代时更新内核?

Uzz*_*der 11

假设我们想在应用3x3 自定义过滤器上的6x6 图像

在此处输入图片说明


必要的进口

import keras.backend as K
import numpy as np
from keras import Input, layers
from keras.models import Model
Run Code Online (Sandbox Code Playgroud)

自定义过滤器定义

在此处输入图片说明

# 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')
Run Code Online (Sandbox Code Playgroud)

虚拟示例输入图像(它是1通道图像。所以维度将是6x6x1。这里,像素值是随机整数。通常像素值应该是0 to 2550.0 to 1.0。)

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] ]
])

# we need to give the batch size. 
# here we will just add a dimension at the beginning which makes batch size=1
input_mat = input_mat.reshape((1, 6, 6, 1))
Run Code Online (Sandbox Code Playgroud)

我们将使用自定义过滤器的虚拟转换模型

def build_model():
    input_tensor = Input(shape=(6,6,1))

    x = layers.Conv2D(filters=1, 
                      kernel_size = 3,
                      kernel_initializer=my_filter,
                      strides=2, 
                      padding='valid') (input_tensor)

    model = Model(inputs=input_tensor, outputs=x)
    return model
Run Code Online (Sandbox Code Playgroud)

测试

model = build_model()
out = model.predict(input_mat)
print(out)
Run Code Online (Sandbox Code Playgroud)

输出

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

  [[-5.]
   [ 3.]]]]
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,自定义过滤器是**可训练的**。但如果你使用“layers.Conv2D(..., kernel_initializer=my_filter, trainable=False)”,那么它将被**冻结**。因此,您可以根据需要将其设置为可训练或不可训练。 (3认同)

zim*_*rol 0

您可以编写自己的图层类。您可以在这里找到有关它的良好文档。Conv2D 此外,您可以从使用类的代码开始。现在,您只需更改内核最初创建的方式即可。这样,您的过滤器将根据反向传播进行更新。如果您不希望更改自定义过滤器,则必须创建一个新变量(仅包含您的过滤器),使用计算卷积K.conv(...)并将此结果与通常的输出连接起来。