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

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

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

0回答

1207閲覧

tf.nn.rnn_cell.BasicLSTMCellクラスを実装したい

bam_boo

総合スコア0

深層学習

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2021/05/17 05:05

前提・実現したいこと

現在、Tensorflowでtf.nn.rnn_cell.BasicRNNCellクラスにより、RNNを実装しているのですが、LSTMを試してみたく、tf.nn.rnn_cell.BasicRNNCellクラスをtf.nn.rnn_cell.BasicLSTMCellクラスにプログラムを書き換えることで、LSTMを実装したいと考えております。

そこで、とりあえず単純に、tf.nn.rnn_cell.BasicRNNCellの部分のプログラムを、tf.nn.rnn_cell.BasicLSTMCellに書き換え、codeを実行したところ、学習については、順調にできたのですが、結果を変数に保存する際に、ValueError: Must pass 2-d input. shape=(2, 1, 6)というエラーが出てしましました。

https://docs.w3cub.com/tensorflow~1.15/nn/の解説を見る限り、tf.nn.rnn_cell.BasicRNNCellクラスとtf.nn.rnn_cell.BasicRNNCellクラスで出力時の形状に違いがないと考えているのですが、このエラーの原因は何なのでしょうか?

アドバイスや解決策を知っている方がいましたらご教授いただけると幸いです。
また、質問で不足している事項がありましたら、ご指摘ください。よろしくお願いします。

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) <ipython-input-10-84b9bc02605b> in <module> 14 predict_air_quality = pd.DataFrame([], columns=air_quality.columns) 15 for current_time in test_dataset.times: ---> 16 predict_result = rnn_predict(air_quality[air_quality.index < current_time]) 17 predict_air_quality = predict_air_quality.append(predict_result) <ipython-input-10-84b9bc02605b> in rnn_predict(input_dataset) 8 predict_data = prediction.eval({x: batch_x}) 9 ---> 10 df_standardized = pd.DataFrame(predict_data, columns=input_dataset.columns, index=[predict_time]) 11 12 return train_mean + train_std * df_standardized c:\users\hwel\anaconda3\envs\tensor\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy) 556 mgr = init_dict({data.name: data}, index, columns, dtype=dtype) 557 else: --> 558 mgr = init_ndarray(data, index, columns, dtype=dtype, copy=copy) 559 560 # For data is list-like, or Iterable (will consume into list) c:\users\hwel\anaconda3\envs\tensor\lib\site-packages\pandas\core\internals\construction.py in init_ndarray(values, index, columns, dtype, copy) 190 # by definition an array here 191 # the dtypes will be coerced to a single dtype --> 192 values = _prep_ndarray(values, copy=copy) 193 194 if dtype is not None and not is_dtype_equal(values.dtype, dtype): c:\users\hwel\anaconda3\envs\tensor\lib\site-packages\pandas\core\internals\construction.py in _prep_ndarray(values, copy) 326 values = values.reshape((values.shape[0], 1)) 327 elif values.ndim != 2: --> 328 raise ValueError(f"Must pass 2-d input. shape={values.shape}") 329 330 return values ValueError: Must pass 2-d input. shape=(2, 1, 6)

該当のソースコード

ソースコードの全体は以下の通りです。

import os from urllib.request import urlretrieve from urllib.parse import urlparse from zipfile import ZipFile def download_file(url, output_dir, overwrite=False): # URLからファイル名を取得 parse_result = urlparse(url) file_name = os.path.basename(parse_result.path) # 出力先ファイルパス destination = os.path.join(output_dir, file_name) # 無意味なダウンロードを防ぐため、上書き(overwrite)の指定か未ダウンロードの場合のみダウンロードを実施する if overwrite or not os.path.exists(destination): # 出力先ディレクトリの作成 os.makedirs(output_dir) # ダウンロード urlretrieve(url, destination) return destination zip_file = download_file('https://archive.ics.uci.edu/ml/machine-learning-databases/00360/AirQualityUCI.zip', 'UCI_data/') import pandas as pd with ZipFile(zip_file) as z: with z.open('AirQualityUCI.xlsx') as f: air_quality = pd.read_excel( f, index_col=0, parse_dates={'DateTime': [0, 1]}, #(1) na_values=[-200.0], #(2) convert_float=False #(3) ) # 不要列の除去 target_columns = ['T', 'AH', 'PT08.S1(CO)', 'PT08.S2(NMHC)', 'PT08.S3(NOx)', 'PT08.S4(NO2)'] air_quality = air_quality[target_columns] import numpy as np # 乱数シードの初期化(数値は何でもよい) np.random.seed(12345) # クラス定義 class TimeSeriesDataSet: def __init__(self, dataframe): self.feature_count = len(dataframe.columns) self.series_length = len(dataframe) self.series_data = dataframe.astype('float32') def __getitem__(self, n): return TimeSeriesDataSet(self.series_data[n]) def __len__(self): return len(self.series_data) @property def times(self): return self.series_data.index def next_batch(self, length, batch_size): """ 連続したlength時間のデータおよび1時間の誤差測定用データを取得する。 最後の1時間は最終出力データ。 """ max_start_index = len(self) - length design_matrix = [] expectation = [] while len(design_matrix) < batch_size: start_index = np.random.choice(max_start_index) end_index = start_index + length + 1 values = self.series_data[start_index:end_index] if (values.count() == length + 1).all(): # 切り出したデータ中に欠損値がない train_data = values[:-1] true_value = values[-1:] design_matrix.append(train_data.values) expectation.append(np.reshape(true_value.values, [self.feature_count])) return np.stack(design_matrix), np.stack(expectation) def append(self, data_point): dataframe = pd.DataFrame(data_point, columns=self.series_data.columns) self.series_data = self.series_data.append(dataframe) def tail(self, n): return TimeSeriesDataSet(self.series_data.tail(n)) def as_array(self): return np.stack([self.series_data.values]) def mean(self): return self.series_data.mean() def std(self): return self.series_data.std() def standardize(self, mean=None, std=None): if mean is None: mean = self.mean() if std is None: std = self.std() return TimeSeriesDataSet((self.series_data - mean) / std) dataset = TimeSeriesDataSet(air_quality) train_dataset = dataset[dataset.times.year < 2005] test_dataset = dataset[dataset.times.year >= 2005] import tensorflow as tf sess = tf.InteractiveSession() # 再現性の確保のために乱数シードを固定 tf.set_random_seed(12345) # パラメーター # 学習時間長 SERIES_LENGTH = 24 # 特徴量数 FEATURE_COUNT = dataset.feature_count # 入力(placeholderメソッドの引数は、データ型、テンソルのサイズ) # 訓練データ x = tf.placeholder(tf.float32, [None, SERIES_LENGTH, FEATURE_COUNT]) # 教師データ y = tf.placeholder(tf.float32, [None, FEATURE_COUNT]) # LSTMセルの作成 cell = tf.nn.rnn_cell.BasicLSTMCell(100) initial_state = cell.zero_state(tf.shape(x)[0], dtype=tf.float32) outputs, last_state = tf.nn.dynamic_rnn(cell, x, initial_state=initial_state, dtype=tf.float32) # 全結合 # 重み w = tf.Variable(tf.zeros([100, FEATURE_COUNT])) # バイアス b = tf.Variable([0.1] * FEATURE_COUNT) # 最終出力(予測) prediction = tf.matmul(last_state, w) + b # 損失関数(二乗平均絶対誤差:RMSE)と最適化(Adam) loss = tf.sqrt(tf.reduce_mean((prediction - y)**2)) optimizer = tf.train.AdamOptimizer().minimize(loss) # バッチサイズ BATCH_SIZE = 1024 # 学習回数 NUM_TRAIN = 10_0 # 学習中の出力頻度 OUTPUT_BY = 10 # 標準化 train_mean = train_dataset.mean() train_std = train_dataset.std() standardized_train_dataset = train_dataset.standardize() # 学習の実行 sess.run(tf.global_variables_initializer()) for i in range(NUM_TRAIN): batch = standardized_train_dataset.next_batch(SERIES_LENGTH, BATCH_SIZE) rmse, _ = sess.run([loss, optimizer], feed_dict={x: batch[0], y: batch[1]}) if i % OUTPUT_BY == 0: print('step {:d}, error {:.2f}'.format(i, rmse)) def rnn_predict(input_dataset): # 標準化 previous = TimeSeriesDataSet(input_dataset).tail(SERIES_LENGTH).standardize(mean=train_mean, std=train_std) # 予測対象の時刻 predict_time = previous.times[-1] + np.timedelta64(1, 'h') batch_x = previous.as_array() predict_data = prediction.eval({x: batch_x}) df_standardized = pd.DataFrame(predict_data, columns=input_dataset.columns, index=[predict_time]) return train_mean + train_std * df_standardized predict_air_quality = pd.DataFrame([], columns=air_quality.columns) for current_time in test_dataset.times: predict_result = rnn_predict(air_quality[air_quality.index < current_time]) predict_air_quality = predict_air_quality.append(predict_result)

また、ソースコードの該当箇所は以下の部分です。

for current_time in test_dataset.times: predict_result = rnn_predict(air_quality[air_quality.index < current_time]) predict_air_quality = predict_air_quality.append(predict_result)

補足情報

TensorflowのバージョンにつきましてはTensorflow-gpu==1.15を使用しております。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問