Keras 1d卷积层如何与单词嵌入一起工作 - 文本分类问题? (过滤器,内核大小和所有超参数)

问题描述 投票:1回答:1

我目前正在使用Keras开发一个文本分类工具。它工作正常(它工作正常,我的验证准确度达到了98.7)但我无法理解1D-convolution层与文本数据的关系。

我应该使用哪些超参数?

我有以下句子(输入数据):

  • 句子中的最大单词:951(如果它更少 - 添加了填充)
  • 词汇量:~32000
  • 句子数量(用于训练):9800
  • embedding_vecor_length:32(每个单词在单词嵌入中有多少关系)
  • batch_size:37(这个问题无关紧要)
  • 标签数量(类别):4

这是一个非常简单的模型(我已经制作了更复杂的结构,但奇怪的是它更好 - 即使不使用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'))

如果我有以下输入数据:

  • 最大字数:951
  • Word-embeddings维度:32

这是否意味着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个字,因此这些信息会丢失吗?

python tensorflow keras conv-neural-network word-embedding
1个回答
5
投票

我将尝试解释1D-Convolution如何应用于序列数据。我只是使用由单词组成的句子的例子,但显然它不是特定于文本数据,而是与其他序列数据和时间序列相同。

假设我们有一个由m单词组成的句子,其中每个单词都使用单词嵌入来表示:

Input data

现在我们想在这个数据上应用一个由n不同滤波器组成的1D卷积层,内核大小为k。为此,从数据中提取长度为k的滑动窗口,然后将每个过滤器应用于每个提取的窗口。下面是一个例子(这里我假设k=3并删除了每个过滤器的偏差参数以简化):

Filters

正如您在上图中所看到的,每个过滤器的响应等效于其点积的结果(即元素乘法,然后将所有结果相加)与长度为k的提取窗口(即i-th到(i+k-1)) - 给定句子中的单词)。此外,注意每个滤波器具有与训练样本的特征数(即,字嵌入维度)相同的信道数(因此可以执行点积)。基本上,每个过滤器在训练数据的本地窗口中检测模式的特定特征的存在(例如,在该窗口中是否存在几个特定单词)。在所有长度为k的窗口上应用了所有过滤器之后,我们将得到这样的输出,这是卷积的结果:

filters response

正如你所看到的,图中有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

© www.soinside.com 2019 - 2024. All rights reserved.