繁体   English   中英

如何在keras conv2d中指定过滤器

[英]How to specify filter in keras conv2d

我试图在我的 Keras 模型中实现一个使用特定高斯滤波器的 conv2D 层。 我有制作过滤器的代码,尽管现有的Keras Conv2D没有过滤器本身的参数。 相反,有一个filters参数,它是一个指定输出空间维度的整数,以及kernel_size ,它是一个指定内核维度的元组。

我尝试使用 Keras 后端的东西来解决这个问题,因为这里的 conv2D 函数允许您按照我的意愿输入特定的过滤器。 问题是我不知道如何将它恢复到我的模型中,所以我又被卡住了。 我还发现了与我类似的问题,比如这个建议编写我自己的层,但我不确定我将如何去做,如果有更简单的方法,我希望避免它。

与往常一样,非常感谢任何帮助。

长回答短:

你根本不需要卷积层

卷积层的目的是为您找到合适的过滤器 正如您已经知道要使用哪个过滤器,您可以愉快地跳过整个卷积内容并直接跳转到完全连接的层。

  1. 将高斯过滤器应用于您的图像。

  2. 使用Flatten()层将图像直接提供给 MLP。

希望这有帮助。

我刚刚发布了链接问题的答案,但作为如何在 Keras 中应用自定义过滤器的示例,这里可能很有用。 对于您的高斯示例,请使用适用于 2D 来获取过滤器,

import numpy as np
import scipy.stats as st

def gkern(kernlen=[21,21], nsig=[3, 3]):
    """Returns a 2D Gaussian kernel array."""

    assert len(nsig) == 2
    assert len(kernlen) == 2
    kern1d = []
    for i in range(2):
        interval = (2*nsig[i]+1.)/(kernlen[i])
        x = np.linspace(-nsig[i]-interval/2., nsig[i]+interval/2., kernlen[i]+1)
        kern1d.append(np.diff(st.norm.cdf(x)))

    kernel_raw = np.sqrt(np.outer(kern1d[0], kern1d[1]))
    kernel = kernel_raw/kernel_raw.sum()
    return kernel

import matplotlib.pyplot as plt
plt.imshow(gkern([7,7]), interpolation='none')
plt.show()

然后,您可以将其设置为初始过滤器并冻结该层,使其不再训练,看起来像这样,

from keras.models import Sequential
from keras.layers import Conv2D

#Set Some Image
image = [[4,3,1,0],[2,1,0,1],[1,2,4,1],[3,1,0,2]]

# Pad to "channels_last" format 
# which is [batch, width, height, channels]=[1,4,4,1]
image = np.expand_dims(np.expand_dims(np.array(image),2),0)

#Initialise to set kernel to required value
def kernel_init(shape):
    kernel = np.zeros(shape)
    kernel[:,:,0,0] = gkern([shape[0], shape[1]])
    return kernel 

#Build Keras model
model = Sequential()
#We would freeze training of the layers if we
# wanted to keep a Gaussian filter
Gausslayer = Conv2D(1, [3,3], kernel_initializer=kernel_init, 
                    input_shape=(4,4,1), padding="valid")
Gausslayer.trainable = False
model.add(Gausslayer)
#Add some more layers here
#model.add(Conv2D(...)
model.build()

# To apply existing filter, we use predict with no training
out = model.predict(image)
print(out[0,:,:,0])

并且可以适应添加更多可训练的层。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM