【问题标题】:How to include a custom filter in a Keras based CNN?如何在基于 Keras 的 CNN 中包含自定义过滤器?
【发布时间】:2019-01-26 13:23:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: python keras conv-neural-network backpropagation gradient-descent


    【解决方案1】:

    假设我们要将3x3 自定义过滤器应用于6x6 图像


    必要的导入

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

    自定义过滤器的定义

    # 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 通道图像。所以维度将是6x6x1。这里,像素值是随机整数。通常像素值应该是0 to 255 或@987654333 @.)

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

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

    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
    

    测试

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

    输出

    [[[[ 0.]
       [-4.]]
    
      [[-5.]
       [ 3.]]]]
    

    【讨论】:

    • 谢谢。但是我想知道在训练一个在一层中包含此过滤器的网络时,这是否会保持“冻结”状态。例如,一个卷积层具有固定的滤波器(因此无需学习权重),然后其余层需要学习系数。这个例子在这种情况下有效吗?
    • 默认情况下自定义过滤器将是可训练的。但是如果你使用layers.Conv2D(..., kernel_initializer=my_filter, trainable=False),那么它将被冻结。因此,您可以根据需要使其可训练或不可训练。
    • 这里是一个例子 - colab.research.google.com/drive/…
    • 如何定义各种各样的过滤器?所以通常很多过滤器及其组合都可以在 conv2d 中定义,对吧?
    【解决方案2】:

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

    【讨论】:

    • 你能举个小例子吗(“如果你不想改变你的自定义过滤器,你必须创建一个新变量(它只包含你的过滤器),使用K.conv计算卷积( ...)并将这个结果与通常的输出连接起来。”),请使用 sin 和 cos 作为旋转过滤器,好吗?这不需要任何更新,并有助于巩固这一想法。谢谢。
    • @Moondra 你知道了吗?
    • @enjal 不,我实际上正在再次寻找答案。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多