🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

2回答

653閲覧

自分でニューラルネットワークを作ろうの記事にあるプログラムの意味

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2021/03/22 01:28

https://qiita.com/takahiro_itazuri/items/d2bea1c643d7cca11352#activationfunctionpy

ここの一番最後の、
ThreeLayerNetwork.py
のプログラムの意味なんですが、
実行結果は、

#epoch 0
train: 0 / 60000
train: 1000 / 60000
train: 2000 / 60000
train: 3000 / 60000
train: 4000 / 60000
train: 5000 / 60000
train: 6000 / 60000
train: 7000 / 60000
train: 8000 / 60000
train: 9000 / 60000
train: 10000 / 60000
train: 11000 / 60000
train: 12000 / 60000
train: 13000 / 60000
train: 14000 / 60000
train: 15000 / 60000
train: 16000 / 60000
train: 17000 / 60000
train: 18000 / 60000
train: 19000 / 60000
train: 20000 / 60000
train: 21000 / 60000
train: 22000 / 60000
train: 23000 / 60000
train: 24000 / 60000
train: 25000 / 60000
train: 26000 / 60000
train: 27000 / 60000
train: 28000 / 60000
train: 29000 / 60000
train: 30000 / 60000
train: 31000 / 60000
train: 32000 / 60000
train: 33000 / 60000
train: 34000 / 60000
train: 35000 / 60000
train: 36000 / 60000
train: 37000 / 60000
train: 38000 / 60000
train: 39000 / 60000
train: 40000 / 60000
train: 41000 / 60000
train: 42000 / 60000
train: 43000 / 60000
train: 44000 / 60000
train: 45000 / 60000
train: 46000 / 60000
train: 47000 / 60000
train: 48000 / 60000
train: 49000 / 60000
train: 50000 / 60000
train: 51000 / 60000
train: 52000 / 60000
train: 53000 / 60000
train: 54000 / 60000
train: 55000 / 60000
train: 56000 / 60000
train: 57000 / 60000
train: 58000 / 60000
train: 59000 / 60000
・・・
#epoch 9
train: 0 / 60000
train: 1000 / 60000
train: 2000 / 60000
train: 3000 / 60000
train: 4000 / 60000
train: 5000 / 60000
train: 6000 / 60000
train: 7000 / 60000
train: 8000 / 60000
train: 9000 / 60000
train: 10000 / 60000
train: 11000 / 60000
train: 12000 / 60000
train: 13000 / 60000
train: 14000 / 60000
train: 15000 / 60000
train: 16000 / 60000
train: 17000 / 60000
train: 18000 / 60000
train: 19000 / 60000
train: 20000 / 60000
train: 21000 / 60000
train: 22000 / 60000
train: 23000 / 60000
train: 24000 / 60000
train: 25000 / 60000
train: 26000 / 60000
train: 27000 / 60000
train: 28000 / 60000
train: 29000 / 60000
train: 30000 / 60000
train: 31000 / 60000
train: 32000 / 60000
train: 33000 / 60000
train: 34000 / 60000
train: 35000 / 60000
train: 36000 / 60000
train: 37000 / 60000
train: 38000 / 60000
train: 39000 / 60000
train: 40000 / 60000
train: 41000 / 60000
train: 42000 / 60000
train: 43000 / 60000
train: 44000 / 60000
train: 45000 / 60000
train: 46000 / 60000
train: 47000 / 60000
train: 48000 / 60000
train: 49000 / 60000
train: 50000 / 60000
train: 51000 / 60000
train: 52000 / 60000
train: 53000 / 60000
train: 54000 / 60000
train: 55000 / 60000
train: 56000 / 60000
train: 57000 / 60000
train: 58000 / 60000
train: 59000 / 60000
performance: 0.2292

こうなったのですが、いまいち何をやっているのかよく分かりません。
たぶんtestデータの方をtrainデータと比較計算する事で、testデータを成型していると思うのですが、epoch9とかtrain0とかは何を表していて、具体的に何を行っているのでしょうか。
trainもtestも、数字画像のピクセル変換データがひたすら、一行ずつ、しかも適当に、重複ありで並んでいるだけであり、これをどうしているのか・・・?

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

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

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

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

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

guest

回答2

0

jbpb0さんの説明のとおりですが、ちょっと補足。

まず、このソース、それほど難しいわけではありませんよ。 特に、記事前半の説明の部分がわかっていれば、むしろ簡単です。 なので、その説明の部分をしっかり読み込むのが近道でしょう。

ソースのクラスの内容については、説明にある通りです。

メインの処理は、

  • ニューラルネットワークをパラメータを設定して生成
  • トレーニングデータとテストデータをファイルから読み込み
  • ニューラルネットワークをトレーニングデータで学習
    epoc は 学習させる回数です。 同じデータで複数会学習させます。このコードでは10回ですね。
  • 学習させたニューラルネットワークで、テストデータを1つずつ評価し、正解かどうか判定しています。
    正解となったテストデータの割合を performance として表示する。

★ この最後に出る結果が、正解だった割合(正解率)になっているところがわかりにくいんでしょうね。
"「2」のテストデータが「2」と判定された"とか"「9」のテストデータが「6」と判定された"というような事実が出てくることを期待しているのでしょうから、ちょっと期待外れでしょう。 ですが、そういう情報を出すと10000個出てしまうし、評価するのも大変です。

それぞれのテストデータがどのように評価されたかを知りたければ、テストのループの中を工夫して望みの結果が出力されるようにすればいいでしょう。

投稿2021/03/22 13:19

TakaiY

総合スコア13770

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

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

退会済みユーザー

退会済みユーザー

2021/03/23 12:00

つまりまず教師データで学習をさせている、という事でしょうか?? どうやっているんだろう・・・。
TakaiY

2021/03/23 15:18

>という事でしょうか?? ということです。 どうやっているか、はちゃんとサイトの説明に書いてありますよ。
退会済みユーザー

退会済みユーザー

2021/03/23 16:12

自分はこれ、画像認識の精度をあげるためのものかと思っていたのですが、 画像認識の精度を「はかる」ものなんですかね? なら、精度をあげて認識~とはいかないんでしょうか? ニューラルを使って、認識精度をあげるプログラムが見たい・・・。
TakaiY

2021/03/24 01:02

これは、NNを構築して、学習させて、学習の結果を計るものですね。 精度を上げるには利用者の「作業」が必要です。 いろいろなパラメータを調整したり、よりよい教師データを集めたり、活性化関数を工夫するなどです。 ただ、jbpb0さんの指摘にもあるとおり、現状の認識率がサイトの値と違いすぎます。 何か間違えているか、そもそもサイトのコードが間違えているなどそこは調査する必要があります。
退会済みユーザー

退会済みユーザー

2021/03/29 18:24 編集

実はsigmoid_rangeを省略しており、これを追加して、そのまま実行すると問題ない、同じ精度になりました。 自分は、このプログラムは、 3のデータを3、4のデータを4 と、より精度高く判断できるものかと思っていたのですが、 実際出力されるのはPerformansの値だけ・・・ これを3のデータを3、4のデータを4と表示させるように改良した場合は、 最後の「テスト」の所をいじればいいんですかね・・・? あと個別のコードの質問になるのですがまず、 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) これ、どういう意味があるんでしょうか、{0:>5d}って何なんでしょうか・・・。
TakaiY

2021/03/30 01:14

まずはprint関数のformatメソッドについて。 標準の関数のメソッドなので公式ドキュメントを見ればわかるでしょう。 検索してもいろいろ出てきますよ。 検索して出てきたサイト(https://gammasoft.jp/blog/python-string-format/)後半に説明があります。 >これを3のデータを3、4のデータを4と表示させるように改良した場合は、最後の「テスト」の所をいじればいいんですかね 先にも書いたとおり、ソースを良く読めばわかると思うんですがね。 「#テスト」とあるところで、テストデータを判定させています。 その中の 「 tlabel = int(val[0]) 」 このtlabelが テストデータのラベル(=元々の数字) で、「plabel = np.argmax(predict)」 のplabelが判定して出てきた結果です。 なので、ループの中でそれぞれの値を表示してみれば、どんなデータがどのように判定されたのかわかります。 (10000個表示されますけど) また、 predict には、全結果(1がxx%,2がxx%..というような値)が入っているので、細かくしらべると、「8と6が間違えやすい」などと分析もできるでしょう。 自分で用意した画像を判定させたいなら、「nn.feedforward(<データ>)」とすれば、どのように判定されるか確認できます。
退会済みユーザー

退会済みユーザー

2021/04/01 21:32

なるほど、ところで、 順伝播についてはちょっと勉強したのですが、 これ、どうやってトレーニングデータによるトレーニングを行っているんでしょうか・・・? テストデータを、トレーニングデータを見本として調整していく・・・とかいうのは分かるんですが、 トレーニングデータのみで、何をどうトレーニングしているのか・・・?
TakaiY

2021/04/02 05:48

それこそがニューラルネットの確信なので、ちゃんと勉強することをお勧めします。 トレーニングにテストデータは使いません。 そもそもデータには、正解(2とか4とか)が付いています。 ニューラネットにデータを入れると判定結果が出ます。これほトレーニング前の状態(ランダムな値で設定されている)でも出力されます。 この結果と正解とを比較して「逆誤差伝搬」を使ってパラメータを調整することで「学習」させます。 学習の強度はちょっとずつなので、同じデータを複数回使って学習することもよくあります。この例ではepochで設定される回数がそれです。
退会済みユーザー

退会済みユーザー

2021/04/02 05:51

ひとまずプログラムの意味を理解しようかなと思うのですが、、個別の質問ですが、 epoch = 10 for e in range(epoch): print('#epoch ', e) data_size = len(training_data_list) for i in range(data_size): if i % 1000 == 0: print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) val = training_data_list[i].split(',') idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01 tdata = np.zeros(onodes) + 0.01 tdata[int(val[0])] = 0.99 nn.backprop(idata, tdata) pass pass ここの、 if i % 1000 == 0: これ、なんの意味があるんでしょうか? iが1000の倍数、ならばprint?? そんなのまれだと思うのですが、毎回printされてるような・・・。
TakaiY

2021/04/02 05:54

ちゃんと1000個毎に出力されてるじゃないですか。 train: 0 / 60000 train: 1000 / 60000 train: 2000 / 60000
退会済みユーザー

退会済みユーザー

2021/04/03 23:13

自分で色々やってみて、理解しました・・・ ところで、またつまづいてしまった所があるのですが、 あまりに数値の数が多いため、 mnist_train.csv 1,2,3,4,5 6,7,8,9,10 mnist_test.csv 9,8,7,6,5 4,3,2,1,0 としたのですが、 shapesのエラーが出ます、たぶんパラメータ # パラメータ inodes = 784 hnodes = 100 onodes = 10 lr = 0.3 を変更する必要があると思うのですが、lrは関係ないとして、各nodesをいくらぐらいにすれば良いのでしょうか・・・;
TakaiY

2021/04/05 11:31

それらのCSVのなにを変えたんでしょう? 中身を変えたんだとしたら、それはデータの形が合わないのでエラーになりますよ。
guest

0

ベストアンサー

epoch9とかtrain0とかは何を表していて

python

1 # 学習 2 epoch = 10 3 for e in range(epoch):

で、そのforループでエポックを10回実行します
各エポックで、eには0〜9が代入されます

epoch 0

とかは、そのeが表示されてるもので、今何エポック目の実行かを表示してます

python

1 data_size = len(training_data_list) 2 for i in range(data_size):

で、一つのエポック内で、そのforループで「trainデータ」全部が一回使われます

train: 1000 / 60000

とかは、今データのいくつ目まで進んでるかを表示してます

10回目のエポック(e=9)の全「trainデータ」(60000個)まで行けば、学習は終わりです

その次に、

python

1# テスト

からで、「testデータ」で正解率を測定してます
「testデータ」の画像部分(idata)からの推定(plabel)と、正解(tlabel)が一致した回数を数えて、それを全「testデータ」数(scoreboard_array.size)で割った値を

python

1 print('performance: ', scoreboard_array.sum() / scoreboard_array.size)

で表示して終わり

performance: 0.2292
なので、正解率23%

投稿2021/03/22 02:45

編集2021/03/23 04:40
jbpb0

総合スコア7653

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

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

退会済みユーザー

退会済みユーザー

2021/03/29 18:25 編集

実はsigmoid_rangeを省略しており、これを追加して、そのまま実行すると問題ない、同じ精度になりました。 自分は、このプログラムは、 3のデータを3、4のデータを4 と、より精度高く判断できるものかと思っていたのですが、 実際出力されるのはPerformansの値だけ・・・ これを3のデータを3、4のデータを4と表示させるように改良した場合は、 最後の「テスト」の所をいじればいいんですかね・・・? あと個別のコードの質問になるのですがまず、 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) これ、どういう意味があるんでしょうか、{0:>5d}って何なんでしょうか・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問