我目前正在使用Keras开发一个文本分类工具。它工作正常(它工作正常,我的验证准确度达到了98.7)但我无法理解1D-convolution层与文本数据的关系。
我应该使用哪些超参数?
我有以下句子(输入数据):
这是一个非常简单的模型(我已经制作了更复杂的结构,但奇怪的是它更好 - 即使不使用LSTM):
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
我的主要问题是:我应该为Conv1D层使用哪些超参数?
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
如果我有以下输入数据:
这是否意味着filters=32
只扫描前32个单词完全丢弃其余的单词(使用kernel_size=2
)?我应该将过滤器设置为951(句子中的最大单词数量)?
图片示例:
例如,这是一个输入数据:http://joxi.ru/krDGDBBiEByPJA
这是一个层流层的第一步(步骤2):http://joxi.ru/Y2LB099C9dWkOr
这是第二步(步骤2):http://joxi.ru/brRG699iJ3Ra1m
如果filters = 32
,层重复32次?我对么?所以我不会在句子中说出第156个字,因此这些信息会丢失吗?
我将尝试解释1D-Convolution如何应用于序列数据。我只是使用由单词组成的句子的例子,但显然它不是特定于文本数据,而是与其他序列数据和时间序列相同。
假设我们有一个由m
单词组成的句子,其中每个单词都使用单词嵌入来表示:
现在我们想在这个数据上应用一个由n
不同滤波器组成的1D卷积层,内核大小为k
。为此,从数据中提取长度为k
的滑动窗口,然后将每个过滤器应用于每个提取的窗口。下面是一个例子(这里我假设k=3
并删除了每个过滤器的偏差参数以简化):
正如您在上图中所看到的,每个过滤器的响应等效于其点积的结果(即元素乘法,然后将所有结果相加)与长度为k
的提取窗口(即i
-th到(i+k-1)
) - 给定句子中的单词)。此外,注意每个滤波器具有与训练样本的特征数(即,字嵌入维度)相同的信道数(因此可以执行点积)。基本上,每个过滤器在训练数据的本地窗口中检测模式的特定特征的存在(例如,在该窗口中是否存在几个特定单词)。在所有长度为k
的窗口上应用了所有过滤器之后,我们将得到这样的输出,这是卷积的结果:
正如你所看到的,图中有m-k+1
窗口,因为我们假设padding='valid'
和stride=1
(Keras中Conv1D
层的默认行为)。 stride
参数确定窗口应该滑动多少(即移位)以提取下一个窗口(例如,在上面的示例中,2的步幅将提取单词的窗口:(1,2,3), (3,4,5), (5,6,7), ...
)。 padding
参数确定窗口是否应完全由训练样本中的单词组成,或者在开头和结尾应该有填充;这样,卷积响应可以具有与训练样本相同的长度(即m
而不是m-k+1
)(例如,在上面的示例中,padding='same'
将提取单词的窗口:(PAD,1,2), (1,2,3), (2,3,4), ..., (m-2,m-1,m), (m-1,m, PAD)
)。
您可以使用Keras验证我提到的一些事情:
from keras import models
from keras import layers
n = 32 # number of filters
m = 20 # number of words in a sentence
k = 3 # kernel size of filters
emb_dim = 100 # embedding dimension
model = models.Sequential()
model.add(layers.Conv1D(n, k, input_shape=(m, emb_dim)))
model.summary()
型号摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_2 (Conv1D) (None, 18, 32) 9632
=================================================================
Total params: 9,632
Trainable params: 9,632
Non-trainable params: 0
_________________________________________________________________
如您所见,卷积层的输出具有(m-k+1,n) = (18, 32)
的形状,并且卷积层中的参数(即滤波器权重)的数量等于:num_filters * (kernel_size * n_features) + one_bias_per_filter = n * (k * emb_dim) + n = 32 * (3 * 100) + 32 = 9632
。