2017-03-27 12 views
4

私はいくつかのクラスにテキストを分類するプログラムを書いています。今、プログラムは単語列の列車とテストサンプルを読み込み、埋め込みレイヤーと畳み込みレイヤーを適用し、それらをクラスに分類します。次のコードのように、手作りの機能を実験に追加しようとしています。 featuresは、2つの要素のリストです。最初の要素はトレーニングデータのフィーチャで構成され、2つ目の要素はテストデータのフィーチャで構成されます。各トレーニング/テストサンプルは、対応する特徴ベクトルを有する(すなわち、特徴は単語特徴ではない)。Kerasを使用したテキスト分類:カスタム機能の追加方法

model = Sequential() 
model.add(Embedding(params.nb_words, 
        params.embedding_dims, 
        weights=[embedding_matrix], 
        input_length=params.maxlen, 
        trainable=params.trainable)) 
model.add(Convolution1D(nb_filter=params.nb_filter, 
         filter_length=params.filter_length, 
         border_mode='valid', 
         activation='relu')) 
model.add(Dropout(params.dropout_rate)) 
model.add(GlobalMaxPooling1D()) 

# Adding hand-picked features 
model_features = Sequential() 
nb_features = len(features[0][0]) 

model_features.add(Dense(1, 
         input_shape=(nb_features,), 
         init='uniform', 
         activation='relu')) 

model_final = Sequential() 
model_final.add(Merge([model, model_features], mode='concat')) 

model_final.add(Dense(len(citfunc.funcs), activation='softmax')) 
model_final.compile(loss='categorical_crossentropy', 
        optimizer='adam', 
        metrics=['accuracy']) 

print model_final.summary() 
model_final.fit([x_train, features[0]], y_train, 
       nb_epoch=params.nb_epoch, 
       batch_size=params.batch_size, 
       class_weight=data.get_class_weights(x_train, y_train)) 

y_pred = model_final.predict([x_test, features[1]]) 

私の質問は正しいですか?各テキストシーケンスに機能を追加する従来の方法はありますか?

+0

コードが正しいようです。私は['Functional API'](https://keras.io/getting-started/functional-api-guide/)がこの作業には良いかもしれないと思います。必要に応じて機能的なAPIに書き直す手助けをするかもしれません。その場合、 'Dense'からの出力を1つだけ追加するのではなく、完全な特徴ベクトルを追加する方が簡単です。 –

+0

こんにちはマルシン、はい、してください!私はFunctional APIがどのように役立つかを学ぶことに非常に興味があります。 :) –

答えて

6

試してみてください。この場合

input = Input(shape=(params.maxlen,)) 
embedding = Embedding(params.nb_words, 
        params.embedding_dims, 
        weights=[embedding_matrix], 
        input_length=params.maxlen, 
        trainable=params.trainable)(input) 
conv = Convolution1D(nb_filter=params.nb_filter, 
         filter_length=params.filter_length, 
         border_mode='valid', 
         activation='relu')(embedding) 
drop = Dropout(params.dropout_rate)(conv) 
seq_features = GlobalMaxPooling1D()(drop) 

# Adding hand-picked features 
nb_features = len(features[0][0]) 
other_features = Input(shape=(nb_features,)) 

model_final = merge([seq_features , other_features], mode='concat')) 

model_final = Dense(len(citfunc.funcs), activation='softmax'))(model_final) 

model_final = Model([input, other_features], model_final) 

model_final.compile(loss='categorical_crossentropy', 
        optimizer='adam', 
        metrics=['accuracy']) 

- カスタムで配列解析から機能をマージしている機能を直接 - Denseを使用して1機能にすべてのカスタム機能を退治せずに。

+0

次の手順、つまりコンパイルと予測のコードはありますか?私はチュートリアルに従うことをしようとしているが、私は編集されたコードで提供するもので –

+0

を通してそれを得ることができませんでした:すべての残りの部分は同じである必要があります。 –

+0

これは役に立ちます。どうもありがとうございます! –

関連する問題