前提・実現したいこと
複数の時系列特徴量をLSTMを用いて学習させ、分類器を作成したいです。
データセットは、35種類×20個で計700の.csvファイルからなり、
その1つ1つの中に、150種類の特徴量が時系列データとして100個並んでいます。
これらは、LSTMをよりわかりやすく&より詳細に!(前処理・python実践編)を参考にさせていただき、
look_backを10と設定した、700個のNumpy配列に格納したうえで、
その全てを訓練データ及びテストデータとして扱うために、さらに1つのNumpy配列に格納しています。
これによりデータの次元は以下のようになっています。
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.20) print(x_train.shape) # (560, 89, 150, 10) print(y_train.shape) # (560, 35) print(x_test.shape) # (140, 89, 150, 10) print(y_test.shape) # (140, 35)
発生している問題・エラーメッセージ
上記のデータをLSTMへの入力として扱うために、現在構築しているモデル構造がこちらになります。
Python
1CATEGORIES = 35 2frames = 89 3features = 150 4look_back = 10 5 6def build_model(): 7 model = Sequential() 8 model.add(LSTM(256, input_shape=(features, look_back), return_sequences=True)) 9 model.add(Dense(1024, activation="relu")) 10 model.add(Dense(CATEGORIES, activation="softmax")) 11 model.compile(loss="categorical_crossentropy", 12 optimizer=Adam(lr=0.002), 13 metrics=["categorical_accuracy"]) 14 return model 15 16model = build_model() 17model.summary() 18 19early_stopping = EarlyStopping(patience=5) 20model.fit(x_train,y_train, 21 batch_size=8, 22 epochs=50, 23 verbose=1, 24 validation_split=0.2, 25 shuffle=True, 26 callbacks=[early_stopping]) 27 28evaluation=model.evaluate(x_test, y_test, batch_size=8, verbose=1)
しかし、現状では入力として与えている次元とLSTMが想定している次元が異なっているため、以下のエラーが返されています。
ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (560, 89, 150, 10)
試したこと
そこで、KerasのレイヤーラッパーであるTimeDistributedを用いることを考え、
コード中のLSTMブロック部分を、
model.add(TimeDistributed(LSTM(256, input_shape=(features, look_back), return_sequences=True)))
に変更してみたのですが、エラーとして以下が返されてしまいました。
ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.
ここでのTimeDistributedはどのように実装するのが正確なのでしょうか?
そもそもの解決方法として、TimeDistributedの利用は適切なのでしょうか?
アドバイスやご指摘等ありましたらお願いいたします。
更新
コードのbuild_model()を以下に変更したところ、hidden_layerの部分で次のようなTypeErrorが返されました。
def build_model(): input_tensor = Input(shape=(timesteps, features, look_back)) lstm_out = TimeDistributed(LSTM(256, return_sequences=True))(input_tensor) lstm = Model(inputs=input_tensor, outputs=lstm_out) hidden_layer = Dense(1024, activation="relu")(lstm) outputs = Dense(CATEGORIES, activation="softmax")(hidden_layer) model = Model([input_tensor], outputs) model.compile(loss="categorical_crossentropy", optimizer=Adam(lr=0.002), metrics=["categorical_accuracy"]) return model
Traceback (most recent call last): File "predict.py", line 100, in <module> model = build_model() File "predict.py", line 87, in build_model hidden_layer = Dense(150, activation="relu")(lstm) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 827, in __call__ self._maybe_build(inputs) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 2088, in _maybe_build self.input_spec, inputs, self.name) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py", line 201, in assert_input_compatibility raise TypeError('Inputs to a layer should be tensors. Got: %s' % (x,)) TypeError: Inputs to a layer should be tensors. Got: <tensorflow.python.keras.engine.functional.Functional object at 0x7fd2c661c160>
補足情報(FW/ツールのバージョンなど)
Python3.6.9
TensorFlow2.4.0
あなたの回答
tips
プレビュー