1

私はニューラル ネットワークにまったく慣れておらず、あまり経験がありません。私の問題は次のとおりです。配列、877 の異なるデータ ポイント、データ ポイントあたり 200 の機能があります。これは、PCA で縮小された TfIdf マトリックスであり、各行は、データセットからのテキストの 1 つのブロック (つまり、段落自体) に対応します。このデータ (クラス 1 または 0) のバイナリ分類子を作成しようとしています。次のように、線形 SVM で 80% 程度の精度を達成し、単純な高密度 NN で約 80% の精度を達成しました。

model = Sequential()
    len = np.shape(X_train)[0]
    dim = np.shape(X_train)[1]
    model.add(Dense(100, input_dim=dim, activation='relu'))
    model.add(Dense(25, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    #set up stopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto')
    #fit the model to the data
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping])

そこで、RNN が自然言語処理で非常に人気があることを知りました。ほぼ同じ方法で設定してみました。ただし、データには 3 次元があるはずだと理解しています。これがどのように機能するかについて非常に混乱しています。私はこの質問に基づいてコードを書きました: LSTM with keras this asker does not have 3 dimension in his data. 彼は 2 次元だけでどのように仕事をしているのでしょうか? 私のコードは次のとおりです。

model = Sequential()
    len = np.shape(X_train)[0]
    dim = np.shape(X_train)[1]
    model.add(LSTM(output_dim = 100, input_length=len, input_dim = dim, return_sequences=True))
    model.add(Dense(25, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    #set up stopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=4, mode='auto')
    #fit the model to the data
    model.fit(X_train, y_train,epochs=500, batch_size=64,verbose = 1, validation_data =(X_test,y_test),callbacks = [early_stopping])

これがどのように異なるのか、なぜこのエラーが発生し続けるのかを誰かが説明してもらえますか:ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (877, 200)

3次元は本当に必要ですか?もしそうなら、2D(データポイント、特徴)配列を3Dに変換するにはどうすればいいですか? 御時間ありがとうございます。

- - - - - - - - - - - - - - 編集 - - - - - - - - - - - -------------

したがって、コードを次のように変更しました。

 X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
    t_steps = np.shape(X_train)[1]
    dim = np.shape(X_train)[2]
    print(length,',',dim)
    model.add(LSTM(output_dim = 100, input_shape = (t_steps,dim), return_sequences=True))

次のエラーが発生しています(t_steps == 1およびdim == 200)

ValueError: Error when checking target: expected dense_2 to have 3 dimensions, but got array with shape (877, 1)

ここからどこへ行くべきかわからない。

----------------------------編集#2------------------- ---------------

私が設定した場合、return_sequences = Falseそれが機能することがわかりました。しかし、私の精度は恐ろしいもので、47% です。

4

1 に答える 1