【问题标题】:Keras conv1d layer parameters: filters and kernel_sizeKeras conv1d 层参数:filters 和 kernel_size
【发布时间】:2017-09-30 14:48:04
【问题描述】:

我对 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”与定义输入特征空间上的滑动窗口的传统“过滤器”概念相关。但是 conv1d 中的 'filter' 参数呢?它有什么作用?

例如在下面的代码sn-p中:

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 层如何转换该矩阵?

非常感谢

【问题讨论】:

    标签: keras convolution


    【解决方案1】:

    你说得对,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)  
    

    【讨论】:

    • 过滤器是如何定位的?假设我们有一个向量 [0..99],kernel_size=10,filters=3。据我了解,过滤器会相互重叠,所以它们会像 [0..9]、[1..10]、[2..11],而我们刚刚用完了过滤器,只覆盖了向量中的 12 个第一个值。我猜对了吗?
    • 不,您描述了单个过滤器执行的顺序操作。相同的过滤器沿整个向量传播。过滤器 1 将变为 [0..9]、[1..10]、[2..11] ... 直到 [90..99]。位于过滤器 1 旁边的过滤器 2 也将变为 [0..9]、[1..10]、[2..11] ... 直到 [90..99]。并且过滤器 3,也在其他过滤器旁边,将遵循相同的路径。
    • 对,第一层输出 100 个“通道”。但第二个输出只有 50 个通道。碰巧第二层的过滤器不仅会从一个通道中提取 3 个元素,而且会从所有 100 个通道中提取 3 个元素,并且一次使用 300 个元素进行卷积的每个步骤。
    • @DanielMöller 过滤器是随机初始化的吗?如果我的理解是正确的,那么在每次迭代之后,过滤器的值都会改变,以更能代表过滤器需要过滤掉的内容。问题是在 X 次迭代之后(模型已经收敛,训练完成),给定输出的大多数过滤器是否相同?如果是这样,拥有大量过滤器有什么好处?
    • @Gevo12321,是的,过滤器是随机初始化的。因此,每个过滤器都遵循不同的演变。不,过滤器不会产生相同的结果。考虑到所有其他层,直到最后,它们往往会获得最佳结果。它们形成了代表复杂事物的巨大可能性组合。单个过滤器无法单独做到这一点。
    【解决方案2】:

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

    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}')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多