そろそろ、ちゃんとやろう。
まずはシンプルに、隠れ層がないネットワークを作ってみる。
Simple.cntkで「layerSizes = 2:50*0:2」としたとぎのグラフは、こうだ。
ノードの、PlusとTimesはチュートリアルと同じ形だからよいとして、Timesの前にあるPerDimMeanVarNormalizationが最初の山場だ。
Times()やPlus()があるんだから、PerDimMeanVarNormalization()もあるだろう・・・あった。
が、引数は3つだ、というエラーが出てきた。
PerDimMeanVarNormalizationノードには、Mean、InvStdDev、featuresの矢印が突っ込まれている。
featuresはチュートリアルにもあるからよいとして、MeanとInvStdDevは計算がいる。
が、これもMean()とInvStdDev()があった。
PerDimMeanVarNormalization()の第1引数はfeaturesにしとかないとエラーが出た(メッセージが長かったので、あんまり読んでない)。
mn = Mean(features) |
なるほど。
グラフのノードは2行表記になっているけど、1行目の括弧の外は変数名なんだな。
Mean()の結果をmeanという変数名に入れようとすると怒られたので、大文字小文字は見てないのかもしれない。
Simple.cntkだと「W0*H-1」みたいな名前もあったが、あれは変数名にできなかった。
だから、あれはSimpleNetworkBuilderだから出せるのかもしれない。
さて、これでPlusノードまではできた。
あとは、
- CrossEntropyWithSoftmax
- ScaledLogLikelihood
- EvalErrorPrediction
のノードを作るだけだ。
- 最後のノードはSigmoid()じゃなくてPlus()なので、差し替える
- SquareError()をErrorPrediction()に変更
- Logistic()をCrossEntropyWithSoftmax()に変更
これで、Minusのところ以外は同じになったかな。
では、Minus()もまねしてみよう。
# operations LR = CrossEntropyWithSoftmax(labels, z) mm = Mean(labels) |
・・・予想と違う。
作ったノードが、全部グラフから浮いてしまった。
チュートリアルでは、この後ろに「FeatureNodes()」や「LablesNodes()」がある。
ノードの意味を指示しないといけないということか。
ndlLR=[ features=Input(SDim, 1) # parameters to learn # operations LR = CrossEntropyWithSoftmax(labels, z) ml = Mean(labels) # root nodes |
ただ、形ができただけで、ログを見ると計算ができていない。
ネストしているような警告が出ているので、そこらへんだろうか・・・いや、元から出ているな。
「Starting minibatch loop」のところから出方がずいぶん違うので、そこから見ていくか。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。