我目前正在开发一个使用Keras的文本分类工具。它可以工作(它工作得很好,我的验证精度达到了98.7),但我无法完全理解1D卷积层是如何处理文本数据的。在
我应该使用什么超参数?在
我有以下句子(输入数据):
这是一个非常简单的模型(我制作了更复杂的结构,但奇怪的是,它工作得更好——即使不使用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}$如果我有以下输入数据:
这是否意味着filters=32
将只扫描前32个单词而完全丢弃其余的单词(使用kernel_size=2
)?我应该把过滤器设置为951(句子中的最大字数)?在
图像示例:
例如,这是一个输入数据:http://joxi.ru/krDGDBBiEByPJA
这是卷积层(步骤2)的第一步:http://joxi.ru/Y2LB099C9dWkOr
这是第二步(第二步):http://joxi.ru/brRG699iJ3Ra1m
如果filters = 32
,层会重复32次吗?我说的对吗?
所以我不能说出句子中的第156个单词,所以这些信息会丢失吗?在
我将尝试解释一维卷积是如何应用于序列数据的。我只举了一个由单词组成的句子的例子,但很明显它并不是特定于文本数据的,它与其他序列数据和时间序列是一样的。在
假设我们有一个由
m
个单词组成的句子,其中每个单词都用单词嵌入表示:我们现在要用一个不同的cd2}层的卷积来处理。为此,从数据中提取长度为
k
的滑动窗口,然后对每个提取的窗口应用每个过滤器。以下是所发生情况的说明(为了简单起见,我假设k=3
,并删除了每个过滤器的bias参数):如上图所示,每个过滤器的响应相当于其点积的结果(即元素乘法,然后将所有结果相加)与提取的长度为
k
(即给定句子中第i
-个到(i+k-1)
-个单词)的结果。此外,请注意,每个滤波器的通道数与训练样本的特征数(即字嵌入维数)相同(因此可以执行点积)。从本质上讲,每个滤波器都在检测训练数据的局部窗口中是否存在模式的特定特征(例如,在该窗口中是否存在一些特定的单词)。在所有长度为k
的窗口上应用所有过滤器后,我们将得到如下输出,这是卷积的结果:如您所见,图中有}(Keras中^{} 层的默认行为)。
m-k+1
窗口,因为我们假设padding='valid'
和{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验证我提到的一些事情:
模型摘要:
^{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
。在相关问题 更多 >
编程相关推荐