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

Эду*_*нко 8 python conv-neural-network keras tensorflow word-embedding

我目前正在使用Keras开发文本分类工具。它可以工作(工作正常,并且我的验证精度达到98.7),但是我无法确定一维卷积层如何与文本数据一起工作。

我应该使用哪些超参数?

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

  • 句子中的最大单词数: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())
Run Code Online (Sandbox Code Playgroud)

我的主要问题是:Conv1D层应使用哪些超参数?

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
Run Code Online (Sandbox Code Playgroud)

如果我有以下输入数据:

  • 字数上限:951
  • 文字嵌入尺寸:32

这是否意味着filters=32只会扫描前32个单词,而完全扫描其余的单词(kernel_size=2)?我应该将过滤器设置为951(句子中最多单词数)吗?

图片示例:

例如,这是一个输入数据: http //joxi.ru/krDGDBBiEByPJA

这是卷积层的第一步(步骤2): http

这是第二步(步骤2): http //joxi.ru/brRG699iJ3Ra1m

如果filters = 32,层重复32次?我对么?因此,我不会在句子中说第156个单词,因此这些信息会丢失吗?

tod*_*day 12

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

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

输入数据

现在,我们想在此数据上应用一维卷积层,该卷积层由n内核大小为的不同过滤器组成k。为此,k从数据中提取长度滑动的窗口,然后将每个过滤器应用于每个提取的窗口。这是发生情况的说明(k=3为简单起见,这里我假设并删除了每个滤波器的bias参数):

筛选器

如上图所示,每个滤波器的响应等于其点积(即按元素相乘,然后将所有结果相加)的结果与所提取的长度窗口k(即i第-至(i+k-1)-th个字)在给定的句子中)。此外,请注意,每个滤波器都具有与训练样本的特征数量(即词嵌入维)相同的通道数(因此可以执行点积)。本质上,每个过滤器都在检测局部训练数据窗口中是否(例如,该窗口中是否存在几个特定单词)。将所有过滤器应用于所有长度的窗口之后模式中某个特定特征的存在,k我们将得到类似卷积的结果:

筛选器回应

如您所见,m-k+1图中已经存在窗口,因为我们假定了padding='valid'and stride=1Conv1DKeras 中layer的默认行为)。该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()
Run Code Online (Sandbox Code Playgroud)

型号摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_2 (Conv1D)            (None, 18, 32)            9632      
=================================================================
Total params: 9,632
Trainable params: 9,632
Non-trainable params: 0
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

如您所见,卷积层的输出形状为,(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