SSブログ

Week5(ニューラル・ネットワークの第2週)を終了した [Octave]

(2018.09.21)
Machine Learning(↓)のWeek5まで終了しました。
https://www.coursera.org/learn/machine-learning/home/welcome

構築したニューラル・ネットワークを使って手書き文字(数字)を認識した結果(↓)です。

Training Set Accuracy: 95.260000

先日調べたニューラル・ネットワークの認識率(<==97.52%)より若干低くなった理由は分かりません。取り敢えず提出してみると・・・

>> submit
== Submitting solutions | Neural Networks Learning...
Use token from last successful submission :
==
== Part Name | Score | Feedback
== --------- | ----- | --------
== Feedforward and Cost Function | 30 / 30 | Nice work!
== Regularized Cost Function | 15 / 15 | Nice work!
== Sigmoid Gradient | 5 / 5 | Nice work!
== Neural Network Gradient (Backpropagation) | 40 / 40 | Nice work!
== Regularized Gradient | 10 / 10 | Nice work!
== --------------------------------
== | 100 / 100 |
パチパチパチ~

バックプロパゲーション(実行結果から逆に、重みづけベクターを修正していく)の組み込みはとても苦労しました。なんとか書き上げて実行してみたのですが結果が合いません。orz

何度見直しても駄目だったので、止む無く他の方のコードを拝見したのですが・・・

????(ほとんど)同じ????


他の方のコードに置き換えると正しい実行結果が得られるのに、自分のコードだと何故駄目なのか?
途中の計算を比較しても、違いが見つかりません。orz

順番に確認を進めて、最後に出力する行列のサイズを調べたところ・・・あっ!


Theta2_grad = (D3' * A2)/m + lambda*Theta2/m;
Theta1_grad = (D2' * A1)/m + lambda*Theta1/m;


Theta1_grad = (D3' * A2)/m + lambda*Theta2/m; <== これを間違えていた
Theta2_grad = (D2' * A1)/m + lambda*Theta1/m; <== これを間違えていた

戻り値は1次元ベクトルなので、Theta1_gradとTheta2_gradが入れ替わっても、その後の計算は支障なく進んだものと思われます。(<==結果だけが異なる)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人もお世話になっています(↓)


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

バックプロパゲーションの回答部分だけを記すとこんな感じ(↓)です。
A1 = [ones(m, 1) X];
Z2 = A1 * Theta1';
A2 = sigmoid( Z2 );
A2 = [ones(m, 1) A2];
Z3 = A2 * Theta2';
A3 = sigmoid( Z3 );

for c =1:num_labels
  J = J - sum((y==c).*log(A3(:,c))+(1-(y==c)).*log(1-A3(:,c)))/m;
endfor
  Theta1(:,1) = 0;
  Theta2(:,1) = 0;
  J = J + lambda*(sum(Theta1(:).^2)+sum(Theta2(:).^2))/(2*m);
  
D3 = zeros(size(A3));

for c =1:num_labels
  D3(:,c) = A3(:,c) - (y==c);
endfor
  
  D2 = (D3*Theta2).*sigmoidGradient( [ones(size(Z2, 1), 1) Z2] );
  D2 = D2(:, 2:end);
  
  Theta2_grad = (D3' * A2)/m + lambda*Theta2/m;
  Theta1_grad = (D2' * A1)/m + lambda*Theta1/m;


どうやら、大きな山場を越えたようです。

これで管理人は、自力でニューラル・ネットワークを構築できるようになりました。(多分)
<==本当かね~

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人もお世話になっています(↓)







nice!(2)  コメント(0) 
共通テーマ:日記・雑感

いよいよNeural Networksに取り組む [Octave]

(2018.09.20)
Machine Learning(↓)の受講を始めて3週間近く経ちました。
https://www.coursera.org/learn/machine-learning/home/welcome

途中経過はこんな感じ(↓)です。
9/3 受講開始
9/10 第1週の課題提出(<==期限ギリギリ)
9/17 第2週の課題提出(<==期限ギリギリ)
9/19 第3週の課題提出(<==余裕の提出)
9/20 第4週の課題提出(<==勢い付いて連続提出) 

ここに来て調子付いてます。¥(・_・)

2018_0920_1.png手書きの数字
いよいよニューラル・ネットワークで手書き文字の認識!と張り切ったのですが、
最初の課題は、ロジスティック回帰分析を使ったマルチクラスの分類でした。

先週の課題で分かったつもりになっていた『ロジスティック回帰分析』でしたが、実際にマルチクラスの分類をやらされて、四苦八苦しました。

それでも、何とかlrCostFunction.mを書き上げて(<==カンニングしてません)実行すると・・・
Testing lrCostFunction() with regularization
Cost: 2.534819
Expected cost: 2.534819
Gradients:
0.146561
-0.548558
0.724722
1.398003
Expected gradients:
0.146561
-0.548558
0.724722
1.398003
Program paused. Press enter to continue.

実行した結果とExpectedが一致しました。
パチパチパチ~

lrCostFunction.mの回答はこんな感じ(↓)
hx = sigmoid(X * theta );
theta(1) = 0;
J = -sum(y.*log(hx)+(1-y).*log(1-hx))/m + lambda/(2*m)*(sum(theta.^2));
grad = X'*(hx - y)/m + lambda/m*theta;

マルチクラスの分類でも合否判定(二値)クラスの分類と同じコスト関数です。
当然と言えば当然なんですが・・・添え字でループ回したらこうは行きません。
あらためてベクトル表記の威力を感じます。

続いて、20×20ピクセル画像5000枚を教師付き学習(<==Θベクトルを最適化)するonevsAll.mを書き上げて(<==カンニングしてません)実行すると・・・
Training One-vs-All Logistic Regression...
Iteration 50 | Cost: 1.405529e-02
Iteration 50 | Cost: 5.725224e-02
Iteration 50 | Cost: 6.397841e-02
Iteration 50 | Cost: 3.810361e-02
Iteration 50 | Cost: 6.186249e-02
Iteration 50 | Cost: 2.205048e-02
Iteration 50 | Cost: 3.554620e-02
Iteration 50 | Cost: 8.549827e-02
Iteration 50 | Cost: 7.939720e-02
Iteration 50 | Cost: 9.886766e-03
Program paused. Press enter to continue.

何か結果は出ますが、この段階では正否は分かりません。

さらに結果を判定するpredictOneVsAl.mを書いて実行した結果は・・・
Training Set Accuracy: 9.80000 <== 認識率9.8% orz

どこに間違いがあるのか????

最初は何も考えず、ex2からコピーしたコード(↓)をpredictOneVsAl.mに書きました。
hx = sigmoid(X * theta);
for i=1:m
if( hx(i) >= 0.5 )p(i)=1;
endif
endfor

改めて、predictOneVsAl.mに書かれた指示を読み直すと・・・
『You should set p to a vector of predictions (from 1 to num_labels).』
『Hint: This code can be done all vectorized using the max function.』

今ならすんなり読み取れますが、最初は回答のことを考えながら目で英文を追いかけるので意味が読み取れません。hxの中(5000×10ベクトル)を調べなおして、漸く指示(↑)の意味が分かってきました。

書きなおしたpredictOneVsAl.mのコードがこれ(↓)です。
hx = sigmoid( X1 * all_theta' );
for i=1:m
[ w,iw ] = max ( hx(i,:) );
p(i)=iw;
endfor

で、改めてex3を実行してみると・・・
Training Set Accuracy: 95.000000
パチパチパチ~

if( hx(i) >= 0.5 )p(i)=iw;とすると89%に下がります。どちらが正しいのか?分かっていません。

勢いに乗ってpredict.mを書き上げex3_nnを実行すると・・・
Loading and Visualizing Data ...
Program paused. Press enter to continue.

Loading Saved Neural Network Parameters ...

Training Set Accuracy: 97.520000
Program paused. Press enter to continue.

ロジスティック回帰の認識率が95.00%
ニューラル・ネットワークの認識率が97.52%
思ったより地味な結果です。
しかしこの後、さらに驚きの結果が待ち受けていました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人もお世話になっています(↓)


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

>> submit
== Submitting solutions | Multi-class Classification and Neural Networks...
Use token from last successful submission :
Iteration 33 | Cost: 3.391340e-01
Iteration 23 | Cost: 6.631438e-02
Iteration 34 | Cost: 1.002636e-01
Iteration 20 | Cost: 3.598119e-01
Iteration 50 | Cost: 2.353348e-07
Iteration 50 | Cost: 2.353348e-07
Iteration 50 | Cost: 2.353348e-07
Iteration 50 | Cost: 2.353348e-07
Iteration 50 | Cost: 2.353348e-07
Iteration 50 | Cost: 2.353348e-07
==
== Part Name | Score | Feedback
== --------- | ----- | --------
== Regularized Logistic Regression | 30 / 30 | Nice work!
== One-vs-All Classifier Training | 0 / 20 | <==何故!
== One-vs-All Classifier Prediction | 20 / 20 | Nice work!
== Neural Network Prediction Function | 30 / 30 | Nice work!
== --------------------------------
== | 80 / 100 |
==

自力でここまで(なんとか)やってきたのですが、この結果に打ちのめされました。orz

しかし、『困った時のGoogle先生』で他の方の回答を調べても、間違いは見つかりませんでした。
これは一体どういうことなのでしょうか?

暫し悩んで・・・

まぁ、達成率80%でも合格ですから気にせず先に進みます。(<==結果オーライな奴)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人もお世話になっています(↓)


nice!(1)  コメント(0) 
共通テーマ:日記・雑感

Machine LearningのWeek3を終了した [Octave]

(2018.09.19)
Machine Learning(↓)を受講しています。
https://www.coursera.org/learn/machine-learning/home/welcome

期限ギリギリで課題を提出したWeek1とWeek2と違って、今回(Week3)は余裕です。¥(・_・)
ビデオ講義の受講に大夫慣れてきた気がします。先達の知恵を借りて予習しているのが大きいようです。
こことか(↓)
https://qiita.com/junichiro/items/ee50af10df77d52cd432
こことか(↓)
https://qiita.com/katsu1110/items/423fc9ac567710a1bd9b

2018_0919_1.png発展課題にも着手した
lambda = 1,0,100,0.3についてフィッティングの様子を調べてみました。

costFunctionReg.mの課題を最初はこんな風に書いたのですが・・・
hx = sigmoid(X * theta );
J = -sum( y.*log(hx) + (1-y).*log(1-hx))/m + lambda/(2*m)* ( sum( theta .^2 ) - theta(1).^2);
grad = X'*( hx - y )/m + lambda/m*theta;
grad(1) = X(:,1)'*( hx - y )/m;

先達の知恵を借りてこんな風に書き直しました。
theta(1) = 0;
J = -sum(y.*log(hx)+(1-y).*log(1-hx))/m + lambda/(2*m)* ( sum( theta.^2));
grad = X'*( hx - y )/m + lambda/m*theta;

なるほど~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
機械学習に興味はあるけど英語は嫌! Pythonが良い!と言う方には



学びに疲れた時は・・・

Octaveは凄い [Octave]

(2018.09.17)

今、これ(↓)に取り組んでいます。
https://www.coursera.org/learn/machine-learning/home/welcome

段々、受講のコツが掴めてきました。
(1)日本語テキストを斜め読みして、ザッと内容を把握しておく。
(2)日本語字幕を眺めながら説明ビデオを見る。
(3)課題はちゃんと取り組む。

概論的な内容で1週目が済んだので気楽に構えていたら、2週目のエクササイズでガツンとやられました。提出期限ぎりぎりだというのにOctaveを上手く扱えません。orz

結局、カンニング(↓)して課題をクリアしました。
http://blog.soushi.me/entry/2017/03/10/125749

2018_0917_1.png何とか課題をクリア?

このままでは落ちこぼれ必至なので、おまけの課題(多変数の線形回帰と正規方程式を用いた解法)に取り組むことにしました。ここでベクトル表記の威力が炸裂しました。

1変数のコスト関数がこちら(↓)で、
J = sum((X*theta-y).^2)/(2*m); <==これをパクッてきた

2変数のコスト関数は・・・
J = sum((X*theta-y).^2)/(2*m); <==これは自分で考えた(?)

1変数の最急降下法がこちら(↓)で、
for iter = 1:num_iters
    theta = theta - alpha / m * X' * (X * theta -y);    <==パクッてきた
    J_history(iter) = computeCost(X, y, theta);
end

2変数の最急降下法は・・・
for iter = 1:num_iters
    theta = theta - alpha / m * X' * (X * theta -y);  <==これは自分で考えた(?)
    J_history(iter) = computeCostMulti(X, y, theta);
end

そうなんです。ベクトルで表記すると1変数も多変数も同じなんです。さらっと行列計算をこなすOctaveすげ~

正規化方程式だって・・・
theta = pinv(X'*X)*X'*y; <==これは自分で考えた(?)
考えたって言うレベルではありませんね。これ以外に書きようが無いんだから・・・
2018_0917_2.png補講もクリア

自分で課題を解いてみて、少しやる気が出てきました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー






nice!(1)  コメント(0) 
共通テーマ:日記・雑感

LCDKeypadのスイッチ操作がおかしくなった [電子工作]

(2018.09.13)

一週間ほど前に、LCDKeypadのスイッチ操作が動いたという報告をしましたが、2、3日前から動作がおかしくなってしまいました。何も押していないのにSELECTと表示されたり、LEFTと表示するべきところでNONEと表示します。

ちゃんと動いていたときはこんな感じ(↓)だったのですが・・・
https://broadbeans.blog.so-net.ne.jp/2018-09-05

スイッチを操作したときのADC計測値を比較してみました。

       09/05   09/13
NOKEY_LVL = 1023 ==> 370     ;
SELKEY_LVL = 450 ==> 970
DOWNKEY_LVL = 400 ==> 190
UPKEY_LVL = 320 ==> 250
RIGHTKEY_LVL = 64 ==> 80
LEFTKEY_LVL = 32 ==>  740

Arduinoのライブラリではどうなっているのか?調べて見ました。
#define KEYPAD_TRESHOLD_NONE 1000
#define KEYPAD_TRESHOLD_SELECT 790
#define KEYPAD_TRESHOLD_LEFT 555
#define KEYPAD_TRESHOLD_DOWN 380
#define KEYPAD_TRESHOLD_UP 195
#define KEYPAD_TRESHOLD_RIGHT 50

ライブラリの値は閾値なので意味合いが少し異なります。しかし大小関係は同じになる筈です。ところが09/05時点でLEFTKEY_LVLが最小(=32)となっている(<==これで安定していた)のが既におかしかったようです。そして今は、操作したキーの大小関係は良いのですが、何も操作していないときの値がおかしなことになっています。さらに困ったことに、LCDと基板との隙間に息を吹き込むと値が大きく変化するのです。上に示した09/13の計測値は、最も良さそうな状態になった所で計測したものです。隙間に息を吹き込むと(多分)値は変化してしまいます。

半田付け不良(ブリッジorショート)が疑われますが、LCDの下に隠れていて調べられません。orz

安さにつられて買ったのですが、すごく心証が悪くなりました。
価格は二倍になりますが、やはりこちら(↓)を選ぶべきだったのでしょうか?
http://akizukidenshi.com/catalog/g/gM-07029/

あるいは、こんなものと割り切って使える範囲で使うことにするか?

やっぱり、隙間に息を吹き込むと変化してしまうというのでは駄目だなぁ~
もう一つあるので、そちらの様子で使い続けるかどうか、決めようと思います。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー






nice!(1)  コメント(0) 
共通テーマ:日記・雑感

DS18B20を繋いでみた [電子工作]

(2018.09.10)

PIC16F1829にLCDKeypadと1Wireの温度センサ(DS18B20)を繋いでみました。
https://www.maximintegrated.com/jp/products/sensors/DS18B20.html

プログラムはArduino用のライブラリ(↓これです)をPIC用に書き換えたものを使いました。
https://github.com/PaulStoffregen/OneWire

2018_0910_1.png温度センサ2回路の接続

CGRAMにオリジナルの記号(℃)を作ったのは初めてですが、なかなか良い感じです。
CGRAMアドレス0x00に以下のパターン(↓)を登録しました。
**       18
**       18
  **     06
 *  *    09
 *       08
 *  *    09
  **     06
         00

℃記号を作成するプログラムはこんな感じです
void lcd_create_deg(void)
{
    lcd_command( 0x40  );
    lcd_data( 0x18 );
    lcd_data( 0x18 );
    lcd_data( 0x06 );
    lcd_data( 0x09 );
    lcd_data( 0x08 );
    lcd_data( 0x09 );
    lcd_data( 0x06 );
    lcd_data( 0x00 );
}

さらにI2C接続のADコンバータとK型熱電対を接続し、AC100Vの電力制御回路を組み込んで、半田こて2個を制御できる、半田付け支援装置に仕上げる計画です。

準備は着々と進んでいます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー






nice!(1)  コメント(0) 
共通テーマ:日記・雑感

PICにAruduino用シールドを接続した [電子工作]

(2018.09.05)

PICでAruduino用シールド(LCDKeypad)を動かすことが出来ました。
パチパチパチ~

嬉しかったので動画(↓)を撮影してしまいました。
2018_0905_1.png
動画へのリンクはこちら
https://youtu.be/lOXfCkIrFdg

Aruduino用シールドは安い(↓)ので、利用しない手はありません。
2018_0905_2.png
リンクはこちら

殆ど技術資料がないので困りましたが、ここ(↓)に置かれたライブラリを見つけて、開発することが出来ました。
https://github.com/arduino-libraries/LiquidCrystal

¥500足らずでLCDと操作キーが手に入るなんて夢のようです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー






nice!(1)  コメント(0) 
共通テーマ:日記・雑感

サンマを食べた [料理]

(2018.08.31)

まだ8月だというのに、新鮮なサンマ(<==解凍ものではない奴)をいただきました。
内臓もプリプリして美味!産地(根室 花咲漁港)では豊漁が続いて大変なことになっているようです。
https://headlines.yahoo.co.jp/videonews/fnn?a=20180828-00399641-fnn-soci

産地では新鮮なサンマが無料なのだとか!
https://www.fnn.jp/posts/00399713CX

調べてみると、脂の乗ったサンマの見分け方について、二説あるようで・・・
背が盛り上がる説
http://be365.info/archives/529.html
くちばしが黄色説
http://www.mamiyaenzo.jp/blog/49

今朝食べたのは、背が盛り上がっていてくちばしの黄色いサンマでした。\(^_^)/

管理人の家では、サンマを極薄く油を引いたフライパンで焼きます。サンマから出た油でこんがり焼き色が付きます。燻された香りを欠くのはちょっと残念なのですが・・・

ロースターの中で脂の乗ったサンマに火が付いて黒焦げ(<==煤だらけになったロースターを掃除しながら家内がブンむくれた)になる心配もありません。

葡萄(デラウェア)を摘まみながら、一足早い食卓の秋を感じました。
(外は今日もかんかん照りですけど)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人もお世話になっています。







nice!(1)  コメント(0) 
共通テーマ:日記・雑感

同じ間違いを(また)繰り返した [電子工作]

(2018.08.30)

PIC16F1829を使ってPICの開発を行っています。少し複雑なプログラムですが、少しづつ前進しています。そんな中、デバッグ作業で以前にやらかした間違いをまた繰り返してしまいました。orz

プログラムの動作を追いかけるため、スナップ・ダンプを取ろうとしたところ、それまで問題無く動いていた機能が動かなくなりました。リセットすると回復するので、プログラム・コードの問題では無さそうなのですが・・・

PIC16F1829はデータ・メモリを1024バイト(プログラム・メモリは8192バイト)搭載しています。
2018_0830_2.pngPIC16F1829のデータ・メモリ

そのデータ・メモリは複数のバンク・メモリ(128バイト単位)で構成されていて、データ・メモリ(1024バイト)と言うのはGeneral Purpose RAM(1008バイト)とCommon RAM(16バイト)の合計です。
2018_0830_1.pngPICのバンク・メモリ構成

スナップ・ダンプを取るため、以下のデバッグ・バッファを設けました。承知して居るはずなのについやらかしてしまいました。

unsigned char debug_buff[16] @0x200; <==これが問題悪化の元凶

頭の中にあったのは、『データ・メモリの前半26%まで使っているから50%相当の場所にバッファを割り当てよう』というものでした。

そして、スナップ・ダンプ(事後解析用にデータをバッファに書き出す)を取りながら、不具合を抱えた処理を実行してみると、何か様子が変です。以前より動作がおかしくなっています。

何が何だか判らなくなってしまいました。

こんな時、慌ててプログラム・コードをいじり回しても良い結果が得られ無いことは承知しています。不具合に遭遇するのは慣れているのです。(^_^;)<==変に自慢げな奴

作業を中断して、頭を冷やすことにしました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
(数時間後)
あっ!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

バンク・メモリの前半にコア・レジスタが配置されていることを思い出しました。重要機能を司るレジスタ群をスナップ・ダンプで書き換えていたのです。

2018_0830_3.png0x200のレジスタ割り当て

そして、一緒に思い出しました。
『これ、前にもやったことある』と前回も思ったことを・・・
この誤りを繰り返すこと(多分)三度目です。(<==無駄に経験を積み重ねる奴)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人が気になっている広告です。





nice!(1)  コメント(0) 
共通テーマ:日記・雑感

Microchipが売り出した格安のデバッガを見つけた [電子工作]

(2018.08.26)

MPLAB-X 5.05で数種類のデバイスをシミュレーションしていた時、Hardware ToolsのメニューにSnapという項目が追加されていることに気づきました。
2018_9826_1.pngSnapってなんだ?

こんな動画”Unboxing the New MPLAB[レジスタードトレードマーク] Snap Debugger”(↓)が見つかりました
https://www.youtube.com/watch?v=9apkQXDsL38

概要はこんな(↓)感じです。
http://microchipdeveloper.com/snap:start

「an ultra-low priced debugging solution」と謳っています。売価$15程なので純正デバッガとしては格安です。

「it supports many of Microchip’s newer MCU offerings but not some legacy products.」
古いデバイスの書き込みに必要な電圧を発生させる回路を省略したらしく、新しいデバイスだけがサポート対象という、かなり割り切った決断を下しています。

説明資料はこれ(↓)です。
http://www.microchip.com/developmenttools/ProductDetails/PartNO/PG164100

「必要ならケースは3Dプリンタで自作する」っていうのも今時は有りなのかもしれません。(格安デバッガですから)

ただ、古い人間としてはMicrochipから絶縁状を突きつけられているような気もします。新しいデバイスの殆どが0.5mmピッチのTQFPパッケージに移行していて、それに対応出来なければ取り残されてしまうのですから・・・

書き込み電圧発生回路をオプションで付けられるようになると嬉しいんだけどなぁ~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー



こちら(↓)は管理人もお世話になっています。



nice!(1)  コメント(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。