当前位置: 首页 > 知识库问答 >
问题:

Keras conv1d层参数:过滤器和kernel\u大小

阚乐湛
2023-03-14

我对keras的con1d层中的这两个参数感到非常困惑: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”与定义输入需求空间上滑动窗口的传统“过滤器”概念相关。但是con1d中的“过滤器”参数呢?它是做什么的?

例如,在以下代码片段中:

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个答案

幸经艺
2023-03-14

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

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}')
庄高谊
2023-03-14

您可以说,kernel\u size定义了滑动窗口的大小。

过滤器参数就是您将有多少个不同的窗口。(它们都具有相同的长度,即内核大小)。您想要产生多少不同的结果或渠道。

当您使用过滤器=100和内核大小=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个不同的过滤器,每个过滤器将沿长度方向滑动(逐字,4人一组),考虑到定义单词的所有通道。

输出形状如下:

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

过滤器的形状如下:

(4 = length, 300 = word vector dimension, 100 output dimension of the convolution)  
 类似资料:
  • 在方法调用时,你可以通过方法参数过滤器,对传入方法的参数进行过滤处理。 注解说明 @FilterArg 属性名称 说明 name 参数名 filter 过滤器callable 用法示例 简单使用: /* * @FilterArg(name="data", filter="json_decode") */ public function test($data) { var_dump($d

  • 3.7 ABP领域层 - 数据过滤器 3.7.1 简介 在数据库开发中,我们一般会运用逻辑删除模式,即不直接从数据库删除数据,而是标记这笔数据为已删除。因此,如果实体被逻辑删除了,那么它就应该不会在应用程序中被检索到。要达到这种效果,我们需要在每次检索实体的查询语句上添加SQL的Where条件IsDeleted = false。这是个乏味的工作,但它是个容易被忘掉的事情。因此,我们应该要有个自动的

  • 我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。

  • 下面的代码被修改为不包括我的数据库中的任何数据。 然后将其传递到initialize方法中,在该方法中进行表的实际填充。 顺便说一下,Users类如下所示: 该程序按预期工作,我可以看到与图像和VBox的详细信息的表格。 现在我想添加一个TextField来过滤表,过滤参数是标签中的文本。 我明白了,我需要将ObservableList放入FilteredList中,然后放入SortedList中

  • 我正在尝试反向代理我的网站并修改内容。为此,我使用sub_过滤器编译了nginx。它现在接受sub_filter指令,但不知何故它不起作用。 请帮帮我

  • 问题内容: 这是我的config.json: 这是我的bash命令: 输出: 因此$ PRJNAME是prj1,但是第一次调用仅输出。 有人能帮我吗? 问题答案: 您的示例中的jq程序实际上会尝试查找名为的键。请尝试以下操作: