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

Posted

技术标签:

【中文标题】如何将多个输入和嵌入合并到单个输入层【英文标题】:How to merge multiple input and embeddings into single input layer 【发布时间】:2021-10-29 12:30:39 【问题描述】:

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

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

但是,我的断开连接是从这里开始的地方。我已经构建了以下自动编码器,但我不确定如何在此流程之上“堆叠”先前的嵌入+输入混合:

那么,如何使输入层符合上面的定义?我尝试将第一个“编码器”部分设置为接收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 传递给第一个编码器层并以这种方式定义您的模型: autoencoder = Model(inputs = inputs, outputs = decoder, name = 'ae_toy_example') 有效!错误是因为您在模型定义中使用了 input_layer 而不是输入 感谢您的评论 - 我在上面的第三张图片中使用 encoder = Dense(16, activation='relu')(merge_models) 尝试了此操作,但错误可能与我指定其中一个输入的方式有关。 在图像(和代码中)自动编码器是模型(输入 = 输入层,输出 = 解码器,名称 = 'ae_toy_example')......它应该是模型(输入 = 输入,输出 = 解码器, 名称 = 'ae_toy_example') 谢谢 - 解决了。 【参考方案1】:

您应该以这种方式将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')

【讨论】:

以上是关于如何将多个输入和嵌入合并到单个输入层的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个输入(旋钮)添加到单个滑块?

如何使用 PyTorch 中的单个全连接层直接将输入连接到输出?

arcgis合并多个图层

如何将多个excel文件合并?

如何在分类中将多个输入建模为单个输出?

使用 tensorflow 实现嵌入层