2017-12-22 6 views
1

私はKerasを使用して複数入力モデルを構築しようとしています。私は、シーケンシャルモデルを使用して、まっすぐ前進していた1つの入力を持つことから来ています。私はドキュメント(https://keras.io/getting-started/functional-api-guide/)とStackOverflow(How to "Merge" Sequential models in Keras 2.0?)のいくつかの答えを見てきました。基本的には、2つの入力に1つのモデルを訓練させることです。 1つの入力はテキストの一部であり、もう1つはそのテキストから抽出された手で選択されたフィーチャのセットです。手で選択された特徴ベクトルは一定の長さである。以下は、私がこれまで試したものです:Keras(モデルAPI)を使用した複数入力モデル

left = Input(shape=(7801,), dtype='float32', name='left_input') 
    left = Embedding(7801, self.embedding_vector_length, weights=[self.embeddings], 
        input_length=self.max_document_length, trainable=False)(left) 

    right = Input(shape=(len(self.z_train), len(self.z_train[0])), dtype='float32', name='right_input') 

    for i, filter_len in enumerate(filter_sizes): 
     left = Conv1D(filters=128, kernel_size=filter_len, padding='same', activation=c_activation)(left) 
     left = MaxPooling1D(pool_size=2)(left) 

    left = CuDNNLSTM(100, unit_forget_bias=1)(left) 
    right = CuDNNLSTM(100, unit_forget_bias=1)(right) 

    left_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(left) 
    right_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(right) 
    for i in range(self.num_outputs): 
     left_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(left_out) 
     right_out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1))(right_out) 

    left_model = Model(left, left_out) 
    right_model = Model(right, right_out) 

    concatenated = merge([left_model, right_model], mode="concat") 
    out = Dense(3, activation=activation, kernel_regularizer=l2(l_2), activity_regularizer=l1(l_1), name='output_layer')(concatenated) 

    self.model = Model([left_model, right_model], out) 
    self.model.compile(loss=loss, optimizer=optimizer, metrics=[cosine, mse, categorical_accuracy]) 

これはエラーを与える:

TypeError: Input layers to a `Model` must be `InputLayer` objects. Received inputs: Tensor("cu_dnnlstm_1/strided_slice_16:0", shape=(?, 100), dtype=float32). Input 0 (0-based) originates from layer type `CuDNNLSTM`. 

答えて

0

エラーがクリアされている(そして、あなたはほとんどそこにいます)。コードは現在入力をモデル[left_model, right_model]として設定しようとしていますが、入力は入力層[left, right]でなければなりません。上記のサンプルコードの関連部分を読んでください:

self.model = Model([left, rigt], out) 

参照としてここに私の答えを参照してください。Merging layers特に第二の例を。

関連する問題