質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

2040閲覧

[TensorFlow]多変量LSTMによる分類モデルにおけるTimeDistributedの使い方およびTypeError

MyuW

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/07 12:32

編集2021/01/07 15:21

前提・実現したいこと

複数の時系列特徴量を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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問