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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

1004閲覧

[Python,LSTM]ゼロ除算エラーになる

potekuma1028

総合スコア3

深層学習

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/11/27 08:19

前提・実現したいこと

LSTMでの学習を行う時に0除算によるエラーが起こる。
本に載っていた元々1入力のモデルを自分で2入力に直しているので、そこの部分で何か修正が足りていない可能性があると思うのですが、どこを直せばいいかわかりません。

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

Exception in main training loop: division by zero Traceback (most recent call last): File "C:\annaconda3\lib\site-packages\chainer\training\trainer.py", line 346, in run entry.extension(self) File "C:\annaconda3\lib\site-packages\chainer\training\extensions\evaluator.py", line 180, in __call__ result = self.evaluate() File "C:\annaconda3\lib\site-packages\chainer\training\extensions\evaluator.py", line 234, in evaluate for batch in it: File "C:\annaconda3\lib\site-packages\chainer\iterators\serial_iterator.py", line 70, in __next__ self._previous_epoch_detail = self.epoch_detail File "C:\annaconda3\lib\site-packages\chainer\iterators\serial_iterator.py", line 96, in epoch_detail return self.epoch + self.current_position / self._epoch_size Will finalize trainer extensions and updater before reraising the exception. --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-30-60286bd83ea7> in <module> 55 trainer.extend(extensions.PrintReport(['epoch','main/loss','validation/main/loss','main/accuracy','validation/main/accuracy'])) 56 # 機械学習を実行する ---> 57 trainer.run() 58 # 学習結果を保持する 59 chainer.serializers.save_npz('tempture_model_Osaka_2weeks.npz',stock_net) C:\annaconda3\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg) 374 f.write('Traceback (most recent call last):\n') 375 traceback.print_tb(sys.exc_info()[2]) --> 376 six.reraise(*exc_info) 377 finally: 378 for _, entry in extensions: C:\annaconda3\lib\site-packages\six.py in reraise(tp, value, tb) 701 if value.__traceback__ is not tb: 702 raise value.with_traceback(tb) --> 703 raise value 704 finally: 705 value = None C:\annaconda3\lib\site-packages\chainer\training\trainer.py in run(self, show_loop_exception_msg) 344 for name, entry in extensions: 345 if entry.trigger(self): --> 346 entry.extension(self) 347 except Exception as e: 348 if show_loop_exception_msg: C:\annaconda3\lib\site-packages\chainer\training\extensions\evaluator.py in __call__(self, trainer) 178 with reporter: 179 with configuration.using_config('train', False): --> 180 result = self.evaluate() 181 182 reporter_module.report(result) C:\annaconda3\lib\site-packages\chainer\training\extensions\evaluator.py in evaluate(self) 232 pbar = _IteratorProgressBar(iterator=it) 233 --> 234 for batch in it: 235 observation = {} 236 with reporter_module.report_scope(observation): C:\annaconda3\lib\site-packages\chainer\iterators\serial_iterator.py in __next__(self) 68 69 def __next__(self): ---> 70 self._previous_epoch_detail = self.epoch_detail 71 self._state, indices = _statemachine.iterator_statemachine( 72 self._state, self.batch_size, self.repeat, self.order_sampler, C:\annaconda3\lib\site-packages\chainer\iterators\serial_iterator.py in epoch_detail(self) 94 @property 95 def epoch_detail(self): ---> 96 return self.epoch + self.current_position / self._epoch_size 97 98 @property ZeroDivisionError: division by zero

該当のソースコード

python

1import chainer 2import chainer.functions as F 3import chainer.links as L 4import numpy as np 5import os 6import csv 7from chainer.training import extensions 8from chainer import training, datasets, iterators, optimizers 9 10# ニューラルネットワークのモデル 11class Tempture_NN(chainer.Chain): 12 13 def __init__(self): 14 super(Tempture_NN, self).__init__() 15 with self.init_scope(): 16 self.c1 = L.StatefulGRU(2, 32) 17 self.c2 = L.StatefulGRU(32, 32) 18 self.c3 = L.StatefulGRU(32, 10) 19 20 def __call__(self, x, reset=True): 21 # LSTMのステータスをクリアする 22 if reset: 23 self.c1.reset_state() 24 self.c2.reset_state() 25 self.c3.reset_state() 26 # 入力された分を計算する 27 result = [] 28 aa = '' 29 for i in range(x.shape[1]): 30 batch = x[:,i] 31 h1 = self.c1(batch) 32 h2 = self.c2(h1) 33 h3 = self.c3(h2) 34 # 結果の足し合わせをニューロンの数で平均する 35 h4 = F.sum(h3, axis=1) / 10.0 36 result.append(h4) 37 return result 38 39# 気温データからRNNの教師データを作成する関数 40def get_sourceset(tempture, size): 41 result_data = [] 42 # 過去のすべての月に対して 43 for i in range(len(tempture)-size*3-1): 44 source = [] 45 result = [] 46 # 先月と来月を取得する 47 for j in range(i, i+size-1): 48 dif = np.float32(tempture[j]) 49 res = np.float32(tempture[j+size*2][0]) 50 add = np.array([dif], dtype=np.float32) 51 source.append(add) 52 result.append(res) 53 result_data.append((source,result)) 54 return result_data 55 56tempture_data = [] 57 58with open('Osaka.csv', 'r', encoding="sjis") as file: 59 reader = csv.reader(file) 60 for i in range(5): 61 header = next(reader) 62 for row in reader: 63 t1 = float(row[1]) 64 t2 = float(row[2]) 65 # -10 から40度の範囲を0から1にする 66 tempture_data.append([(t1 - 369) / 516,(t2-1060) / 145]) 67 68# 直近48か月分を除く 69tempture_train = tempture_data[0:len(tempture_data)-31] 70# 直近48か月分をテスト用にする 71tempture_test = tempture_data[len(tempture_data)-31:len(tempture_data)] 72# 24か月のウィンドウでRNN用のデータにする 73temp_dataset = get_sourceset(tempture_train, 14) 74test_temp_dataset = get_sourceset(tempture_test, 14) 75# 損失関数を定義する 76def loss_func(result, label): 77 loss = 0 78 for i in range(len(result)): 79 # 次の月の気温との比較を求める 80 loss += F.mean_squared_error(result[i],label[:,i]) 81 return loss 82# 確度関数を定義する 83def acc_func(result,label): 84 acc = 0 85 for i in range(len(result)): 86 # 差の絶対値の平均 87 dif = result[i].data - label[:,i] 88 acc += 1.0 - np.mean(np.abs(dif)) 89 return acc / len(result) 90 91# 配列をchainerのイテレーターにする 92batch_size = 64 93train_iter = iterators.SerialIterator(temp_dataset, batch_size) 94test_iter = iterators.SerialIterator(test_temp_dataset, batch_size, repeat=False) 95# ニューラルネットワークのモデルを作成 96stock_net = Tempture_NN() 97model = L.Classifier(stock_net, lossfun = loss_func, accfun = acc_func) 98# 学習アルゴリズムの選択 99optimizer = chainer.optimizers.RMSpropGraves() 100optimizer.setup(model) 101# 学習モデルを作成 102updater = training.StandardUpdater(train_iter, optimizer) 103# 25エポック分学習させる 104trainer = training.Trainer(updater, (50, 'epoch'), out = "result") 105# テストを実行 106trainer.extend(extensions.Evaluator(test_iter, model)) 107# 学習進展を表示するようにする 108trainer.extend(extensions.LogReport()) 109trainer.extend(extensions.ProgressBar(update_interval = 10)) 110trainer.extend(extensions.PrintReport(['epoch','main/loss','validation/main/loss','main/accuracy','validation/main/accuracy'])) 111# 機械学習を実行する 112trainer.run() 113# 学習結果を保持する 114chainer.serializers.save_npz('tempture_model_Osaka_2weeks.npz',stock_net)

試したこと

acc_funcに問題があるのか、又は入力データの作り方に問題があるのか?

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問