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

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

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

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

深層学習

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

Q&A

0回答

840閲覧

回帰型ニューラルネットワークの学習にて発生する問題点

takamy

総合スコア0

Keras

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

深層学習

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/04/23 15:23

前提・実現したいこと

Pythonでニューラルネットワークを作成しております。
*** 詳細 ***

  • 回帰型3層誤差逆伝播法(SGD)ニューラルネットワーク
  • 中間層の活性化関数はReLU関数
  • 出力層の活性化関数は恒等関数
  • 損失関数は二乗和誤差関数
  • 教師データから一定数のデータを抽出し勾配を計算するミニバッチ学習(確率的勾配降下法を使用)

現在は、ライブラリscikit learnの中のload_bostonのデータを簡略化し、
入力信号1:出力信号1としています。
また中間層における、ニューロン数は5としています。

参考:ゼロから作るDeep Learning (オライリージャパン)

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

学習が進むにつれて出力信号yが一定値となってしまいます。
初回の順伝播処理では入力に対して出力yは様々な値をとっていることを確認したため、
逆伝播処理に問題があるのではないかと考えております。
原因調査を進めていたのですが、完全に手詰まりです。
どなたかご教授願えないでしょうか。

該当のソースコード

・逆伝播処理が含まれるのは2. TLNet.pyとなります

1. main.py

python

1import time 2import numpy as np 3import matplotlib.pyplot as plt 4from TLNet import TwoLayerNet 5 6# 開始時刻 7time1 = time.time() 8 9# データのインポート 10train = np.loadtxt('train_data.csv', delimiter=',') 11test = np.loadtxt('test_data.csv', delimiter=',') 12 13# データの分割 14x_train = train[:, 0] 15t_train = train[:, 1] 16x_test = test[:, 0] 17t_test = test[:, 1] 18 19# 初期設定 20input_size = 1 21output_size = 1 22hidden_size = 5 23 24# ニューラルネットワークの初期化 25network = TwoLayerNet(input_size, hidden_size, output_size) 26 27# 設定 28itr_num = 1000 29train_size = x_train.shape[0] 30batch_size = 10 31learning_rate = 0.1 32 33train_loss_list = [] 34itr_list = [] 35x_batch = np.zeros((batch_size, input_size)) 36t_batch = np.zeros((batch_size, output_size)) 37 38iter_per_epoch = max(train_size/batch_size, 1) 39 40# start learning NewralNetwork 41for itr in range(itr_num): 42 43 itr_list.append(itr) 44 45 # 学習データをピック 46 batch_mask = np.random.choice(train_size, batch_size) 47 x_batch[:,0] = x_train[batch_mask] 48 t_batch[:,0] = t_train[batch_mask] 49 50 # forward 51 fw_p = network.forward(x_batch, t_batch) 52 53 # 誤差の記録 54 train_loss_list.append(fw_p['loss']) 55 56 # backward 57 dout = 1 58 bw_p = network.backward(fw_p, dout) 59 grad = {} 60 for name in ('W1','b1', 'W2', 'b2'): 61 grad[name] = bw_p['d' + name] 62 63 # update parameter 64 network.update(grad, learning_rate) 65 66plt.plot(itr_list, train_loss_list) 67plt.show() 68print('start', train_loss_list[0], 'fin', train_loss_list[itr_num-1]) 69 70total_time = time.time() - time1 71print('Analysis Time : ', total_time)
2. TLNet.py

python

1import numpy as np 2import functions 3 4class TwoLayerNet: 5 def __init__(self, input_size, hidden_size, output_size, \ 6 weight_init_std = 0.01): 7 # パラメータの初期化 8 self.params = {} 9 self.params['W1'] = weight_init_std* \ 10 np.random.randn(input_size, hidden_size) 11 self.params['b1'] = weight_init_std * np.random.randn(hidden_size) 12 self.params['W2'] = weight_init_std* \ 13 np.random.randn(hidden_size, output_size) 14 self.params['b2'] = weight_init_std * np.random.randn(output_size) 15 16 self.t = None 17 18 def forward(self, x, t): 19 fw_p = {} 20 fw_p['p0'] = x 21 self.t = t # 今回のイタレーションにおける正解ラベル(t_batch)を格納 22 # forward処理 23 fw_p['p1'] = np.dot(x , self.params['W1']) + self.params['b1'] 24 fw_p['relu_mask'], fw_p['p2'] = functions.relu(fw_p['p1']) 25 fw_p['p3'] = np.dot(fw_p['p2'], self.params['W2']) + self.params['b2'] 26 fw_p['y'] = functions.identity(fw_p['p3']) 27 fw_p['loss'] = functions.sum_squared_error(fw_p['y'], self.t) 28 29 return fw_p 30 31 def backward(self, fw_p, dout=1): 32 bw_p = {} 33 # --- SGD part --- 34 batch_size = self.t.shape[0] 35 dout = (fw_p['y'] - self.t) / batch_size ? identity layer 36 37 # Affine2 layer 38 bw_p['db2'] = np.sum(dout, axis=0) 39 bw_p['dW2'] = np.dot(fw_p['p2'].T, dout) 40 dout = np.dot(dout, self.params['W2'].T) 41 42 # ReLU layer 43 dout[fw_p['relu_mask']] = 0. 44 45 # Affine1 layer 46 bw_p['db1'] = np.sum(dout, axis=0) 47 bw_p['dW1'] = np.dot(fw_p['p0'].T, dout) 48 return bw_p 49 50 def update(self, grad, learning_rate): 51 # update parameter 52 for key in ('W1','b1', 'W2', 'b2'): 53 self.params[key] -= learning_rate * grad[key]
3. functions.py

python

1import numpy as np 2 3# 恒等関数 4def identity(x): 5 return x 6 7# 二乗和誤差関数 8def sum_squared_error(y, t): 9 return np.sum((y-t)**2) / 2 10 11# ReLU関数 12def relu(x): 13 mask = (x <= 0) 14 out = x.copy() 15 out[mask] = 0 16 return mask, out

補足情報(FW/ツールのバージョンなど)

入出力のデータが必要な場合は解答欄にご記入ください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問