現在pythonのkerasでLSTMで2クラス分類を行うプログラムの実装をしています。
入力データは3つの時系列データを1つのエクセルデータに保存し、プログラム上で1つのデータとしてLSTMに入力します。
この3つの時系列データは各エクセルファイルによってデータ長が違うこともあり、input_shapeでエラーが出てしまいます。
入力データのshapeは
(3,161), (3,149),(3, 167), (3, 186)...
などバラバラです。
特に, input_shapeの部分で、どのようにプログラムを変更したら良いか教えていただきたいです。
html
1import numpy as np 2import glob 3import random 4import matplotlib.pyplot as plt 5import numpy as np 6import pandas as pd 7import xlrd 8import tensorflow as tf 9from keras.models import Sequential 10from keras.layers.core import Dense 11from keras.layers.recurrent import LSTM 12from keras.optimizers import Adam 13from sklearn.model_selection import train_test_split 14 15 16###################### 変更パラメータ###################### 17folder = ["file1","file2"] 18input_dim = 2 # 入力データの次元数:実数値3個なので3を指定 19n_hidden = 300 # 隠れ層 20num_epochs=100 # エポック数 21num_batch_size=96 # バッチサイズ 22num_classes = 2 # 識別クラス数 23###################### 変更パラメータ###################### 24 25 26###################### 入力データの最適化 ###################### 27X = [] 28Y = [] 29for index, name in enumerate(folder): 30 dir = "./" + name 31 files = glob.glob(dir + "/*.xlsx") 32 for i, file in enumerate(files): 33 envelope_data = pd.read_excel(file, header=None) 34 data = np.array(envelope_data ) 35 X.append(data) 36 Y.append(i) 37 38# 学習用データとテストデータの分割 39X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20) 40###################### 入力データの最適化 ###################### 41 42 43output_dim = 1 # 出力データの次元数:同上 44num_hidden_units = 128 # 隠れ層のユニット数 45len_sequence = 200 # 時系列の長さ 46learning_rate = 0.001 # 学習率 47num_training_samples = 1000 # 学習データのサンプル数 48 49 50 51model = Sequential() 52 53model.add(LSTM(32, return_sequences=True, input_shape=(?,?,?))) 54model.add(LSTM(8, return_sequences=True)) 55model.add(Dense(2, activation='softmax')) 56 57###################### モデルの汎化性能評価 ###################### 58# モデルコンパイル 59model.compile(loss='categorical_crossentropy', # 損失の基準は交差エントロピー誤差 60 optimizer='Adam', # 最適化アルゴリズムの選択 61 metrics=['accuracy']) # 学習評価として正解率を指定 62 63# 実行。出力はなしで設定(verbose=0)。 64# 実行。出力ありで設定(verbose=1)。 65history = model.fit(X_train, 66 y_train, 67 batch_size=num_batch_size, # バッチサイズ 68 epochs=num_epochs, # エポック回数 69 verbose=1, 70 validation_data=( 71 X_test, 72 y_test)) 73 74plt.plot(history.history['accuracy']) 75plt.title('model accuracy') 76plt.xlabel('epoch') # x軸のラベルの設定 77plt.ylabel('accuracy') # y軸のラベルの設定 78plt.legend(['acc'], loc='lower right') 79plt.show() 80# テストデータに対するエポック毎のLossとAccuracy 81score = model.evaluate(X_test, y_test, verbose=0) 82 83### 最終エポック時のLossとAccuracy ### 84print('Test Loss:{0:.3f}'.format(score[0])) 85print('Test accuracy:{0:.3}'.format(score[1]))
エラー内容
html
1Input 0 is incompatible with layer lstm_5: expected ndim=3, found ndim=4
あなたの回答
tips
プレビュー