Keras Conv2d 自己的过滤器

Mik*_*keG 5 python keras tensorflow

可以使用自己的过滤器而不是 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'))
Run Code Online (Sandbox Code Playgroud)

tbn*_*ira 8

您必须记住,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'))
Run Code Online (Sandbox Code Playgroud)


Ed *_*ith 8

接受的答案是正确的,但如果有一个完整的示例,它肯定会更有用,类似于这个展示 Conv2d 功能的优秀 tensorflow 示例中提供的示例。

对于 keras,这是,

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

import numpy as np

# Keras version of this example:
# /sf/ask/2423342421/
# 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])
Run Code Online (Sandbox Code Playgroud)

哪个输出

[[14, 6]
 [6, 12]]
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。