如何将多个输入和嵌入合并到单个输入层
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')
【讨论】:
以上是关于如何将多个输入和嵌入合并到单个输入层的主要内容,如果未能解决你的问题,请参考以下文章