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

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

作者:互联网

我目前正在使用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

如果过滤器= 32,层重复32次?我对么?
所以我不会在句子中说出第156个字,因此这些信息会丢失吗?

解决方法:

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

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

Input data

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

Filters

正如您在上图中所看到的,每个过滤器的响应等效于其点积的结果(即元素乘法,然后将所有结果相加)与提取的长度为k的窗口(即第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而不是mk 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
_________________________________________________________________

如您所见,卷积层的输出形状为(mk 1,n)=(18,32),卷积层中的参数数(即滤波器权重)等于:num_filters *(kernel_size * n_features) one_bias_per_filter = n *(k * emb_dim)n = 32 *(3 * 100)32 = 9632.

标签:word-embedding,python,tensorflow,keras,conv-neural-network
来源: https://codeday.me/bug/20190927/1822869.html