首页 文章

Keras Conv2d拥有过滤器

提问于
浏览
2

可以设置为具有自己的过滤器的param过滤器阵列,而不是Conv2D中的过滤器数量

filters = [[[1,0,0],[1,0,0],[1,0,0]],
     [[1,0,0],[0,1,0],[0,0,1]],
     [[0,1,0],[0,1,0],[0,1,0]],
     [[0,0,1],[0,0,1],[0,0,1]]]
model = Sequential()
model.add(Conv2D(filters, (3, 3), activation='relu', input_shape=(3, 1024, 1024), data_format='channels_first'))

3 回答

  • -1

    您必须记住,Conv2D网络的目的是训练这些过滤器值 . 我的意思是,在使用形态滤波器的传统图像处理任务中,我们应该设计滤波器内核,然后在整个图像(卷积)中迭代它们 .

    在深度学习方法中,我们正在尝试执行相同的任务 . 但在这里我们假设我们不知道应该使用哪些过滤器,尽管我们确切地知道我们正在寻找什么(带标签的图像) . 当我们训练卷积神经网络时,我们向它展示我们想要的东西并要求它找出它自己的权重,即滤波器值 .

    因此,在这种情况下,我们应该定义我们想要训练的过滤器数量(在您的情况下,4个过滤器)以及它们将如何初始化 . 在训练网络时将设置它们的权重 .

    有许多方法可以初始化滤镜权重(例如,将它们全部设置为零或一个;或使用随机函数来保证它们可以捕获不同的图像特征) . Keras Conv2D函数默认使用'glorot uniform'算法,如https://keras.io/layers/convolutional/#conv2d中所述 .

    如果你真的想以你展示的方式初始化过滤器权重,你可以编写自己的函数(看看https://keras.io/initializers/)并通过kernel_initializer参数传递它:

    model.add(Conv2D(number_of_filters, (3, 3), activation='relu', input_shape=(3, 1024, 1024), kernel_initializer=your_function, data_format='channels_first'))
    
  • 0

    接受的答案是正确的,但对于一个完整的例子肯定会更有用,类似于this优秀张量流示例中提供的那个,显示了Conv2d的作用 .

    对于keras,这是,

    from keras.models import Sequential
    from keras.layers import Conv2D
    
    import numpy as np
    
    # Keras version of this example:
    # https://stackoverflow.com/questions/34619177/what-does-tf-nn-conv2d-do-in-tensorflow
    # Requires a custom kernel initialise to set to value from example
    # kernel = [[1,0,1],[2,1,0],[0,0,1]]
    # image = [[4,3,1,0],[2,1,0,1],[1,2,4,1],[3,1,0,2]]
    # output = [[14, 6],[6,12]] 
    
    #Set 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] = np.array([[1,0,1],[2,1,0],[0,0,1]])
        return kernel
    
    #Build Keras model
    model = Sequential()
    model.add(Conv2D(1, [3,3], kernel_initializer=kernel_init, 
                     input_shape=(4,4,1), padding="valid"))
    model.build()
    
    # To apply existing filter, we use predict with no training
    out = model.predict(image)
    print(out[0,:,:,0])
    

    哪个输出

    [[14, 6]
     [6, 12]]
    

    正如所料 .

  • 4

    由于 the purpose of the convolutional layer is to find the right filters for you 通过训练,在卷积层上使用自己的过滤器是没有意义的 .

    如果你发现自己处于这种情况,那么很可能是 you don't need a convolutional layer at all . 这就像试图手动驾驶自动驾驶汽车一样 .

    只需将您想要的任何滤镜应用于图像,然后使用 Flatten() 图层将图像提供给MLP .

相关问题