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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

127閲覧

python3を使ってニューラルネットワークを作成したが学習精度が一向に上がらない

babbleman

総合スコア107

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/18 03:23

こんにちは。
numpyも使わず行列の演算式から(転置化含め)フルスクラッチでニューラルネットワークを実装してみたのですが学習精度を一向に上げることが出来なかった為質問させていただきました。
今回実装したのが、1~5までの間の数字をランダムで5個選んで、数字が5個一致していれば0.99,一致していなければ0.01を出力する方向で10000回学習させました。
ただ、出力層を一つにすると上手く学習できなかったので出力層を二つにして、一致していた場合targets[0]を0.99、していなかった場合はtargets[1]を0.99にするなど色々工夫をしてみましたがうまくいきません。
それ以外にも足し算を同様の方法で学ばせようとしましたがうまくいきませんでした。

機械学習に関しては本当に初心者ですので、実装からなのでコードが長くなりますが評価の程をよろしくお願い致します。
ちなみに行列式に関しましては、dotが行列同士の掛け算、addが行列同士の足し算、transposeは転置です。
この辺の実装に関しましては複数のパターンで検証してみましたところ問題なく稼動致しました。
以下はニューラルネットワークの実装部分です。

python

1class neuralnetwork: 2 def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate=0.3): 3 self.inodes=inputnodes 4 self.hnodes=hiddennodes 5 self.onodes=outputnodes 6 self.lr=learningrate 7 self.wih=[[random.random()-0.5 for i in range(self.inodes)] for k in range(self.hnodes)] 8 self.who=[[random.random()-1 for i in range(self.hnodes)] for k in range(self.onodes)] 9 self.sig=lambda x:allmath.sigmoid(x) 10 self.dot=lambda x,y:allmath.dot(x,y) 11 self.tt=lambda x:allmath.transpose(x) 12 self.add=lambda x,y:allmath.add(x,y) 13 14 def query(self,inputs): 15 newmat=self.sig(self.dot(self.who,self.sig(self.dot(self.wih,inputs)))) 16 t=0 17 for i in newmat: 18 t+=i[0] 19 newmat=[[x[0]/t] for x in newmat] 20 return newmat 21 22 def train(self,inputs,target): 23 24 hiddeninput=self.dot(self.wih,inputs) 25 hiddenoutput=self.sig(hiddeninput) 26 27 finalinput=self.dot(self.who,hiddenoutput) 28 finaloutput=self.sig(finalinput) 29 30 finalerror=[[t[0]-fo[0]] for t,fo in zip(target,finaloutput)] 31 #出力層分の縦型1次元行列 32 hiddenerror=self.dot(self.tt(self.who),finalerror) 33 #中間層分の縦型1次元行列 34 35 36 37 38 self.who=self.add(self.who,self.dot([[fe[0]*o[0]*(1-o[0])*self.lr] for fe,o in zip(finalerror,finaloutput)],self.tt(hiddenoutput))) 39 self.wih=self.add(self.wih,self.dot([[he[0]*ho[0]*(1-ho[0])*self.lr] for he,ho in zip(hiddenerror,hiddenoutput)],self.tt(inputs))) 40``` 41そして、以下は学習の実行部分です。 42 43```python 44``` 45import neural 46import random 47import allmath 48 49manabu=neural.neuralnetwork(5,10,1) 50for i in range(10000): 51 if random.randint(1,5)==5:#125回に一回しか全て揃うことが無いので、5回に一回の割合でぞろ目がでて学習させるように設定 52 a=random.randint(1,5) 53 a=[a for k in range(5)] 54 else: 55 a=[random.randint(1,5) for k in range(5)] 56 57 targets=[0.0001] 58 59 if all(a[0]==k for k in a): 60 targets=[0.999] 61 62 63 a=[k/5*0.99+0.01 for k in a]#入力値を0.01~0.99に設定 64 a=allmath.transpose(a)#行列演算用に転置 65 targets=allmath.transpose(targets) 66 67 manabu.train(a,targets) 68 69 70 71for i in range(30): 72 if random.randint(1,5)==5: 73 a=random.randint(1,5) 74 a=[a for k in range(5)] 75 else: 76 a=[random.randint(1,5) for k in range(5)] 77 78 print(a) 79 a = [k / 5 * 0.99 + 0.01 for k in a] 80 print(manabu.query(a))#実行してみたところ、ぞろ目に関係なく全て1.0しか表示しない 81``` 82 83 84微分の式はおそらく間違っていないと思いました。テストデータの与え方や、リストの与え方などに問題があったことと思います。 85ご教授の程よろしくお願い申し上げます。

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

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

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

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

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

amahara_waya

2019/06/19 00:30 編集

学習の実行部分のコードにインデントミスが見られるので、修正してくださると幸いです。 また、自作モジュールと思われるallpathについてのコードを追記くださると、回答の参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問