2016/04/30

nRF51822でSEGGER J-Linkがつながらなくなった

タイトル通りだ。

Eddystoneサンプルを動かそうとKeilであれこれデバッグしていたのだが、その途中で急にJ-Linkがつながらなくなったのだ。
あらまあ。

アンインストールやインストールを繰り返したのであまり記録が残っていないのだが、メモとして残しておこう。


JLinkARM.dllが読み込めないとか見つからないとか、そういうログが出たと思う。
複数のSEGGERをインストールしていたので、なんか悪さをし始めたのかと思い、最新版を削除して、今まで使っていた安定版だけにしてみた。
が、変わらず。

Keilをあきらめ、nRFgo Studioで見てみることにした。
こっちもダメなのだが、エラーが「JLinkARM.dllが正しくインストールされていない」というようなことを告げていた。nRF Toolsをインストールせよとか何とか。

なので、あれをインストールしたり、これをインストールしたり、アンインストールしてやり直したり、再起動したり。
どれも変わらず。

1つ見つかったのは、レジストリ。
nRFgo Studio cannot load JLinkARM.dll, re-installing does not help. What went wrong? - Nordic Developer Zone
現象はこれと同じで、私はV5.12dをインストールした後、V5.10nをインストールして、V5.12dをアンインストールしていた。
そうすると、レジストリのInstallPathにはV5.12dの方が残っていたのだ。

きれいにしたかったので、SEGGERを全部アンインストールし、レジストリもregeditで削除して、V5.10nをインストールした。
そうすると「正しくインストールされていない」の現象は消えた。

 

が、JLinkARM.dllが正しく動いていないのは変わらない。
もう1枚あったnRF51822を使ってみると、こっちはちゃんと読めた。
nRFgo Studioには、リセット後にSystem OFFになってるんじゃないのー、みたいなことが書かれていたのだが、そんなこと言われてもどうしようもない。
そういうのを何とかするのが、あんたの仕事だろうが!と思うのだがね。。

正しくnRF51822が動いた後、また元のnRF51822に差し替えると、今度はnRFgo StudioでRegionの画面まで出てきた。
おお!とErase Allしようとすると、つながらない・・・。


ということで、タイミングとか、なんかそういうものっぽいから、コマンドラインから消すことにした。

> nrfjprog –e

これは—eraseallの省略形なのだが、全部消すオプションだ。
動かすと、エラーもなくすぐに終わった。
nRFgo Studioにつなぐと、見えた。

 

今回はたまたまうまくいっただけかもしれないが、困っていたら試すとよいかもしれん。

[nrf]nRF5 SDK for Eddystoneは動くのか? (4)

PCが新しくなったので、ビルド環境の確認も合わせて動かしてみた。
ボードはnRF51822で、for EddystoneはKeilでやっとこさ32KB以内に収めたバージョンだ。
だから、動くとは限らない。。。

環境確認だったら、ちゃんと動くとわかっているものでやるのが筋なのだが、連休だからこれでいいのだ。

 

sd_ble_gap_adv_start()で、NRF_ERROR_INVALID_PARAMが返ってきているのがわかった。
eddystone_advertising_manager.cのeddystone_ble_advertising_start()だ。
パラメータをeddystone_ble_registr_adv_cb()で設定するようなのだが、それが呼ばれずに開始しようとしてるから、パラメータ不正になっている。
では、それがいつ呼ばれるのが普通かを調べねばなるまい。

 

名前の通りコールバック関数で、eddystone_registration_ui_init()に渡している。
UIとついているから、ボタン操作とかと絡んでくるのか・・・と思ったが、それ以前に私がROMサイズを減らすために中身をコメントアウトしてた。
あははははぁ。

ただ、ボタンがないのはどうしようもないので、無理やり呼んでやることにした。
そうすると、パラメータエラーは発生しなくなった。
しなくなったのだが、Advertisingをしてくれるわけでもない。
再起動するわけでもない。
何が起きてるんだ??

実行を停止すると、SEVの行でいつも止まる。
その前がWFEだから、イベント待ちで停止したままなのだろう。
無線が出ているときであれば、途中で停止させると次に実行すると異常になってしまうのだが、無線が出てないせいか止めても再開しても普通に動く。
普通に動くのだが、無線が出てないので正しくは動いていない。

うーん。。。
いつもエラーさえ解消すればAdvertisingくらいは出てくれるのだが、ちょっと困りましたね。

2016/04/28

[cntk]New Release !!

ごめんね、適当なタイトルで。。。
おじさんも疲れているのよ。

Release CNTK version 1.1 (Windows+Linux) · Microsoft/CNTK

そんなわけで、v1.1がリリースされていました。
日本時間で、4月25日21時57分らしいので、それより前の人は更新するとよいのかも。

CUDAは7.5のままですが、ビルドする必要もないので、こだわりはいらないかもしれません。
探したけど、Visual Studio 2013 community版は探せなかったのだ。

 

だんだん、こうやって細かいことがどうでもよくなっていくのが、困ったものです。

[c++]モックというかスタブというかを作るのは難しそう

単体テストを作るときはGoogle Testを使うようになってきた。
あまり大したことをするわけではなく、TEST_Fと、SetUp()/TearDown()と、あとは集計機能を使うくらいだ。
だいたいCなので、これとFFFを組み合わせ、GCCなのでgcov/lcovでカバレッジを見ている。

 

ただ、最近C++を使うことがあった。
classが出てくると、はてモックというかスタブというか、とにかく偽物の本体をどうやって作ろうか、と悩むことになった。

Google Testなので、Google Mockがよいか、と調べているところなのだが、なかなか思ったことができるかどうかまでたどりつかない。
調べているのは、

  • 簡単に空関数をそれっぽく作ってくれる
  • できたら、呼び出し回数などをカウントしてくれるとうれしい
  • ただし、元ソースは変更しないで済む

というところ。

サンプルのPainterは、Turtleをコンストラクタでもらうようになっていたけど、たとえばこんな風にメンバ変数でインスタンスを持っている場合だったらどうしたらよいのだろう?

------
#include "Turtle.h"

class Painter {
public:
    Painter() {}
    ~Painter() {}

    bool DrawCircle(int x, int y, int r);

private:
    Turtle turtle_;
};

-------

Turtleクラスであることは決まっているので、ここをMockで代用することができない。
インスタンスだから、Turtleも中身を作らないとリンクエラーになるから、自分で空関数を書けばよいのだけど、それだけだと呼び出しカウントを数える処理も自分で書かないといけない。
そもそも、Google Mock使ってないし!

じゃあ、Turtle.h自体を書き換えようかと思ったけど、Painter.hとTurtle.hが同じディレクトリにある場合、インクルードパスの指定を別ディレクトリにしても、カレントを先に参照するようで、偽造したTurtle.hを読んでくれない。

うーむ・・・。


どうせファイルごとにしかテストしないので、一時的に本命のTurtle.hをリネームしておく、という方法でよいかもしれない。

格好は悪いのだけど、あまり時間を掛けたいところではないのよねぇ。

2016/04/27

[nrf]nRF5 SDK for Eddystoneは動くのか? (3)

今回は、紹介だけ。
NordicのBlogsにアップされていました。

nRF5 SDK for Eddystone™ introduced

開発の話ではなくて、新しいEddystoneはこんな感じですよ、という、文字通り導入部分の紹介のようです。

 

Advertisingにスロットの概念を持たせてるんだ、というのが驚いたところ。
なんとなく、Advertisingする内容はそんなに変化させないものだろうと思っていたので。

AndroidだとAdvertisingの内容はアプリで処理できそうだけど、iOSはどうなんだろう?
あんまりそういうのは許してないような気がしたけど、「Manufacturer Specific Dataは制約が掛けられている」というような情報があったから、それ以外については特に制約が無いのかも。

 

5月はそれほど仕事が無さそうだから、そういうので遊んでみましょうかね。

2016/04/25

MOUSERはマウサーかマウザーか?

太陽誘電さんのnRF52832評価ボードを見ていた。
E○SHほげほげ、というSHのついたやつがnRF52832で、○のところがBだと評価ボード、Kだと評価キットらしい。
ほげほげ、のところはモジュール自体の大きさで、今のところは大きいタイプしかなさそうだった。


今朝調べたときはDigikeyしか出てこなかったのだけど、今調べたらMOUSERしか出てこなくなった。
なんでだろう。。。まあいいや。

image

あれ、マウザーなの??
まあどういでもいいんだけど、マウサーと思っていたよ。
(皇帝マウザーしか思いつかんかった。)

image

Googleはマウサーだった。
会社名はマウサーで、問い合わせるのがマウザーかもしれんし。
Googleで検索した方は「マウサー」だったから誤字かもしれんが、世の中奥が深いこともあるから、気にしないようにしておく。


EBSHCNZXZ Taiyo Yuden | Mouser

今だと、日本円で13,326円くらい。
朝見たDigiKeyは、最初が11で始まっていたのは覚えているのだけど、それが日本円だったのかドルだったのかは忘れた。

 

調べ方のいい加減さでわかるかもしれないが、それほどnRF52に興味はないのだ。
16MHzくらいで動けば十分なことくらいしかやらんというか、できんというか。
使うとしたら、仕事で使うときだろうなぁ。。。
ああ、そういう意味なら、やはり興味はあることになりそうだ。

2個セットでこの値段だったらなー。
nRF52 DKは安そうだけど、技適通す人がいないような気がする。
合わせ技1本じゃないけど、2.4GHz帯は2ヶ国以上の電波法みたいなのを取得していたら日本で使える、とかなってくれるといいのに。

などと法律に関して適当なことを書くとよくないので少し調べてみた。
http://www.musenka.com/info/auth_overseas.html
いやあ、いっぱいあるんだねぇ。
やっぱり、目に見えないだけに法律できっちり決めておかないと、何かあってからでは遅いからか。

2016/04/22

[nrf]nRF5 SDK for Eddystoneは動くのか? (2)

2日目。

相変わらず動かず。
今回は実機に焼いているのだが、Advertisingの開始でパラメータエラーが発生している。
その前に呼んでいるのがTLM系の関数だから、32KBの壁を守るためにコメントアウトしたのがよくないのだろう。

しかし、コメントアウトを戻すとリンクサイズのエラーになるので、別の場所を削らないといけないようだ。
いい場所を探すのは、なかなか難しいな。

2016/04/20

[nrf]nRF5 SDK for Eddystoneは動くのか? (1)

今日はnRF5 SDK for Eddystoneを動かせるかどうかだけ確かめてみよう。
うちにあるのは、nRF51822のRAM 16KB版だ。

EddystoneはBeaconだけのイメージだったけど、GATTのソースが追加されているから、接続して何かするようになったのだろう。


まずは、ここに書いてある通りにやってみよう。
https://github.com/NordicSemiconductor/nrf5-sdk-for-eddystone

  1. 上記をcloneして、nRF5 SDK v11.0.0のexamples/ble_peripheralの下に置く。
  2. この中のsource/にあるcrypto_setup_all.shを実行する。
  3. project/pca10040_s132/arm5_no_packsに入っているKeilプロジェクトを開く。
    DeviceFamilyPack 8.3.1を求められるけど、無視して8.6.0に変更する。
  4. ビルド
  5. えーっと、エラーが出ました。。
    32KBに収まらない!
    オプションで最適化がかからないようになっていたので、もう一度。。。
    だめだ。。。
    RTTを削って。。。だめか。。。
    BSP_SIMPLEなら。。。あと、あとちょっとか。。。
    eddystone_registration_uiのボタンも削って。。。あと792バイト。。。
    eddystone_tlm_managerの中身を削って。。。あと616バイト。。。
    eddystone_flashの中身も削って。。。入った!

 

って、eddystone_flashは削ってもよいのか?
pstorageがあったからFLASH保存するのだろうけど。。。

手順としては、あとはnRF52 DKにS132を焼いて、今回のを焼けばいいらしい。


とりあえず、今日はここまで。

やっていてわかったのは、nRF52を使うようになったら、たぶんKeilだったら正式版じゃないとつらいんだろうな、ということだ。
まあ、nRF51だって256KBあるのだけど、nRF52の方が性能が高い分、あれこれやりたくなって、ROMがたくさんいるようになりそうだしね。

STM32の一部みたいに「このマイコンにはKeil無制限で使えるシリアルコード公開します!」みたいなのになるとうれしいのだが、まあ、ね。

そうなると、GCCでやるのがいいのかね。
そろそろLLVMも使えるのだろうか。
本家のコンパイラ(armccかな?)の方は、LLVMがどうのと書いてありますな。

 

次回はいつになるかわからないけど、nRF51822に移植しようとして、あきらめてしまいそうな気配がするな。。。

2016/04/18

[nrf]手抜きなnRF51822のはじめ方のつづき(非mbed)

はい、今日はちゃんとnRF51822のボードとJ-Link LITEを接続したので、ビルドして動作させるところまでやりますよ、ええ。

ちなみに、うちにあるnRF51822のボードはBVMCNDT52というもので、今だと型番が少し新しくなってる。

Amazon.co.jp: BLE 開発キット with J-Link segger:BVMCN5103-CFAC-BK KIT PLUS: 家電・カメラ

J-Link LITEだけ別に買うと高いそうなので、セットで買った次第です。


では、基板があるので、ちゃんとKeilの設定をしながらやっていく。

まず、ble_app_hrsのpca10028を別名でコピーして、適当に名前を変える。
うちのボードは「BVMCNDT52」なので、その名前にしよう。
pca10028を上書きしてもいいけど、気分として変えておきたいだけだ。
残しておくと、比較できるし。

ついでに、中に入っているフォルダも、s130以外は削除する。
他のは、使いたいときに見ればよいのだ。

さらにその下も、arm5_no_packs以外は削除する。
他のは、使い(以下略)

その下のファイル名はpca10028が残っていて気に入らない。。。
Keilにプロジェクト名を変更して保存するようなコマンドが無さそうだから、
3ファイルとも同じ名前にすると、ちゃんと開いてくれたから、たぶんそれでよいのだろう。

そして、Deviceを「nRF51822_xxAA」に、Targetをこんな感じで変更。
xxAAなのは、BVMCNDT52がそうだからだ。

image

あとは、昨日の通り、Output、C/C++、Asmを変更。
C/C++のInclude Pathにpca10028があるけど、そっちはもう放置した。
気になるなら、configフォルダの方もコピーするなり名前変更するなりしておくとよいだろう。

Debugは、J-Link/J-TRACE Cortexを使う。
J-Linkがつながった状態でSettingsボタンを押すと、こんな感じで見える。

image

 

そしてコンパイルすると・・・はい、ビルドエラーが出ます。
これは、BOARD_PCA10028をBOARD_BVMCNDT52に書き換えただけだから。
SDKの中の、examples/bspも変更する必要があるのだ。

Keilのツリーから「Board Support」を開こう。
Cファイルが2つあるはず。
まず、bsp.cのツリーをさらに開いて、Includeファイルを見る。

最初は、board.hから。
ここに、さっき変更した定義値が出てくるので、追加してやるとよい。
一番下にでも追加するとよいだろう。
ヘッダファイルもいるので、examples/bspの中にあるpca10028.hをコピーしてリネームし、bvmcndt52.hなどとしておこう。

image

あとは、bvmcndt52.hを編集すれば、だいたい終わりだ。
が、BVMCNDT52はLEDもボタンもないので、設定するものがない。
そういうときは、ヘッダファイルの先頭に「BSP_SIMPLE」と定義しておくとよいだろう。

それと、ファイルの一番下にあるNRF_CLOCK_LFCLKSRCも変更がいる。
これもボードごとに違うのだが、内蔵の発振子を使うとか外部の発振子を使うとか、そんなのだ。
デフォルトは外部の発振子を使うようになっているのだけど、BVMCNDT52は外部発振子を持っていない。
なので、適当に設定する。

image

もう片方のCファイルbsp_btn_ble.cは、プロジェクトから取り除く。
ボタンがないから、使わないのだ。
main.cに残骸があるので、「bsp_btn_ble」で検索して関係があるところをコメントアウトする。

これでビルドすれば、たぶんエラーにならないはず。


次は、デバッグする。
ツールバーの「d」を押すと、ダイアログが出てくる。

image

が、気にせずOK。
サンプル程度では大丈夫だ。

うまくいくと、main関数の先頭辺りに黄色と水色の矢印っぽいカーソルが出てくる。
黄色がプログラムカウンタがある行で、水色はブレークポイントが置ける行に移動した場合に出てくるカーソルなのかな。

ブレークポイントが設定できるところは、行番号の左側が濃いグレーになっているのでわかるだろう。

実行開始は、左上のこんなアイコンをクリックする。
まあ、まずは動かしてみよう。

image

Androidの設定画面でBluetooth設定を開くと、こういうのが出ていた。
たぶん、これが動かしているサンプルだ。

image

素の状態だとあまり遊べないので、Nordicが出しているスマホアプリをインストールするとよいだろう。
nRF Master Control Panelアプリか、nRF Toolboxアプリがよかろう。
nRF Toolboxアプリだと、HRMを選択してデバイスをCONNECTすると、こんな画面が出てくる。

image

 

せっかくデバッガを使っているので、ブレークポイントとかで止めたいかもしれないが、あまりそういうのには使えない。
止められるのだけど、再開するとアプリが吹っ飛んでしまうのだ。
まあ、そういうものだと思ってあきらめよう。

だいたいは、UARTやRTTなどでログを出す、というのが一般的なデバッグ方法かな。
まあ、「ここに来るか確認したい」とかだとブレークポイントを使えばよい。


これで終わりなのだが、ちょっとだけこのアイコンの説明をしよう。

image

左端はいいとして、右3つはしばしば使う。
たとえば、ネットにあるKeilプロジェクトのサンプルを使おうとして、Packのバージョンが違ったとしよう。
手元にあればいいけど、古いのは使いたくなかったりすると、その構成を変更したくなってくる(変更して動くかどうかは知らんが)。
他にも、CMSISのバージョンとかは固定されていたりするので、ちょっと使いたいものと違うことがあるだろう。

そういうときは、右から2番目のアイコンをクリックして変更することができる。

image

これが今回使ったble_app_hrsの構成なのだが、CMSISは4.5.0、DeviceFamilyPackは8.5.0でfixedになっている。
これを、たとえばDeviceFamiliPackを8.6.0にすると、構成が変わる。

ただねぇ、構成を変えると、今度はManage Run-Time Environmentが「8.5.0がない」って怒り始めるのだ。
なので、変更したあと、ツリー画面からも変更する。

けど、なんかうまくいってるのか、いっていないのかよくわからない感じになってしまうので、あちこち開いたり閉じたり、Keilを終了させて開き直したりしていると、なんとなくよくなっている。
今も、

image

と変な状態だけど、まあエラーにもならないし、警告アイコンも消えたから、よしとしている。


あとは、自分のボードに合わせてbspを変更したり、Keilだと制限があって困るなら正式版を買ったり、IARとかのに変更したり、GCCにしたりして遊ぶとよいだろう。

[nrf]手抜きなnRF51822のはじめ方(非mbed)

4月なので、「春だからnRF51822でBLEでもやってみるか」と思ってる方がいるかもしれない(いないかもしれない)。

なので、ちょろっとはじめてみたい人向けに書いてみよう。
mbedが使えるともうちょっと簡単かもしれないのだけど、私は使わないので、非mbed環境限定だ。
うん、その時点でニーズがかなり少なそうだ。

あと、はじめ方しか書かないので、どうやってやるかなどは調べてくだされ。
キーワードがわかれば、検索すればもっとよい記事が出てくるはずだ。


準備するもの

  • nRF51822が載った技適取得済みの基板
  • nRF51822のSDK
  • Keil(MDK-ARM)
  • nRFgo Studio
  • SEGGER JLink Lite
  • AndroidかiOSのスマートフォンやタブレット(BLEが使えるもの)
  • 電源とか、ハンダ付けするものとか
  • Windowsのパソコン

パソコンはWindowsでもMacでもLinuxでもよさそうだけど、KeilがWindows用なので、今回はWindows限定にする。

mbedだと、JLinkとかなくても使えるのだろうけど、よく知らんのだ。


nRF51822が載った技適取得済みの基板

がんばって探そう。


nRF51822のSDK

ここら辺からダウンロードしよう。
zipファイルなので、適当に場所を作って置くがよい。

注意としては、ネットにあるサンプルがSDKのバージョンによってAPIがコンパイルできないレベルで違っていたりするから、注意しよう。
これを書いている時点の最新は、nRF5 SDK v11.0.0だ。

今回は、SDKに入っているサンプルをちょっと動かすだけしかやらない。


Keil(MDK-ARM)

Keilもいくつか種類があるが、nRF51822はCortex-M0コアなので、MDK-ARMの評価版(MDK-ARM Lite)でよいだろう。
評価版だと、ROMが32KBまでしかリンクできないのだが、ちょろっと動かす分にはそのくらいで十分だ。

https://www.keil.com/demo/eval/arm.htm
登録がいるので、ちょっとめんどうかもしれない。
住所を書いても、送ってきたりはしないので、そんなに神経質にならなくてもよいだろう。


nRFgo Studio

なんやかや使うツール。
JTAG(SWD)のアプリなどもインストールしてくれる。

http://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822#Downloads
ここの、上から順番に行くと、ブロックの

  • PRODUCT SPECIFICATION
  • REFERENCE MANUAL
  • SOFTDEVICES
  • SOFTWARE

となって、そのSOFTWAREの下の方にある。
64bitと32bitがあるので、お好きな方を。

Keilに何かするのもセットでやってくれるので、Keilのインストール後の方がよいだろう。


つなぐ

パソコンと、SEGGER J-Link LITEと、nRF51822基板をつなごう。


サンプルをビルドする

SDKの中にサンプルが入っている。
これは、v11.0.0の構成。

image

なんでもよいのだろうが、Peripheralを動かすのがわかりやすいだろう。
Nordicのドキュメントでは、だいたいble_app_hrsが例になっているので、今回もそれにする。

なお、SDKのv10.0.0とv11.0.0ではこの辺りの構成が変わっている。
v10.0.0まではPeripheralを動かすときは「S110」だったのだが、v11.0.0からは「S130」になっている。
今までのS110をS130に読み替えればよいかというと、あまりそういう訳でもないのが、やっかいなところだ。

まあ、そういうのは自分で調べよう。
簡単に違いが知りたいなら、v10.0.0のSDKもダウンロードして、同じble_app_hrsのサンプルを比較するとよいだろう(main.cだけ見ればよいかな)。

 

話を戻そう。

image

この「pca10028とかはなんじゃ?」と思いそうだが、これはNordicの開発ボードの名前だ。
10028と10031にはnRF51422_xxACが、10036と10040にはnRF52832_xxAAが載っている。

って、nRF51822がないやん!となる。
そう、ないのだ。
だから、nRF51422のプロジェクトを開いて、nRF51822に変更する。

image

Keilに拡張子が割り当てられているから、ダブルクリックすると開くだろう。

image

こんなのが出てきたが、はい、にしてもインストールしてくれなかった。
SDKのzipファイルを解凍した一番上にそれっぽいmsiファイルがあるので、それをインストールする。。。のはKeil4でバージョンが違うから止めて、Keilを終了させ、サイトから8.5.0を取ってくる
そのまま実行すると、勝手にKeilのインストーラがうまいことやってくれる。

今の最新Packは8.6.0なのだが、プロジェクトの設定はPackのバージョンも指定してあるので、同じバージョンの方が楽なのだ。

インストールして、またプロジェクトを開くと、今度は大丈夫だった。
まずは、ビルドできることを確認しよう。

image

マウスカーソルを重ねるとヘルプが出るから、適当に探してくれ。
正常なら、ErrorもWarningも出ないはずだ。

次に、nRF51822向けにしていく。
まず、ツリーの2階層目で右クリックし「Options for …」を選択。

image

Outputタブで名前を変えておくとよいかな。
別に変えなくてもいいのだけど、気分的な問題だ。

image

 

Targetタブの設定を変える(のは、本当は後だが、先に確認する)。
だいたい、変えるのは「IROM1」と「IRAM1」だ。

IROM1は、少し前に話が出たS110だのS130だのに関係する。
これらは「SoftDevice」と呼ばれる、まあ、大ざっぱに言えばOSっぽいものだ。
nRF5 SDK v11.0.0が対応しているSoftDeviceでPeripheral機能が使えるものは、S130のv2.0.0だ。
という情報は、Nordicのサイトから得ることになる。

image

SDKのバージョンが変わってもSoftDeviceのバージョンが同じこともあるし、逆もある。

使うSoftDeviceがわかったら、今度はそのSoftDeviceの情報を探す。
で、私はいつもリリースノートを読むのだが、どこから取得していいかわからんかった・・・ので、SDKに入っているリリースノートを読む。
実を言うと、だいたいSDKと一緒にSoftDeviceも梱包されているので、それを見ればいいのだ。
ただ、ときどきSoftDeviceだけアップされるときもあるので、調べ方は知っておいた方がよいだろう。

image

見たいのは、リリースノートの、これ。

image

FLASHのサイズと、RAMの最小サイズ。
これが、さっきのTargetタブと関係している。

たとえば、ble_app_hrsでは、こうなっている。

image

IROM1が0x1B000から始まっているのは、SoftDeviceが0x1B000まで使っているからだ。
サイズが0x25000なのは、0x1B000+0x25000=0x40000=256KBということだ。

IRAM1は、なんだろう?
nRF51822はRAMが0x20002000から始まるのだけど、0x80だけずらしてあるな。
・・・わからない! 宿題にさせてくだされ。

S130としては最低0x13C8バイト使うのだけど、0x5F80+0x80-0x2000=0x4000=16KBということで、めいっぱい確保している。
まあ、特に分ける必要がないということだろう。

 

こんな感じでTargetタブの内容を決めるのだけど、まずはここは見るだけにしておいて、先にDeviceタブでデバイスを変更する。
何でかというと、Deviceタブで別のデバイスを選択すると、Targetの中身が消されるからだ。
私は先にTargetのスクリーンショットを撮ってからDeviceを変更するようにしている。

 

あとは、C/C++タブやAsmタブで「BOARD_PCA10028」となっているところを変更する。
これを何に使うかというと、SDKのexamplesの中にある「bsp」が見ている。
この中で、ボタンやLEDのGPIO定義をしているのだ。
だから、自分のボード用の定義を新しく作って、bspに反映して、このプロジェクトの提議も変更する、というのが、まあ正当な流れになるんじゃなかろうか。

bspの変更は、自分で見てみよう。
プルアップとかプルダウンが違ったりすると、けっこう変更しないとだめだったりする。

 

最後に、Debugタブ。
ここで、右側のラジオボタンがチェックされているだろう。
デフォルトはULINK2/MEなどになっているから、これをJ-Link/J-Trace Cortexなどにする。
その横のSettingsボタンを押すと、J-Linkと通信しに行くから、接続設定ができているかわかるだろう。


このくらいまで説明したら、もうあとはできるんじゃなかろうか?
設定変更してビルドが通れば、あとはLOADボタンを押してnRF51822に焼けばよい。
デバッグしたければ、dボタンを押す。

image

 

最後はばたばたして、実際に焼くところまでやってないので、気が向いたら次回やろう。

2016/04/17

[cntk]Windowsでビルドしようとしたが、中断

前回、リリースされているCNTKにはバグがあるようだ、ということがわかった。
それが原因か、単に私の書き方が悪いのかわからないけど、うまく動いていない。
CNTKの最新版にすることで別のバグが出てくる可能性も高いが、ビルドできるようにしておいてもいいんじゃなかろうか。


Microsoftの機械学習ツールキットCNTKをGPGPU付きでインストールする(Windows編) - FPGA開発日記

こちらを参考に、やってみる。
既にインストールされているものもあるので、それはそのままでいけるのか試そう。

1.CNTK本体は、githubからcloneする。

2.Visual Studioは、2015がインストールされているので、それを使おう。

3.CUDAは、7.0がインストールされているので、それを使う。。。
環境変数は設定していないから、あとでやろう。

4.Boost, ACML, MS-MPI, OpenCV

MS-MPIだけは、7.0.12437.6がSDKと何も無しがインストールされていた。

ACMLは、Intel Fortranの「acml5.3.1-ifort64.exe」にした。似てる名前が多くて紛らわしい。。。
MKLというのもあるらしいが、alternativeだからどちらかあればよいのだろう。

Boostは、unit test用ってあるから、なくてもいいんじゃないの?と思うが、きっとビルドエラーになるんだろうな。。
msvc-12.0がいると書いてあるのだが、Visual Studio2015は14.0のようだ。
あまり詳しくないのだが、NuGetでインストールできそうだから、それでもいいのかな?
https://www.nuget.org/packages/boost
ああ・・・何かプロジェクトを開いていないとインストールできないんだ。
よくわからんが、拡張機能でboostを検索したときに出てきた「Boost Unit Test Adapter」でもインストールしておこう。

OpenCVは、OPTIONALと書いてあるから、省略だ。
wikiにはzlibのことも書いてあるが、それもOPTIONALだ。

 

さて、ではビルドしてみよう、とwikiを見るとCUDA7.5になっていた。。。
いつの間に。。。

NVidiaからインストールしようとしているのだが、ハードウェアに互換性がないとか、Visual Studio Integrationがサポートしてないとか。。。
選択肢は3つある。

  1. Visual Studio 2013を使う
  2. CUDA7.5を無理やり入れて、手動で変更する
  3. やめる

2は、きつい。
それだったら、CUDA8.0にしたいなぁ、とも思ってしまう。

じゃあ1かというと、せっかく2013をアンインストールしたのに。。。と思ってしまったのだ。
インストールし直すだけとはいえ、心理的な壁が大きい。

 

というわけで、今回は3を選んだ。。。
ありがちなのが、今日2013をインストールして動かして、次にやろうとしたら2015対応になっていた、というパターンなので、それに賭けることにした。
(単なる敗北ともいう。)

[nrf]ECCは使えるのか?

無線だけじゃなくて、データ自体に暗号化を掛けてしまいたいときがある。
nRF51822はAES用のハードウェアとしてECBとかCCMとかが載っているようだ(使ったことない)。
128bitと書いてあるから、16バイト分。
20バイト以内だから、まあちょうどいいといえばちょうどいいサイズだ。

そういえば、SoftDeviceがS130v2とかS132v2とかになって、Bluetooth v4.2規格に対応したという話だ。
Production release of S130 & S132 v2.0 SoftDevices for the nRF51 and nRF52
これは2016年2月23日の記事なのだが、2番目に「LE Secure Connections」とあり、そこで楕円曲線暗号化(ECC)のことが出てくる。
ライブラリを再利用しているようなことが書かれているのだが、データを暗号化したいだけでも使えるのだろうか?


Experimental: BLE LE Secure Connections multirole example

これがサンプルのようだ。
S130/132とあるから、nRF51822でも使えるのだろう。
nRF52832のPS書を検索したが、ECCで引っかからなかったのでたぶんハードウェアで何か持っているというわけではないのだろう。

目立つ文字だけ眺めていると、Peer Managerというものが見えた。
なんとなく、Bonding Manager→Device Manager→Peer Managerと変遷しているのだろうか。
v10.0のときはExperimentalだったのだが、v11.0では消えているから、正式になったのだろう(DeviceManagerのページには「将来的にPeerManagerに置き換えられる」と書いてあった)。

 

さて、サンプルのソースをeccで検索すると、「ecc_p256_public_key_compute」のような名前が出てきた。
ファイルを見ると、中身はすかすかで、uECC_secp256r1()を呼んでいるだけのようだった。
そして、uECC_secp256r1()の実体がSDKの中にない。。。

ドキュメントを読むと、別ライブラリのこちらをGithubから取ってきて使うようだ。
kmackay/micro-ecc: ECDH and ECDSA for 8-bit, 32-bit, and 64-bit processors.


なんか深入りしすぎてしまいそうなので、ここでやめておこう。
ともかく、ECC自体はハードウェアの機能を使うのではなく、ソフトウェアとして動かすだけのようだから、きっとnRF51822でも動くのだろう。
SoftDeviceが新しくなってBLE v4.2に対応したのも、ECCに対応したというよりは、アプリ/SDKが作ったデータを「ECCですよ」といって流せるようにしたというところじゃなかろうか。
v4.2自体あまりわかってないので、想像ですが。。。

だから、アプリが自分のデータをECCで暗号化したいだけなら、SoftDeviceはS110のままでもよくて、単にライブラリを追加してアプリで実現させればよいはず。
ただ、うちのnRF51822はRAMが16KBなので、そこで動くのかどうかまではわからないな。
Compatibility Matrix v2.1でも、IC revision3で16KBのタイプも残っているから、動くと思いたい。

あとは、私がBLEv4.2だけでなく、ECCにもあまり詳しくないというところだが、そこはいいだろう(よくない)。

2016/04/15

[nrf]Nordicの最近のニュースリリースから(2016/04/15)

NordicのMy Pageに登録しているからかわからないけど、ニュースリリースが届く。
最近、2つほど気になったニュースがあったので取り上げておこう。


Nordic Semiconductor collaborates with Google to launch SDK for the newest Eddystone framework, an open beacon format from Google

Eddystoneの仕様が更新されて、それとSDKが連携しましたよ、というニュースなのかな。
SDKは、いつものSDKのページではなくGithubにある。

どうも、Eddystone-EIDなるものが追加されたようだ。
EIDの”E”は、EddystoneのEと思わせつつ、実はEphemeralのEだった。
一時的な、とかそういう意味なのかな。楕円曲線暗号化のことを調べているときにも出てきていた気がする。

今日は時間がないので、Eddystone-EIDは後日調べよう。
WebとかBDADDRとかいう単語も見えるし、計算ツールが提供されているから、何かしら識別するのに使える番号なのだろう。


Nordic Semiconductor launches ultra-thin Bluetooth Smart solution for space-constrained smartcards and wearable applications.

薄いnRF51822を出しました、ということですかな。

厚さは3.83mm。
わかりづらい例えだが、今食べているバナナの皮の厚さが4mmくらいだった。
その後ろに「0.35mm」というのがあるけど、これは何の数字だろう?
測ると3.83mmと書いているから、3.83mmじゃないんだろうか。あと0.35mmは製造段階で薄くできます、とかか。。。訳せんかった。。。

nRF52832が出てくると、nRF51822はどうなっていくのかと思ったが、こういうバリエーションも出てきて生き残っていくのだろうか。
まあ、ビーコンだけだったらチップが高性能になってももったいないだろうし。

[arm]SEGGERのRTTシリーズ

ARM-M系でSEGGERのJ-Link Liteが使える場合、Real Time Terminal(以下、RTT)でログを取るようにしている。

GDBでRTT – Qiita

浮動小数点は出せないのだが、比較的小さいし、なにより軽い。
一度にたくさんのログを出そうとすると捨てられたりするのだが、デフォルト値のままで使っているせいかもしれない。

 

SEGGERのインストーラを使うと、RTTとつくツールが3つインストールされる。

image


RTT Viewer

何はともあれ、まずはRTT Viewerだ。
これが中心的存在になっている。
この人がHostで、残りのツールはそれを使ったクライアントになっているようだ。

 

RTT Client

RTT Viewerでできることと何が違うのか、今ひとつよくわからない。。
単独で動くのかと思ったけど、RTT Viewerを終了させると待機状態になるし。

Telnetクライアントみたいなものだ、と説明されているので、RTT Viewerでは文字入力を別の枠で行わないといけないのが、RTT Clientだとそのまま入力できるのかもしれない。

ただ、入力機能はまだ使ったことが無いのでね。。。

 

RTT Logger

RTTツールを調べ始めた理由が、これだ。
RTT Viewerのメニューからログ保存開始を選んでも、コンソールのログが保存されないのだ。
Standaloneモードではできそうなことが書いてあるのに。。。

そこで出てきたのが、このLoggerだ。
これを使うと、ファイルに保存してくれる。
デフォルトでRTT Viewerの設定を使うようなのだけど、Channelだかindexだかの設定はデフォルト値が1になっていてダメだった。0だった。


やっていて気付いたのだが、ClientやLoggerを使うと、Viewerの出力がほぼ止まるようだ。
なぜ「ほぼ」かというと、ときどき出るからだ。
そして、出た分はLoggerなどで吸い取っていない。

いやいや、ちょっと待ってくれんか。。。
そういう中途半端なことをされると困るのだ。

 

どうも、先にRTT Viewerを立ち上げた後でLoggerを起動すると、Viewerを終了するとLoggerも切断されてしまう。
Loggerだけ立ち上げると、これでログが取れるようだ。

 

じゃあRTT Clientもそうかと思ったが、これは違うようだ。
localhostでポートを探しに行っているから、Hostと通信しないといけないのだろう。
ポート番号は19021番だが、もしかしてRTT ClientはTlenetクライアントみたいなものじゃなくて、Telnetクライアントそのものなのか?

TeraTermでlocalhost:19021に接続したら、コンソールに出力されている。
なーんだ。

 

そういうわけで、まとめるとこうだ。

  • RTT ViewerとRTT Loggerは同時に使わない方がよい
  • RTT Loggerを使うときは、チャネルだかインデックスだかは0かも
  • RTT Clientは、Telnetクライアントみたいなものだ

たぶん、RTTのカラーが出せるのがRTT Clientのよいところなのだろう。
ライブで見ていると色が付いたログはありがたいのだが、ファイルに保存するのだったら素のテキストが出力されている方がありがたいな。
まあ、ここは使い分けだろう。

2016/04/12

[ble]NotifyかNotificationか

BLEのPeripheralからCentralに通知する、NotificationやIndicationがある。
これが「Notification」なのか「Notify」なのかいつも迷う。

たとえば、Core_V4.2 [Vol 3, Part G, 3.3.1.1 Characteristic Properties]では「Notify」「Indicate」なのだ。

じゃあ「Notify」なのかと思うと、[Vol 3, Part G, 4.10]はタイトルが「CHARACTERISTIC VALUE NOTIFICATION」と「Notification」になっている。

 

英語としては、「Notify」は動詞で、「Notification」は名詞。
同じく「Indicate」は動詞で、「Indication」は名詞。
まあ、そういうのはわかるのだ。

しかし、BLEのNotificationとかIndicationは、用語だと思っている。
だから先頭は大文字で書いているのだ。
でも、[4.10]は「NOTIFICATION」だけど、[4.11]は「INDICATIONS」と複数になっていたりするので、なんだかもう、訳がわからない。

 

では、他はどうか?
[4.8]や[4.9]は「READ」で「WRITE」だから、名詞ではないだろう。名詞にしたければingをつけないといかんと思う。
[4.12]は「DESCRIPTORS」で、これは名詞だ。

そう見ていくと、ReadingとかWritingとかしていないので、用語と判断した方がいいかな、と思う。

 

どうもすっきりしないが、「Notification」「Indicateion」でいくか。

2016/04/09

はじめてのJSON

お客様「データはJSON形式でお願いします」
私「わ、わかりました(あれよね?)」

image

さあ、みんなもJSONを勉強しよう!


JSON

json.org、とあるから、ここが大元なのか。
ECMAになっているらしい。
私のイメージでは、ECMAはヨーロッパ版のISOだかIECだとか、そういう感じなのだけど、たぶん違うだろう。
ともかく、規格関係だ。

 

JavaScript Object Notationの略。
最初はJavaScript用だったけど、意外といいやん、ということで抜き出したのかな。
簡単にパースできると書いてあるけど、それだったらタグはバイナリ値の方が作りやすいな。
まあ、そういう愚痴を言っても仕方ないので、中身を見よう。

 

  • データは、objectかarrayで定義される。
    • object
      • {
        • string、コロン、value、
        • ↑が複数あるなら、コンマでつなげる
      • }
    • array
      • [
        • value
        • ↑が複数あるなら、コンマでつなげる
      • ]

ふむ、シンプルだ。
あとは、valueはこうだ、とか、stringはこうだ、とか、そういう定義が書いてある。

stringは、ダブルクオーテーションで囲むようになっている。
だから、それ以外のところにスペース文字を書いてもよい。

 

基本はvalueで、stringもobjectもvalueの1種だ。
valueが基本だけど、内容としての基本はobjectだろう。
あ、いや、arrayだけ、というのも可能なのか。
でも、arrayだけ渡されても何だかわからない・・・いや、そういう取り決めもありか。

 

あまり制約がないので、方針がいろいろあるようだ。
JSONにせよ、NFCのパケットにせよ、BLEのパケットにせよ、DICOMにせよ、まあやりたいことはだいたい同じなので、Type/Tag, Length, Valueが表せれば事足りる。
あとは、その表現方法だ。
JSONは表現が全部テキストで表せるようになっている、というのが特徴だろう。
「もう全部バイナリでやろうぜ」というのは、過去の時代になったのか・・・。

 

とりあえず今回検索してわかったのは、「ジェイソンはチェーンソーを使っていない」ということだった。

[nfc]仕様書のダウンロードはメンバーのみになった?

NFC Forumの規格にLLCPというものがあるのだが、その仕様書が1.3になったという記事があった。
なんでも、暗号化するチャネルを持てるようになったとか。

じゃあ、ダウンロードしておこうかとサイトに行ったのだが・・・あれ?

image

ぱーちゃす?
飛んでみると、お買い物しそうなところに行ってしまった。

image

あーれー、メンバー以外はダウンロードできなくなったのかい?

まあ、無料会員だったらいいや、とメンバーシップのサイトを見てみた。

  • Sponsor Members : $50,000
  • Principal Members : $25,000
  • Associate Members : $10,000
  • Implementer Members : $5,000
  • Non-profit Members : $1,500

無料はないなぁ。

 

セキュリティとか暗号とかが入ってきたので、制限を掛けたということだろうか。
単に私の探し間違いかもしれないけど、どうなんだろうね?

[eclipse]ARM用環境

今までEclipseはLUNAを使っていたのだが、そろそろMARS2にしよう。
忘れそうなので、次回のために環境を作るメモを残しておく。

CDTでARM用の環境だ。


EmbSysRegView

Marketplaceで「embsysregview」を検索。
今知ったけど「embsys」では検索できなかったから、部分一致はだめなのかもしれない。

インストールしたら、pluginsの中に「embsysregview」の名前が入ったフォルダがあるので、それっぽい位置にNordicのフォルダを作って、SVDファイルを突っ込み、拡張子をxmlに変更。
そろそろデフォルトで入ってほしいものだ。

 

How to install the GNU ARM Eclipse plug-ins?

J-Link Debuggerだけほしいのだけど、Cross Compilerも一緒にインストールされてしまうようだ。
でも、eclipseフォルダを検索してもgccなどが出てこなかった。
心配はいらなかったかもしれない。


こんなものか?

私にとってEclipseは、今のところGDB用だから、こんなものかもしれない。


ウィンドウを追加。

image

下の「Console」で、「Show Console When Standard Error Changes」を外す。
これをやっておかないと、Memoryの変更をしたとき、たぶんGDBが標準エラーに出力してしまうのだと思うが、すぐConsoleに切り替わってしまって面倒なのだ。

 

あとは、「Window→Preferences」で、こんなところをいじる。

  • General > Workspace:エンコードなどを変更
  • General > Editors > Text Editors:タブとかスペースとか
  • C/C++ > Code Analysis : 気になれば外す
  • Run/Debug > SEGGER J-Link : Folderを現在のものに合わせる

2016/04/04

[DL][cntk]NDLを書いてみよう (7) - 週末の復習と反省

今週は、CNTKのチュートリアルを動かしたり、MNISTサンプルを動かしたりした。
そして、見た目だけはSimple2dとほぼ同じ形のネットワークをNDLで作成し、ちゃんと動いていないことを確認しました。。。

 

はい、反省はもう「ちゃんと読んでからやろうよ」に尽きます。。。
CNTKファイルの書き方をサンプルだけ見てまねしているので、ニューラルネットどうこう以前にツールの使い方が正しくなっているのかどうかが不明なのだ。

CNTK/Configuration Files.md at master · Microsoft/CNTK

ここを、全部とは言わないまでも、まねしているパラメータくらいは意味がわかっていないと、失敗しているのはわかっても対応が当てずっぽうで意味がないのだ。

今日も見ずにやってたけれど、readerのところで次元が違うとエラーが出て、理由が結局わからないままなのだ。
だって、Simple.cntkと同じ書き方をしているのに!
でも、labelTypeにRegressionを指定すると、なぜかエラーが出なくなる。
理由がわからんが、説明を読めばわかるんじゃなかろうか。

 

あ、2016-02-08版のこれに関連するバグ?
required parameter missing: LR.cntk:Train:reader:labels:labelMappingFile · Issue #240 · Microsoft/CNTK

ここでエラーが出てるのに気付いたけど、あれはCNTKファイルの誤記じゃなくてバグだったのか。
ということは、それに関連してバグがあったとしてもおかしくない(1列目2列目がデータで、3列目がラベルなのだけど、なぜかラベルの次元がおかしいというエラーになる)。

そ、そんな馬鹿な・・・。
CNTKのビルドは環境を作るのがめんどくさそうだからやってないのだ。
ドキュメントを読む前に、そっちが先かなぁ。。。

2016/04/03

[DL][cntk]NDLを書いてみよう (6)

チュートリアルだけじゃなくて、MNISTのサンプルも参考にしよう。
MNISTサンプルもNDLで書かれたネットワークを使っているのだ。

image

最初、GPUではなくCPUで計算させていたのだけど、あまりにも終わらずにやめてしまった。
GPUに戻すと、そこそこの時間で終わった。
こんなに違うのね・・・。
Windowsでtimeみたいなコマンドを使いたいけど、代用品がわからないので時間は測ってない。

 

図を見る限りでは、少し違うけれども、TimesとPlus、Sigmoidも入っている。
最後はErrorPredictionとCrossEntropyWithSoftmax。
01_OneHidden.ndlは短いが、これはマクロとしてMacros.ndlが使われているからだ。
しかしそうは言っても、DNNSigmoidLayer()とDNNLayer()だけで、マクロの中身も、Times()とPlus()、Sigmoid()があるだけだから、そんなに特殊には見えない。
だけど、これはちゃんと結果が出るのだ。

「Starting minibatch loop」というログのあとが、自分で作ったNDLだと処理が行われているような感じがしない。
何か足りないのだろう。。。

簡単に動くと考えたのが甘かったな。

[DL][cntk]NDLを書いてみよう (5)

そろそろ、ちゃんとやろう。
まずはシンプルに、隠れ層がないネットワークを作ってみる。
Simple.cntkで「layerSizes = 2:50*0:2」としたとぎのグラフは、こうだ。

image

ノードの、PlusとTimesはチュートリアルと同じ形だからよいとして、Timesの前にあるPerDimMeanVarNormalizationが最初の山場だ。
Times()やPlus()があるんだから、PerDimMeanVarNormalization()もあるだろう・・・あった。
が、引数は3つだ、というエラーが出てきた。

PerDimMeanVarNormalizationノードには、Mean、InvStdDev、featuresの矢印が突っ込まれている。
featuresはチュートリアルにもあるからよいとして、MeanとInvStdDevは計算がいる。
が、これもMean()とInvStdDev()があった。
PerDimMeanVarNormalization()の第1引数はfeaturesにしとかないとエラーが出た(メッセージが長かったので、あんまり読んでない)。

mn = Mean(features)
invstd = InvStdDev(features)
n = PerDimMeanVarNormalization(features, mn, invstd)
t = Times(W, n)
z = Plus(t, B)

image

なるほど。
グラフのノードは2行表記になっているけど、1行目の括弧の外は変数名なんだな。
Mean()の結果をmeanという変数名に入れようとすると怒られたので、大文字小文字は見てないのかもしれない。
Simple.cntkだと「W0*H-1」みたいな名前もあったが、あれは変数名にできなかった。
だから、あれはSimpleNetworkBuilderだから出せるのかもしれない。

 

さて、これでPlusノードまではできた。
あとは、

  • CrossEntropyWithSoftmax
  • ScaledLogLikelihood
  • EvalErrorPrediction

のノードを作るだけだ。

  • 最後のノードはSigmoid()じゃなくてPlus()なので、差し替える
  • SquareError()をErrorPrediction()に変更
  • Logistic()をCrossEntropyWithSoftmax()に変更

image

これで、Minusのところ以外は同じになったかな。
では、Minus()もまねしてみよう。

# operations
mn = Mean(features)
invstd = InvStdDev(features)
n = PerDimMeanVarNormalization(features, mn, invstd)
t = Times(W, n)
z = Plus(t, B)

LR = CrossEntropyWithSoftmax(labels, z)
EP = ErrorPrediction(labels, z)

mm = Mean(labels)
lg = Log(mn)
MI = Minus(lg, z)

image

・・・予想と違う。
作ったノードが、全部グラフから浮いてしまった。

チュートリアルでは、この後ろに「FeatureNodes()」や「LablesNodes()」がある。
ノードの意味を指示しないといけないということか。

ndlLR=[
  # sample and label dimensions
  SDim=$dimension$
  LDim=1

  features=Input(SDim, 1)
  labels=Input(LDim, 1)

  # parameters to learn
  B = Parameter(LDim)
  W = Parameter(LDim, SDim)

  # operations
  mf = Mean(features)
  invstd = InvStdDev(features)
  n = PerDimMeanVarNormalization(features, mf, invstd)
  t = Times(W, n)
  z = Plus(t, B)

  LR = CrossEntropyWithSoftmax(labels, z)
  EP = ErrorPrediction(labels, z)

  ml = Mean(labels)
  lg = Log(ml)
  MI = Minus(lg, z)

  # root nodes
  FeatureNodes=(features)
  LabelNodes=(labels)
  CriteriaNodes=(LR)
  EvalNodes=(EP)
  OutputNodes=(z, MI)
]

image

 

ただ、形ができただけで、ログを見ると計算ができていない。
ネストしているような警告が出ているので、そこらへんだろうか・・・いや、元から出ているな。

「Starting minibatch loop」のところから出方がずいぶん違うので、そこから見ていくか。

2016/04/02

[DL][cntk]NDLを書いてみよう (4)

前回、チュートリアルのロジスティック回帰を見ていたが、そのネットワークをSimple2dで試すのを忘れていた。
前はエラーのところしか見ていなかったけど、係数が予想通りx軸に平行となるのかは見ておきたいところだ。

y = -0.0482035205 - 0.600052118 * x1 - 10.5671721 * x2

予想と違いましたな。。。
いや、ちょっと待った。
変数が2つあるけど、これはなんだっけ?
チュートリアルによると、

  • y = mx + b
    • y = x2
    • x = x1
    • m = (-W_1 / W_2)
    • b = –B / W_2

だそうだ。

だからこの式は、

y = (0.600052118 / (-10.5671721)) * x + (0.0482035205 / (-10.5671721))

となる。

graph.tkでグラフにしてみると、この赤線になった。

image

青線はテストデータの元になったグラフだ。
x軸にかなり平行な直線と言ってよかろう。


さて、NDLに戻ろう。

その前に、LDimのことを解決しておく。
以前、LDim=2にしないと動かない、と書いたのだが、このチュートリアルはLDimが1のままで、ちゃんと動いているのだ。

見比べながら変更したところ、labelsに「labelType=regression」を書くとLDim=1でも動くことがわかった。
labelsは、くくりで言うとReader blockになる。
labelTypeは、こちら
Categoryか、Regressionか、None。
チュートリアルはロジスティック回帰だから、Regressionだったのだろう。
Categoryは、labelsみたいにcategoryというブロックを自分で作って、そこに記載するような感じがする。
labelsのデータはfloating pointで、Categoryの場合は整数部分がラベルマッピングテーブルのインデックス値に変換される、とある。

labelTypeの説明が、

labelType – [{Category},Regression,None] the type of label

となっていたから、Categoryがデフォルト値で、マッピングファイルにラベルが2つ書かれているから、LDimが2じゃないとうまく行かなかった、ということか?

じゃあ、Regressionを指定した場合はマッピングファイルの指定をしなくてもうまく動作してほしいのだけど、EXCEPTIONが発生していた。
これについては、何か説明を付けることができるのだろうか?

 

こういうねー、ネットワークとかの前に気になることが出てくると、なかなか着手できないのだ。
勉強しようとしたら机の周りが散らかっているのが気になり出すのと同じかもしれない。

[DL][cntk]NDLを書いてみよう (3)

まだ続いている、自分でニューラルネットのネットワークを書く話。
チュートリアルを見始めたけど、ロジスティック回帰なるものが出てきて、わからないなりにやったところまでが前回だ。

パラメータが1つの問題が線形回帰とか単純回帰とか呼んで、パラメータが増えると多重線形回帰になる。
多重線形回帰の成果というか結果というかが2値の場合を、ロジスティック回帰と呼ぶ、という認識でいる。
結果がAかAじゃないか、で、Aなら1.0、Aじゃないなら0.0、あとはよりどっちに近いかという値になる。


チュートリアルは2変数なので、回帰モデルはこうなる。

y = W_0 + W_1 x_1 + W_2 x_2

2元1次方程式、というやつですな。

散布図を見ると、左下が0のグループ、右上が1のグループのようだ。
図形的な解法だと、各グループの重心を求め、重心間に直線を引き、それと直交する直線で重心間の距離が等しくなるような直線を求めることになるだろう。

そういった求め方をせず、点のデータからその直線になるようなWを求めるのがこのチュートリアルになるはず。
この節の一番下に破線が追加された散布図があるが、この破線がそれですな。

 

うーん。
このチュートリアルでは、散布図を見ると確かに直線で分離できそうだから2元1次方程式でよいだろう。
でも、Simple2dの場合はサイン波からデータを作っているので、直線で分離するのは無理だろう。
やったとしても、x軸に平行な原点を通る直線になって、波の付近は全然ダメなはずだ。

そういう意味では、Simple2dはロジスティック回帰に適さない課題と言うことになるのか。
でも、そんなのは結果論であって、モデルがどういう風になるかわからないからディープラーニングだの何だのを使って勝手にやってもらおうとしているんじゃないか。

 

そうなると、簡単な話で「CNTKでロジスティック回帰の計算はできるけれども、ロジスティック回帰はディープラーニングとは関係がない」ということか。
ネットワーク図だって、全然層になってないし。。。
今ひとつ自信はないが、そういうことにしておこう。

 

チュートリアルのソースが、ラベルのモデルマッピングがないとかエラーが出たので、Simple2dのを付け足したものを置いておく。
一番上にあるテキストファイルは結果で、これはチュートリアルサイトの結果とも一致しているから、間違ってないのだろう。

https://drive.google.com/folderview?id=0B2_3hJpJ5Ui2Ymt0ZEM5NEtuZFE&usp=drive_web&tid=0B2_3hJpJ5Ui2QWZ5Mm5NV29USEE

さあ、次こそは自分でネットワークを書いてみたいぞ。


よそのサイトを見ていたら、面白そうなことをしていた。

Enjoy RFID: RFIDでディープラーニング その1

中身はわからないけど、私もこういう、自分で集めたデータで何かしてみたいのですよ。