我正在研究CNN的模糊卷积滤波器。我已经准备好函数-它接受2D输入矩阵和2D内核/权重矩阵。函数输出卷积特征或激活图。
现在,我想使用Keras来构建CNN的其余部分,它们还将具有标准的2D卷积滤镜。
是否可以通过Keras后端的内置库更新内核矩阵的方式将自定义过滤器插入Keras模型?另外,是否有任何库可用于每次迭代更新内核?
答案 0 :(得分:1)
您可以编写自己的图层类。您可以找到有关here的良好文档。此外,您可以使用Conv2D
class的代码开始。现在,您只需要更改最初创建内核的方式即可。这样,您的过滤器将根据反向传播进行更新。如果您不希望更改自定义过滤器,则必须创建一个新变量(仅包含过滤器),使用K.conv(...)
计算卷积,然后将结果与常规输出连接起来。
答案 1 :(得分: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
。这里,像素值是随机整数。通常,像素值应为{{ 1}}或0 to 255
。)
0.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))
测试
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)