89 keras
Keras文档不清楚这实际上是什么.据我所知,我们可以使用它将输入要素空间压缩为较小的一个.但是从神经设计的角度来看,这是怎么做到的?它是自动编码器,RBM吗?
Lor*_*rit 61
据我所知,嵌入层是一个简单的矩阵乘法,可将单词转换为相应的单词嵌入.
嵌入层的权重具有形状(vocabulary_size,embedding_dimension).对于每个训练样本,其输入是整数,表示某些单词.整数在词汇量大小的范围内.嵌入层将每个整数i变换为嵌入权重矩阵的第i行.
为了快速将其作为矩阵乘法,输入整数不会存储为整数列表,而是存储为单热矩阵.因此,输入形状是(nb_words,vocabulary_size),每行一个非零值.如果将此乘以嵌入权重,则可获得形状中的输出
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
Run Code Online (Sandbox Code Playgroud)
因此,通过简单的矩阵乘法,您可以将样本中的所有单词转换为相应的单词嵌入.
Poe*_*dit 16
该Keras Embedding层不执行任何矩阵乘法,但它只是:
1.创建(vocabulary_size)x(embedding_dimension)维度的权重矩阵
2.索引此权重矩阵
查看源代码以了解类的功能总是很有用.在这种情况下,我们将看一下从名为Layer的基础层继承的class 嵌入.class
(1) - 创建(vocabulary_size)x(embedding_dimension)维度的权重矩阵:
这是在嵌入build功能中发生的:
def build(self, input_shape):
self.embeddings = self.add_weight(
shape=(self.input_dim, self.output_dim),
initializer=self.embeddings_initializer,
name='embeddings',
regularizer=self.embeddings_regularizer,
constraint=self.embeddings_constraint,
dtype=self.dtype)
self.built = True
Run Code Online (Sandbox Code Playgroud)
如果您查看基类Layer,您将看到add_weight上面的函数只是创建一个可训练权重矩阵(在这种情况下为(vocabulary_size)x(embedding_dimension)维度):
def add_weight(self,
name,
shape,
dtype=None,
initializer=None,
regularizer=None,
trainable=True,
constraint=None):
"""Adds a weight variable to the layer.
# Arguments
name: String, the name for the weight variable.
shape: The shape tuple of the weight.
dtype: The dtype of the weight.
initializer: An Initializer instance (callable).
regularizer: An optional Regularizer instance.
trainable: A boolean, whether the weight should
be trained via backprop or not (assuming
that the layer itself is also trainable).
constraint: An optional Constraint instance.
# Returns
The created weight variable.
"""
initializer = initializers.get(initializer)
if dtype is None:
dtype = K.floatx()
weight = K.variable(initializer(shape),
dtype=dtype,
name=name,
constraint=constraint)
if regularizer is not None:
with K.name_scope('weight_regularizer'):
self.add_loss(regularizer(weight))
if trainable:
self._trainable_weights.append(weight)
else:
self._non_trainable_weights.append(weight)
return weight
Run Code Online (Sandbox Code Playgroud)
(2) - 索引此权重矩阵
这是在嵌入call功能中发生的:
def call(self, inputs):
if K.dtype(inputs) != 'int32':
inputs = K.cast(inputs, 'int32')
out = K.gather(self.embeddings, inputs)
return out
Run Code Online (Sandbox Code Playgroud)
此函数返回Embedding图层的输出K.gather(self.embeddings, inputs).什么tf.keras.backend.gather究竟是指数权重矩阵self.embeddings(参见build根据上述功能),inputs这应该是正整数的列表.
例如,如果将文本/单词输入传递给Keras的one_hot函数,可以检索这些列表,该函数将文本编码为大小为n的单词索引列表(这不是一个热编码 - 请参阅此示例以获取更多信息:https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/).
因此,就是这样.没有矩阵乘法.
相反,该Keras Embedding层仅有用,因为它确实避免了执行矩阵乘法,因此节省了一些计算资源.
否则,您可以使用Keras Dense图层(在编码输入数据之后)获得可训练权重矩阵((vocabulary_size)x(embedding_dimension)维度),然后简单地进行乘法以获得准确的输出与Embedding图层的输出相同.
| 归档时间: |
|
| 查看次数: |
29113 次 |
| 最近记录: |