Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数)
How does Keras 1d convolution layer work with word embeddings - text classification problem? (Filters, kernel size, and all hyperparameter)
我目前正在使用 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())
我的主要问题是:Conv1D 层应该使用哪些超参数?
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
如果我有以下输入数据:
- 最大字数:951
- 词嵌入维度:32
这是否意味着 filters=32
将只扫描前 32 个单词而完全丢弃其余的(使用 kernel_size=2
)?我应该将过滤器设置为 951(句子中的最大字数)?
图片示例:
例如这是一个输入数据:http://joxi.ru/krDGDBBiEByPJA
这是卷积层的第一步(步幅 2):http://joxi.ru/Y2LB099C9dWkOr
这是第二步(stride 2):http://joxi.ru/brRG699iJ3Ra1m
如果filters = 32
,图层重复32次?我对么?
所以我不会在句子中说出第 156 个单词,因此这些信息会丢失吗?
我会尝试解释一维卷积如何应用于序列数据。我只是举了一个由单词组成的句子的例子,但显然它不是特定于文本数据的,它与其他序列数据和时间序列相同。
假设我们有一个由 m
个单词组成的句子,其中每个单词都使用单词嵌入表示:
现在我们想在这个数据上应用一个由 n
个不同的过滤器组成的一维卷积层,内核大小为 k
。为此,从数据中提取长度 k
的滑动 windows,然后将每个过滤器应用于每个提取的 windows。这是发生的情况的说明(这里我假设 k=3
并为简单起见删除了每个过滤器的偏置参数):
如上图所示,每个滤波器的响应等同于其卷积(即逐元素相乘,然后将所有结果相加)与提取的window长度的结果k
(即给定句子中的第 i
到 (i+k-1)
个单词)。此外,请注意,每个过滤器的通道数与训练样本的特征数(即词嵌入维度)相同(因此可以执行卷积,即逐元素乘法)。本质上,每个过滤器都在检测 local window 训练数据中是否存在特定模式特征(例如,此 window 或不)。在将所有过滤器应用于长度 k
的所有 windows 之后,我们将得到这样的输出,这是卷积的结果:
如您所见,图中有 m-k+1
windows,因为我们假设 padding='valid'
和 stride=1
([=37= 的默认行为] 图层)。 stride
参数确定 window 应该滑动多少(即移动)以提取下一个 window (例如,在我们上面的示例中,步幅为 2 将提取 windows单词:(1,2,3), (3,4,5), (5,6,7), ...
代替)。 padding
参数决定 window 是否应该完全由训练样本中的单词组成,或者是否应该在开头和结尾进行填充;这样,卷积响应可能具有与训练样本相同的长度(即 m
而不是 m-k+1
)(例如,在我们上面的示例中,padding='same'
将提取 windows单词:(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
.
我目前正在使用 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())
我的主要问题是:Conv1D 层应该使用哪些超参数?
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
如果我有以下输入数据:
- 最大字数:951
- 词嵌入维度:32
这是否意味着 filters=32
将只扫描前 32 个单词而完全丢弃其余的(使用 kernel_size=2
)?我应该将过滤器设置为 951(句子中的最大字数)?
图片示例:
例如这是一个输入数据:http://joxi.ru/krDGDBBiEByPJA
这是卷积层的第一步(步幅 2):http://joxi.ru/Y2LB099C9dWkOr
这是第二步(stride 2):http://joxi.ru/brRG699iJ3Ra1m
如果filters = 32
,图层重复32次?我对么?
所以我不会在句子中说出第 156 个单词,因此这些信息会丢失吗?
我会尝试解释一维卷积如何应用于序列数据。我只是举了一个由单词组成的句子的例子,但显然它不是特定于文本数据的,它与其他序列数据和时间序列相同。
假设我们有一个由 m
个单词组成的句子,其中每个单词都使用单词嵌入表示:
现在我们想在这个数据上应用一个由 n
个不同的过滤器组成的一维卷积层,内核大小为 k
。为此,从数据中提取长度 k
的滑动 windows,然后将每个过滤器应用于每个提取的 windows。这是发生的情况的说明(这里我假设 k=3
并为简单起见删除了每个过滤器的偏置参数):
如上图所示,每个滤波器的响应等同于其卷积(即逐元素相乘,然后将所有结果相加)与提取的window长度的结果k
(即给定句子中的第 i
到 (i+k-1)
个单词)。此外,请注意,每个过滤器的通道数与训练样本的特征数(即词嵌入维度)相同(因此可以执行卷积,即逐元素乘法)。本质上,每个过滤器都在检测 local window 训练数据中是否存在特定模式特征(例如,此 window 或不)。在将所有过滤器应用于长度 k
的所有 windows 之后,我们将得到这样的输出,这是卷积的结果:
如您所见,图中有 m-k+1
windows,因为我们假设 padding='valid'
和 stride=1
([=37= 的默认行为] 图层)。 stride
参数确定 window 应该滑动多少(即移动)以提取下一个 window (例如,在我们上面的示例中,步幅为 2 将提取 windows单词:(1,2,3), (3,4,5), (5,6,7), ...
代替)。 padding
参数决定 window 是否应该完全由训练样本中的单词组成,或者是否应该在开头和结尾进行填充;这样,卷积响应可能具有与训练样本相同的长度(即 m
而不是 m-k+1
)(例如,在我们上面的示例中,padding='same'
将提取 windows单词:(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
.