【问题标题】:Questions regarding the input dimensionality of Embeddings in Keras based on official documentation基于官方文档关于 Keras 中 Embeddings 输入维度的问题
【发布时间】:2019-10-28 07:04:26
【问题描述】:

我一直在阅读 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)。但是当我们将输入维度传递给嵌入层时,我们不是在计算我们正在编码的变量的唯一可能值吗?换句话说,根据关于其值源自的空间维度的假设(例如词汇表)对变量进行虚拟化会产生的列数不是吗?

第二个例子:

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,但我们再次处理的输入 (headline_data) 可能具有 1000 x 100 = 100,000 个唯一值。我们如何使用 10,000 维的输入空间来表示这 100,000 个值?

【问题讨论】:

    标签: python machine-learning keras neural-network nlp


    【解决方案1】:

    您似乎误解了嵌入层。让我简单描述一下:

    你可以把Embedding层看成一个查找表:它接受一个integer作为输入,返回一个vector 对应给定的整数 作为输出。因此,在 NLP 的上下文中,通常这些整数对应于我们从训练数据创建的字典中的标记或单词。例如,这本字典可能如下所示:

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

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

    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]]
    

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

    附带说明,您提供的两个示例代码都不起作用。这是因为模型的输入(即x_trainx_test)不包含整数;相反,它们是浮点数数组(由于使用np.random.random),当您将嵌入层作为模型的第一层时,这是不可接受的。

    【讨论】:

    • 谢谢,这正是我的理解。不过,我对帖子感到困惑,并认为我做错了。
    猜你喜欢
    • 2020-01-18
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多