- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在使用 Keras 开发文本分类工具。它工作正常(工作正常,我得到了高达 98.7 的验证准确率)但我无法完全理解一维卷积层如何与文本数据一起工作。
我应该使用哪些超参数?
我有以下句子(输入数据):
这是一个非常简单的模型(我制作了更复杂的结构,但奇怪的是它工作得更好 - 即使不使用 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'))
如果我有以下输入数据:
这是否意味着 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
的窗口从数据中提取,然后将每个过滤器应用于每个提取的窗口。这是发生的情况的说明(这里我假设 k=3
并为简单起见删除了每个过滤器的偏差参数):
如您在上图中所见,每个滤波器的响应等效于其与提取的长度为 k
的窗口进行卷积(即逐元素乘法,然后对所有结果求和)的结果。 (即给定句子中的第 i
到 (i+k-1)
的第几个词)。此外,请注意,每个过滤器的 channel 数与训练样本的特征数(即词嵌入维度)相同(因此可以执行卷积,即逐元素乘法)。本质上,每个过滤器都在检测训练数据的本地窗口中模式的特定特征的存在(例如,该窗口中是否存在几个特定的单词)。在所有长度为 k
的窗口上应用所有过滤器之后我们会有这样的输出,这是卷积的结果:
如你所见,有m-k+1
图中的窗口,因为我们假设 padding='valid'
和 stride=1
(Keras 中 Conv1D
层的默认行为)。 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()
模型总结:
_________________________________________________________________
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
.
关于python - Keras 1d 卷积层如何处理词嵌入 - 文本分类问题? (过滤器、内核大小和所有超参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352522/
我正在尝试构建不同(但每个同质)类型的可遍历项的多个交叉产品。所需的返回类型是元组的可遍历对象,其类型与输入可遍历对象中的类型相匹配。例如: List(1, 2, 3) cross Seq("a",
import java.util.Scanner; public class BooleanProduct { public static void main(String[] args) {
任务 - 数字的最大 K 积 时间限制:1 内存限制:64 M 给定一个整数序列 N(1 ≤ N ≤ 10 月,| A i | ≤ 2.10 9)和数量 K(1 ≤ K ≤ N)。找出乘积最大的 K
考虑一个大小为 48x16 的 float 矩阵 A 和一个大小为 1x48 的 float vector b。 请建议一种在常见桌面处理器 (i5/i7) 上尽可能快地计算 b×A 的方法。 背景。
假设我有一个 class Rectangle(object): def __init__(self, len
设 A 为 3x3 阶矩阵。判断矩阵A的 boolean 积可以组成多少个不同的矩阵。 这是我想出的: #include int main() { int matri
背景 生成随机权重列表后: sizes = [784,30,10] weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1],sizes[
我正在开发一个 python 项目并使用 numpy。我经常需要通过单位矩阵计算矩阵的克罗内克积。这些是我代码中的一个相当大的瓶颈,所以我想优化它们。我必须服用两种产品。第一个是: np.kron(n
有人可以提供一个例子说明如何使用 uBLAS 产品来乘法吗?或者,如果有更好的 C++ 矩阵库,您可以推荐我也欢迎。这正在变成一个令人头疼的问题。 这是我的代码: vector myVec(scala
我正在尝试开发一个Javascript程序,它会提示用户输入两个整数,然后显示这两个整数的和、乘积、差和商。现在它只显示总和。我实际上不知道乘法、减法和除法命令是否正在执行。这是 jsfiddle 的
如何使用 la4j 计算 vector (叉)积? vector 乘积为 接受两个 vector 并返回 vector 。 但是他们有scalar product , product of all e
在 C++ 中使用 Lapack 让我有点头疼。我发现为 fortran 定义的函数有点古怪,所以我尝试在 C++ 上创建一些函数,以便我更容易阅读正在发生的事情。 无论如何,我没有让矩阵 vecto
是否可以使用 Apple 的 Metal Performance Shaders 执行 Hadamard 产品?我看到可以使用 this 执行普通矩阵乘法,但我特别在寻找逐元素乘法,或者一种构造乘法的
我正在尝试使用 open mp 加速稀疏矩阵 vector 乘积,代码如下: void zAx(double * z, double * data, long * colind, long * row
有没有一种方法可以使用 cv::Mat OpenCV 中的数据结构? 我检查过 the documentation并且没有内置功能。但是我在尝试将标准矩阵乘法表达式 (*) 与 cv::Mat 类型的
我是一名优秀的程序员,十分优秀!