Keras conv1d图层参数:filters和kernel_size

时间:2017-09-30 14:48:05

标签: keras convolution

我对来自keras的conv1d层中的这两个参数感到非常困惑: https://keras.io/layers/convolutional/#conv1d

文件说:

filters: Integer, the dimensionality of the output space (i.e. the number output of filters in the convolution).
kernel_size: An integer or tuple/list of a single integer, specifying the length of the 1D convolution window.

但这似乎与我在许多教程中看到的标准术语无关,例如https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks /和https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/

使用第二个使用Keras的教程链接,我想实际上'kernel_size'与传统的'filter'概念相关,后者定义了输入要素空间上的滑动窗口。但是conv1d中的'filter'参数怎么样?它有什么作用?

例如,在以下代码段中:

model.add(embedding_layer)
model.add(Dropout(0.2))
model.add(Conv1D(filters=100, kernel_size=4, padding='same', activation='relu'))

假设嵌入层输出一个维度为50的矩阵(行,每行是一个句子中的一个单词)x 300(列,单词向量维度),conv1d层如何转换该矩阵?

非常感谢

2 个答案:

答案 0 :(得分:26)

您说kernel_size定义滑动窗口的大小是正确的。

filters参数就是您将拥有多少个不同的窗口。 (所有这些都具有相同的长度,即kernel_size)。您想要生成多少个不同的结果或渠道。

当您使用filters=100kernel_size=4时,您将创建100个不同的过滤器,每个过滤器的长度为4.结果将带来100个不同的卷积。

此外,每个过滤器都有足够的参数来考虑所有输入通道。

Conv1D层需要这些尺寸:

(batchSize, length, channels)

我认为使用它的最佳方法是在长度维度中包含单词的数量(就好像顺序中的单词形成一个句子),并且通道是嵌入的输出维度(定义一个单词的数字) )。

所以:

batchSize = number of sentences    
length = number of words in each sentence   
channels = dimension of the embedding's output.    

卷积层将通过100个不同的过滤器,每个过滤器将沿着length维度(逐字逐行地,以4个为一组)滑动,考虑定义该词的所有通道。

输出形状为:

(number of sentences, 50 words, 100 output dimension or filters)   

过滤器的形状为:

(4 = length, 300 = word vector dimension, 100 output dimension of the convolution)  

答案 1 :(得分:0)

下面的解释代码可以帮助做到这一点。我去了类似的问题并自己回答了。

from tensorflow.keras.layers import MaxPool1D
import tensorflow.keras.backend as K
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Conv1D 
tf.set_random_seed(1)

batch,rows,cols = 3,8,3
input_shape = (batch,rows,cols)

np.set_random_seed = 132
data = np.random.randint(low=1,high=6,size=input_shape,dtype='int32')
data = np.float32(data)
data = tf.constant(data)

print("Data:")
print(K.eval(data))
print()
print(f'm,n,k:{input_shape}')
from tensorflow.keras.layers import Conv1D

#############################
# Understandin filters and kernel_size
##############################
num_filters=5
kernel_size= 3

'''
Few Notes about Kernel_size:
1. max_kernel_size == max_rows
2. since Conv1D, we are creating 1D Matrix of 1's with kernel_size 
if kernel_size = 1, [[1,1,1..]]
if kernel_size = 2, [[1,1,1..][1,1,1,..]]
if kernel_size = 3, [[1,1,1..][1,1,1,..]]

I have chosen tf.keras.initializers.constant(1) to create a matrix of Ones.
Size of matrix is Kernel_Size

'''
y= Conv1D(filters=num_filters,kernel_size=kernel_size,
          kernel_initializer=tf.keras.initializers.constant(1), 
 #glorot_uniform(seed=12)
          input_shape=(k,n)
         )(data)
#########################
# Checking the out outcome
#########################
print(K.eval(y))
print(f' Resulting output_shape == (batch_size, num_rows-kernel_size+1,num_filters): {y.shape}')

# # Verification
K.eval(tf.math.reduce_sum(data,axis=(2,1), # Sum along axis=2, and then along 
 axis=1,keep_dims=True)



###########################################
# Understanding MaxPool and Strides in 
##########################################
pool = MaxPool1D(pool_size=3,strides=3)(y)
print(K.eval(pool))
print(f'Shape of Pool: {pool.shape}')