2016年4月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年4月9日

はじめての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年4月5日

2016年4月4日

[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年4月3日

[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年4月2日

[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

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