如何使用tensorflow keras在网络中一起使用嵌入层和其他特征列

sha*_*oss 5 python keras tensorflow

让\xe2\x80\x99s 考虑一个包含 6 列和 10 行的示例数据集。

\n\n

这 3 列是数字,其余 3 列是分类变量。

\n\n

分类列被转换为大小为 10x3 的多热编码数组。

\n\n

我有目标列,我想要预测它也是分类变量,它可以再次采用 3 个可能的值。这一列是一个热门编码。

\n\n

现在我想使用这个多重热编码数组作为嵌入层的输入。嵌入层应输出 2 个单位。

\n\n

然后我想使用数据集中的 3 个数字列和嵌入层的 2 个输出单元,总共 5 个单元作为隐藏层的输入。

\n\n

这就是我被卡住的地方。我不知道如何使用tensorflow keras桥接嵌入层和其他特征列,我也不知道如何传递嵌入层和其他2个单元的输入。

\n\n

我已经用谷歌搜索过了。我尝试了以下代码,但仍然出现错误。\n我猜 tf.keras 包中没有 Merge 层

\n\n

对此的任何帮助将不胜感激。

\n\n
        import tensorflow as tf\n        from tensorflow import keras\n        import numpy as np\n\n        num_data = np.random.random(size=(10,3))\n        multi_hot_encode_data = np.random.randint(0,2, 30).reshape(10,3)\n        target =  np.eye(3)[np.random.randint(0,3, 10)]\n\n        model = keras.Sequential()\n        model.add(keras.layers.Embedding(input_dim=multi_hot_encode_data.shape[1], output_dim=2))\n        model.add(keras.layers.Dense(3, activation=tf.nn.relu, input_shape=(num_data.shape[1],)))\n        model.add(keras.layers.Dense(3, activation=tf.nn.softmax)\n\n        model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),\n                      loss=keras.losses.categorical_crossentropy,\n                      metrics=[keras.metrics.categorical_accuracy])\n\n        #model.fit([multi_hot_encode_data, num_data], target)   # I get error here \n
Run Code Online (Sandbox Code Playgroud)\n\n

我的网络结构将是

\n\n
    multi-hot-encode-input  num_data_input \n            |                   |\n            |                   |\n            |                   |\n        embedding_layer         |\n            |                   |\n            |                   | \n             \\                 /        \n               \\              / \n              dense_hidden_layer\n                     | \n                     | \n                  output_layer \n
Run Code Online (Sandbox Code Playgroud)\n

Mik*_*nov 7

这种“合并”模式与顺序模型不兼容。我认为使用功能性 keras API 更容易keras.Modelkeras.Sequential主要差异的简短解释):

import tensorflow as tf
from tensorflow import keras
import numpy as np

num_data = np.random.random(size=(10,3))
multi_hot_encode_data = np.random.randint(0,2, 30).reshape(10,3)
target =  np.eye(3)[np.random.randint(0,3, 10)]

# Use Input layers, specify input shape (dimensions except first)
inp_multi_hot = keras.layers.Input(shape=(multi_hot_encode_data.shape[1],))
inp_num_data = keras.layers.Input(shape=(num_data.shape[1],))
# Bind nulti_hot to embedding layer
emb = keras.layers.Embedding(input_dim=multi_hot_encode_data.shape[1], output_dim=2)(inp_multi_hot)  
# Also you need flatten embedded output of shape (?,3,2) to (?, 6) -
# otherwise it's not possible to concatenate it with inp_num_data
flatten = keras.layers.Flatten()(emb)
# Concatenate two layers
conc = keras.layers.Concatenate()([flatten, inp_num_data])
dense1 = keras.layers.Dense(3, activation=tf.nn.relu, )(conc)
# Creating output layer
out = keras.layers.Dense(3, activation=tf.nn.softmax)(dense1)
model = keras.Model(inputs=[inp_multi_hot, inp_num_data], outputs=out)

model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),
              loss=keras.losses.categorical_crossentropy,
              metrics=[keras.metrics.categorical_accuracy])
Run Code Online (Sandbox Code Playgroud)
  • 您应该在连接嵌入层之前压平嵌入层的输出,或者 numeric_data 应该具有兼容的形状和至少三个维度
  • 在各层之后定义功能模型。输入和输出可以是单层或可迭代的层

输出model.summary

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_5 (InputLayer)            (None, 3)            0                                            
__________________________________________________________________________________________________
embedding_2 (Embedding)         (None, 3, 2)         6           input_5[0][0]                    
__________________________________________________________________________________________________
flatten (Flatten)               (None, 6)            0           embedding_2[0][0]                
__________________________________________________________________________________________________
input_6 (InputLayer)            (None, 3)            0                                            
__________________________________________________________________________________________________
concatenate_2 (Concatenate)     (None, 9)            0           flatten[0][0]                    
                                                                 input_6[0][0]                    
__________________________________________________________________________________________________
dense (Dense)                   (None, 3)            30          concatenate_2[0][0]              
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 3)            12          dense[0][0]                      
==================================================================================================
Total params: 48
Trainable params: 48
Non-trainable params: 0
__________________________________________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

此外,它也成功适配:

model.fit([multi_hot_encode_data, num_data], target)
Epoch 1/1
10/10 [==============================] - 0s 34ms/step - loss: 1.0623 - categorical_accuracy: 0.3000
Run Code Online (Sandbox Code Playgroud)