如何在Keras中将嵌入与可变长度输入连接起来?

这是我正在工作的网络图,数据是表格化的和结构化的,

enter image description here

在左侧,我们有一些能力,它们是连续特征,而在右侧,我们可能有‘N’个修饰符。每个修饰符都有一个修饰符类型,这是分类特征,还有一些统计数据,它们是连续特征。

如果只有一个修饰符,以下代码工作得很好!

import keras.backend as Kfrom keras.models import Modelfrom keras.layers import Input, Embedding, concatenatefrom keras.layers import Dense, GlobalMaxPooling1D, Reshapefrom keras.optimizers import AdamK.clear_session()# 使用嵌入处理分类特征modifier_type_embedding_in=[]modifier_type_embedding_out=[]# 示例分类特征categorical_features = ['modifier_type']modifier_input_ = Input(shape=(1,), name='modifier_type_in')# 假设有10种独特的修饰符类型,嵌入维度设为6modifier_output_ = Embedding(input_dim=10, output_dim=6, name='modifier_type')(modifier_input_)modifier_output_ = Reshape(target_shape=(6,))(modifier_output_)  modifier_type_embedding_in.append(modifier_input_)modifier_type_embedding_out.append(modifier_output_)# 示例连续特征statistics = ['duration']statistics_inputs =[Input(shape=(len(statistics),), name='statistics')] # Input(shape=(1,))# 示例连续特征abilities = ['buyback_cost', 'cooldown', 'number_of_deaths', 'ability', 'teleport', 'team', 'level', 'max_mana', 'intelligence']abilities_inputs=[Input(shape=(len(abilities),), name='abilities')] # Input(shape=(9,))concat = concatenate(modifier_type_embedding_out + statistics_inputs)FC_relu = Dense(128, activation='relu', name='fc_relu_1')(concat)FC_relu = Dense(128, activation='relu', name='fc_relu_2')(FC_relu)model = concatenate(abilities_inputs + [FC_relu])model = Dense(64, activation='relu', name='fc_relu_3')(model)model_out = Dense(1, activation='sigmoid', name='fc_sigmoid')(model)model_in = abilities_inputs + modifier_type_embedding_in + statistics_inputsmodel = Model(inputs=model_in, outputs=model_out)model.compile(loss='binary_crossentropy', optimizer=Adam(lr=2e-05, decay=1e-3), metrics=['accuracy'])

enter image description here

然而,在为’N’个修饰符编译时,我遇到了下面的错误,以下是我对代码所做的更改,

modifier_input_ = Input(shape=(None, 1,), name='modifier_type_in')

statistics_inputs =[Input(shape=(None, len(statistics),), name='statistics')] # Input(shape=(None, 1,))

FC_relu = Dense(128, activation='relu', name='fc_relu_2')(FC_relu)max_pool = GlobalMaxPooling1D()(FC_relu)model = concatenate(abilities_inputs + [max_pool])

我得到的结果是,

---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)<ipython-input-3-7703088b1d24> in <module>     22 abilities_inputs=[Input(shape=(len(abilities),), name='abilities')] # Input(shape=(9,))     23 ---> 24 concat = concatenate(modifier_type_embedding_out + statistics_inputs)     25 FC_relu = Dense(128, activation='relu', name='fc_relu_1')(concat)     26 FC_relu = Dense(128, activation='relu', name='fc_relu_2')(FC_relu)e:\Miniconda3\lib\site-packages\keras\layers\merge.py in concatenate(inputs, axis, **kwargs)    647         A tensor, the concatenation of the inputs alongside axis `axis`.    648     """--> 649     return Concatenate(axis=axis, **kwargs)(inputs)    650     651 e:\Miniconda3\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)    423                                          'You can build it manually via: '    424                                          '`layer.build(batch_input_shape)`')--> 425                 self.build(unpack_singleton(input_shapes))    426                 self.built = True    427 e:\Miniconda3\lib\site-packages\keras\layers\merge.py in build(self, input_shape)    360                              'inputs with matching shapes '    361                              'except for the concat axis. '--> 362                              'Got inputs shapes: %s' % (input_shape))    363     364     def _merge_function(self, inputs):ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 6), (None, None, 1)]

如何在设计用于接受可变输入长度特征的神经网络中使用嵌入层?


回答:

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注