Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在keras conv2d中指定过滤器_Python_Filter_Keras_Convolution_Keras Layer - Fatal编程技术网

Python 如何在keras conv2d中指定过滤器

Python 如何在keras conv2d中指定过滤器,python,filter,keras,convolution,keras-layer,Python,Filter,Keras,Convolution,Keras Layer,我试图在我的Keras模型中实现一个使用特定高斯滤波器的conv2D层。我有生成过滤器的代码,尽管现有的过滤器本身没有参数。相反,这里有一个过滤器参数,它是一个指定输出空间维度的整数,还有一个内核大小,它是一个指定内核维度的元组 我已经尝试使用Keras后端的东西来解决这个问题,因为conv2D函数允许您输入我想要的特定过滤器。问题是,我不知道如何将其恢复到我的模型中,所以我再次陷入困境。我也发现了类似于我的问题,比如建议写我自己的图层,但我真的不确定我将如何去做,如果有更简单的方法,我希望避免

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

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


一如既往,我们非常感谢您的帮助。

长答案短:

您根本不需要卷积层

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

  • 将高斯滤波器应用于图像

  • 使用展平()


  • 希望对您有所帮助。

    我刚刚发布了一个问题的答案,但在这里,它可能会作为如何在Keras中应用自定义过滤器的示例有所帮助。对于高斯分布的示例,使用adapted For 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])
    

    并且可以调整以添加更多可培训的层。

    您找到处理方法了吗?我有一个类似的用例。我需要在我的第一层CNN中使用高斯和高斯导数滤波器,并学习它们的一些线性组合。但我不知道如何在我的第一层中引入高斯。回溯(最后一次调用):model.add(Gausslayer)文件“/usr/local/lib/python3.8/dist-packages/tensorflow/python/training/tracking/base.py”中的第48行文件“gkern.py”,第517行,在(u-method)wrapper result=method(self,*args,**-kwargs)文件中“/usr/local/lib/python3.8/dist packages/tensorflow/python/keras/engine/sequential.py”,第208行,在add layer(x)文件中“/usr/local/lib/python3.8/dist packages/tensorflow/python/keras/engine/base_layer.py”,第946行,在调用返回self中,