如何在keras conv2d中指定过滤器

2024-04-23 14:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经尝试使用Keras后端来解决这个问题,因为conv2D函数here允许您输入我想要的特定过滤器。问题是,我不知道如何把这个恢复到我的模型中,所以再一次,我被卡住了。我也发现了类似于我的问题,比如this一个建议编写我自己的层的问题,但我不确定我将如何去做,并希望能避免它,如果有一个更简单的方法。在

一如既往,任何帮助都是非常感谢的。在


Tags: 代码模型过滤器参数size空间整数kernel
2条回答

长话短说:你根本不需要一个卷积层。卷积层的目的是为您找到合适的滤波器。正如您已经知道要使用哪个过滤器,您可以愉快地跳过所有卷积的内容,直接跳到完全连接的层。 将高斯滤波器应用于图像。然后使用flant()层将图像直接送入MLP。在

不要试图在购物车上添加备用轮。在

希望这能有所帮助。在

我刚刚发布了对linked问题的答案,但作为如何在Keras中应用自定义过滤器的示例,它可能会很有用。对于高斯函数的例子,使用适合2D的this来获得滤波器

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

你可以把它设为初始过滤器,然后冻结这个层,这样它就不再训练了,看起来像这样

^{pr2}$

并能适应增加更多可训练的层次。在

相关问题 更多 >