Keras Tensorflow中嵌入层索引顺序的含义

时间:2019-10-19 21:00:46

标签: python keras encoding embedding tf.keras

我正在使用Keras Tensorflow在混合数据输入(数字和分类)上使用深度学习模型。已使用scikit-learn LabelEncoder将分类协变量编码为数字,并使用Input层(一维)将其引入DL。然后,例如,使用具有6个不同级别的变量来设置Embedding层:

variable_emb = Embedding(input_dim=6,output_dim=1,input_shape=(1,),name='variable_emb_emb')(variable_tensor_input)

我的问题是嵌入矩阵行的顺序是什么。第i行是否遵循LabelEncoder索引,还是根据它们在输入数据集中出现的顺序分配给不同的原始变量级别?

2 个答案:

答案 0 :(得分:2)

受@ ad2004的启发,我尝试进行类似的实验,同时尝试使设置清晰明了。结果要说明的是:嵌入层的索引直接对应于分类特征的整数表示。

首先设计一个带有嵌入层的简单模型

400KiB

然后通过定义不同的x_array但相同的y:

from numpy.random import seed
seed(42)
import tensorflow
tensorflow.random.set_seed(42)

import numpy as np
from keras import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(input_dim=3, output_dim=2, input_length=1, name='embedding'))
model.add(Flatten())
model.add(Dense(2, activation="relu"))
model.add(Dense(1))


model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics=['accuracy'])
model.summary()

我们希望normal_order = 1情况的 嵌入向量应具有0和1彼此接近 ,同时 嵌入向量normal_order = 0的情况下,应该有2和1彼此接近 。运行以下代码:

normal_order = 1 # or 0

if normal_order:
    x_array = np.array([[0],
                        [1],
                        [2],
                        [0],
                        [1],
                        [2]])
if not normal_order:
    x_array = np.array([[2],
                        [1],
                        [0],
                        [2],
                        [1],
                        [0]])

y = np.array([1,1,0,1,1,0])

normal_order = 1情况下的emb_df为:

model.fit(x = x_array, y, epochs=2000 )

emb_df = pd.DataFrame( model.get_layer('embedding').get_weights()[0]).reset_index()

而normal_order = 0情况是:

emb_df
#   index         0         1
#0      0 -0.169505 -0.242161
#1      1 -0.246347 -0.211345
#2      2  0.067879  0.062597

答案 1 :(得分:0)

我认为输出行只是从0到input_dim-1进行索引,并且LabelEncoder为每个分类变量生成的任何整数将对应于适当的行。例如,如果您有3个分类变量:“ apple”,“ pear”,“ orange”,并且LabelEncoder分配了pear = 2,orange = 0,apple = 1,则嵌入矩阵的第0行将与“ orange”相关”,第1行将是“ apple”,第2行将是“梨”。
下面的工作代码片段显示了该想法。我希望这会有所帮助。

import numpy as np
from keras import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2))

model.compile('rmsprop', 'mse')
#model.summary()

input_array = np.array([[1, 1, 1],
                        [1, 2, 2]])
output_array = model.predict(input_array)

print('model.get_weights():')
print(model.get_weights())

print('output_array:')
print(output_array)