如何将多个输入和嵌入合并到单个输入层

How to merge multiple input and embeddings into single input layer

我有各种输入,有些需要嵌入。我已经能够创建它们,如下所示:

然后我可以将它们全部连接起来,如下所示:

但是,我的脱节是从这里去哪里。我已经构建了以下自动编码器,但我不确定如何在此流程之上“堆叠”之前的嵌入+输入混合:

那么,如何使输入层在上面已经定义好?我尝试将第一个“编码器”部分设置为接收 merge_models,但是它失败:

代码如下:

num_input = Input(shape=scaled_data.shape[1], name='input_number_features')
models.append(num_input)
inputs.append(num_input)  

binary_input = Input(shape=binary_data.shape[1], name='input_binary_features')
models.append(binary_input)
inputs.append(binary_input)  
  
for var in cols_to_embed :
    model = Sequential()
    no_of_unique_cat  = data[var].nunique()
    embedding_size = np.ceil(np.sqrt(no_of_unique_cat))
    embedding_size = int(embedding_size)
    print(var + " - " + str(no_of_unique_cat) + ' unique values to ' + str(embedding_size))
    inpt = tf.keras.layers.Input(shape=(1,),\
                                 name='input_' + '_'.join(\
                                 var.split(' ')))
    embed = tf.keras.layers.Embedding(no_of_unique_cat, embedding_size,trainable=True,\
                                      embeddings_initializer=tf.initializers\
                                      .random_normal)(inpt)
    embed_rehsaped = tf.keras.layers.Reshape(target_shape=(embedding_size,))(embed)
    models.append(embed_rehsaped)
    inputs.append(inpt)

merge_models = tf.keras.layers.concatenate(models)

# Input Layer
input_dim = merge_models.shape[1]
input_layer = Input(shape = (input_dim, ), name = 'input_layer')

# Encoder
encoder = Dense(16, activation='relu')(input_layer)
encoder = Dense(8, activation='relu')(encoder)
encoder = Dense(4, activation='relu')(encoder)

# Bottleneck
z = Dense(2, activation='relu')(encoder)

# Decoder
decoder = Dense(4, activation='relu')(z)
decoder = Dense(8, activation='relu')(decoder)
decoder = Dense(16, activation='relu')(decoder)
decoder = Dense(input_dim, activation='elu')(decoder) # intentionally using 'elu' instead of 'reul'

# Autoencoder
from tensorflow.keras.models import Model
autoencoder = Model(inputs = input_layer, 
                    outputs = decoder,
                    name = 'ae_toy_example')

你应该以这种方式将 merge_models 传递到第一个编码器层:

encoder = Dense(16, activation='relu')(merge_models)

那么你应该这样定义你的最终模型:

Model(inputs = inputs, outputs = decoder, name = 'ae_toy_example')

不是因为:

Model(inputs = input_layer, outputs = decoder, name = 'ae_toy_example')