python - 关于Keras中基于官方文档的Embeddings的输入维度的问题

标签 python machine-learning keras neural-network nlp

我一直在阅读 Jonathan Hui 博客 ( https://jhui.github.io/2018/02/11/Keras-tutorial/ ) 中发布的 Keras 教程,正如他所说,该教程直接取自官方 Keras 文档。

有些代码我不太理解,这些与嵌入层的尺寸有关。

让我们看两个例子:

第一个示例:

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM

import numpy as np

max_features = 10
x_train = np.random.random((1000, max_features))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, max_features))
y_test = np.random.randint(2, size=(100, 1))

model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)

这里 X 是一个包含随机数的矩阵 (1000 x 10),其中每个随机数都可能是唯一的。然而,嵌入层接收输入维度 max_features 作为参数(即本例中的 10)。但是,当我们将输入维度传递给嵌入层时,我们不是在计算正在编码的变量的唯一可能值吗?换句话说,n 不是基于关于其值所源自的空间维数(例如词汇表)的假设而对变量进行虚拟化所产生的列数吗?

第二个示例:

import keras
import numpy as np

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# The first input
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# This embedding layer will encode the input sequence
# into a sequence of dense 512-dimensional vectors.
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# A LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(32)(x)

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

# Second input
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# We stack a deep densely-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# And finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

headline_data = np.random.random((1000, 100))
additional_data = np.random.random((1000, 5))
labels = np.random.random((1000, 1))

model.fit([headline_data, additional_data], [labels, labels],
          epochs=50, batch_size=32)

此处输入维度设置为 10,000,但我们再次处理可能具有 1000 x 100 = 100,000 个唯一值的输入 (headline_data)。我们如何使用 10,000 维输入空间来表示这 100,000 个值?

最佳答案

看来您误解了嵌入层。我简单描述一下:

您可以将嵌入层视为查找表:它采用整数作为输入,并返回与给定整数对应的向量 作为输出。因此,在 NLP 的背景下,这些整数通常对应于我们根据训练数据创建的字典中的标记或单词。例如,该字典可能如下所示:

hi:     1
you:    2
hello:  3
can:    4
are:    5
how:    6
...

例如,单词“hi”已被分配数字“1”。现在,如果我们想要表示句子 “hi how are you”,它将相当于 [1, 6, 5, 2]。这个整数向量是我们模型的输入,它将作为输入提供给嵌入层。作为返回,嵌入层将给出相应的向量。例如,在训练期间的某个时刻,嵌入层中的嵌入向量可能如下所示:

1:  [0.43, 0.09, 0.13, 1.65]
2:  [0.43, 0.11, 0.23, -1.75]
3:  [-0.88, 0.19, 2.33, 0.55]
4:  [0.93, 0.79, -0.23, 2.05]
5:  [0.27, 0.61, 0.10, 0.85]
6:  [0.03, 1.09, -3.19, 2.25]
...

因此,对于“hi how are you”,它返回以下向量:

[[0.43, 0.09, 0.13, 1.65],
 [0.03, 1.09, -3.19, 2.25],
 [0.27, 0.61, 0.10, 0.85],
 [0.43, 0.11, 0.23, -1.75]]

现在您可以更好地理解嵌入层的这些参数对应的内容:input_dim实际上是查找表中的条目数,相当于唯一的数量字典中的单词output_dim是嵌入层中嵌入向量的维度(即长度)(在上面的示例中,每个向量的长度为4,因此 output_dim=4)。

顺便说一句,您提供的两个示例代码都不起作用。这是因为模型的输入(即 x_trainx_test)不包含整数;相反,它们是 float 数组(由于使用np.random.random),当您将嵌入层作为模型的第一层时,这是 Not Acceptable 。

关于python - 关于Keras中基于官方文档的Embeddings的输入维度的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56584678/

相关文章:

python - 如何在 Keras API 中将数组列表作为输入

python - 当我尝试使用 keras 标记我的 txt 字符串数组时出现参数错误

python - 浏览列表的最快方法。如果 x 在列表中,则检索列表中带有 x 的元素

python - 类型错误 : '>' not supported between instances of 'datetime.datetime' and 'str'

matlab - matlab theta1中实现的梯度下降搜索不正确

machine-learning - caffe:5D blob 池化?

python - Mxnet 元素明智乘法

python - 继承问题和 "self"引用

lua - 需要 ('image' )在 Torch7 中不起作用

python - 使用 Keras 和 Python 创建 NER 模型