【问题标题】: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')
  • 谢谢 - 解决了。

标签: python keras autoencoder embedding


【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2020-03-24
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多