Keras 1d卷积层如何处理单词嵌入文本分类问题?(过滤器、内核大小和所有超参数)

2024-05-29 11:24:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个使用Keras的文本分类工具。它可以工作(它工作得很好,我的验证精度达到了98.7),但我无法完全理解1D卷积层是如何处理文本数据的。在

我应该使用什么超参数?在

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

  • 句子中最多单词数:951(如果少-则加上填充)
  • 词汇量:~32000
  • 句子量(训练用):9800
  • 嵌入向量长度:32(每个单词在单词嵌入中有多少关系)
  • 批次大小: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层使用哪些超参数?在

^{pr2}$

如果我有以下输入数据:

  • 字数:最多951个
  • 单词嵌入维度:32

这是否意味着filters=32将只扫描前32个单词而完全丢弃其余的单词(使用kernel_size=2)?我应该把过滤器设置为951(句子中的最大字数)?在

图像示例:

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

这是卷积层(步骤2)的第一步:http://joxi.ru/Y2LB099C9dWkOr

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

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


Tags: 数据文本addhttp参数sizemodelru
1条回答
网友
1楼 · 发布于 2024-05-29 11:24:47

我将尝试解释一维卷积是如何应用于序列数据的。我只举了一个由单词组成的句子的例子,但很明显它并不是特定于文本数据的,它与其他序列数据和时间序列是一样的。在

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

Input data

我们现在要用一个不同的cd2}层的卷积来处理。为此,从数据中提取长度为k的滑动窗口,然后对每个提取的窗口应用每个过滤器。以下是所发生情况的说明(为了简单起见,我假设k=3,并删除了每个过滤器的bias参数):

Filters

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

filters response

如您所见,图中有m-k+1窗口,因为我们假设padding='valid'和{}(Keras中^{}层的默认行为)。stride参数决定窗口应该滑动多少(即移位)来提取下一个窗口(例如,在上面的例子中,步长为2将提取单词窗口:(1,2,3), (3,4,5), (5,6,7), ...)。在这个例子中{e}和示例{cdi}的开头应该有相同的{e}和{cdi}完全相同的长度,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()

模型摘要:

^{2}$

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

相关问题 更多 >

    热门问题