2016/04/03

[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」のところから出方がずいぶん違うので、そこから見ていくか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。