2016-05-18 11 views
11

私はニューラルネットには比較的新しいので、私の無知を許してください。私はケラBLSTMの例であるhereを適応させようとしています。この例では、テキストを読み込み、0または1として分類します。私は、POSタグ付けに非常に似ているBLSTMが必要ですが、lemmatizingやその他の高度な機能は必要ありません。私のデータは文のリストであり、各単語にはカテゴリ1-8が与えられます。私は目に見えない文章の各単語のカテゴリを予測するためにこのデータを使用できるBLSTMを訓練したいと思う。ケラリスBLSTMで配列を表示する

入力= ['The'、 'dog'、 'is'、 'red']は出力= [2,4,3,7]を返す

ケラスの例が最良の経路でない場合は、その他の提案。

'''Train a Bidirectional LSTM.''' 

from __future__ import print_function 
import numpy as np 
from keras.preprocessing import sequence 
from keras.models import Model 
from keras.layers import Dense, Dropout, Embedding, LSTM, Input, merge 
from prep_nn import prep_scan 


np.random.seed(1337) # for reproducibility 
max_features = 20000 
batch_size = 16 
maxlen = 18 

print('Loading data...') 
(X_train, y_train), (X_test, y_test) = prep_scan(nb_words=max_features, 
               test_split=0.2) 
print(len(X_train), 'train sequences') 
print(len(X_test), 'test sequences') 

print("Pad sequences (samples x time)") 
# type issues here? float/int? 
X_train = sequence.pad_sequences(X_train, value=0.) 
X_test = sequence.pad_sequences(X_test, value=0.) # pad with zeros 

print('X_train shape:', X_train.shape) 
print('X_test shape:', X_test.shape) 

# need to pad y too, because more than 1 ouput value, not classification? 
y_train = sequence.pad_sequences(np.array(y_train), value=0.) 
y_test = sequence.pad_sequences(np.array(y_test), value=0.) 

print('y_train shape:', X_train.shape) 
print('y_test shape:', X_test.shape) 

# this is the placeholder tensor for the input sequences 
sequence = Input(shape=(maxlen,), dtype='int32') 

# this embedding layer will transform the sequences of integers 
# into vectors of size 128 
embedded = Embedding(max_features, 128, input_length=maxlen)(sequence) 

# apply forwards LSTM 
forwards = LSTM(64)(embedded) 
# apply backwards LSTM 
backwards = LSTM(64, go_backwards=True)(embedded) 

# concatenate the outputs of the 2 LSTMs 
merged = merge([forwards, backwards], mode='concat', concat_axis=-1) 
after_dp = Dropout(0.5)(merged) 
# number after dense has to corresponse to output matrix? 
output = Dense(17, activation='sigmoid')(after_dp) 

model = Model(input=sequence, output=output) 

# try using different optimizers and different optimizer configs 
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy']) 

print('Train...') 
model.fit(X_train, y_train, 
      batch_size=batch_size, 
      nb_epoch=4, 
      validation_data=[X_test, y_test]) 

X_test_new = np.array([[0,0,0,0,0,0,0,0,0,12,3,55,4,34,5,45,3,9],[0,0,0,0,0,0,0,1,7,65,34,67,34,23,24,67,54,43,]]) 

classes = model.predict(X_test_new, batch_size=16) 
print(classes) 

マイ出力右の寸法ですが、私は0-1に浮かぶ与えている:

は、私は現在、これは持っています。私はこれがバイナリのクラス分類を探しているからだと思う。誰でもこれを修正する方法を知っていますか?

解決
(X_train, y_train), (X_test, y_test), maxlen, word_ids, tags_ids = prep_model(
    nb_words=nb_words, test_len=75) 

W = (y_train > 0).astype('float') 

print(len(X_train), 'train sequences') 
print(int(len(X_train)*val_split), 'validation sequences') 
print(len(X_test), 'heldout sequences') 

# this is the placeholder tensor for the input sequences 
sequence = Input(shape=(maxlen,), dtype='int32') 

# this embedding layer will transform the sequences of integers 
# into vectors of size 256 
embedded = Embedding(nb_words, output_dim=hidden, 
        input_length=maxlen, mask_zero=True)(sequence) 

# apply forwards LSTM 
forwards = LSTM(output_dim=hidden, return_sequences=True)(embedded) 
# apply backwards LSTM 
backwards = LSTM(output_dim=hidden, return_sequences=True, 
       go_backwards=True)(embedded) 

# concatenate the outputs of the 2 LSTMs 
merged = merge([forwards, backwards], mode='concat', concat_axis=-1) 
after_dp = Dropout(0.15)(merged) 

# TimeDistributed for sequence 
# change activation to sigmoid? 
output = TimeDistributed(
    Dense(output_dim=nb_classes, 
      activation='softmax'))(after_dp) 

model = Model(input=sequence, output=output) 

# try using different optimizers and different optimizer configs 
# loss=binary_crossentropy, optimizer=rmsprop 
model.compile(loss='categorical_crossentropy', 
       metrics=['accuracy'], optimizer='adam', 
       sample_weight_mode='temporal') 

print('Train...') 
model.fit(X_train, y_train, 
      batch_size=batch_size, 
      nb_epoch=epochs, 
      shuffle=True, 
      validation_split=val_split, 
      sample_weight=W) 
+0

データの小さなサンプルをアップロードしてください。モデルの仕組みをよりよく理解するのに役立ちます。可能でない場合は、生データがどのように見えるか、モデルにデータを送る前にデータ前処理のために行ったことについて少し説明してください。 –

答えて

4

ただラベルが各バイナリ配列であることを確認してください

を解決しました。主な問題は、分類カテゴリのデータをバイナリ配列として再構成することでした。また、TimeDistributedを使用し、return_sequencesをTrueに設定しました。

+0

作業コードを追加することは可能でしょうか? thx – PSNR

+0

もちろん、上の編集を参照してください。 – ChrisDH

+0

ありがとう!埋め込みレイヤーで 'mask_zero = True'を使用すると、次のレイヤーすべてがこのクラスを無視して損失、精度などを計算すると思いますか?そして、出力層の 'nb_classes'はクラス+ 1でなければならないと思います(つまり、バイナリクラス分類の問題は3です)。再度、感謝します! – PSNR