这是我正在工作的网络图,数据是表格化的和结构化的,
在左侧,我们有一些能力,它们是连续特征,而在右侧,我们可能有‘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'])
然而,在为’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)]
如何在设计用于接受可变输入长度特征的神经网络中使用嵌入层?
回答: