前書き
前回の記事にも書いたけど、結局Windows+Visual StudioでDeep.Net環境を構築したら、すんなりいけた
さて、一安心と思ってMNISTの例を試して実行してみたけど、こっちはこっちで色々問題が
環境
- Windows 7 (64bit)
- Visual Studio 2015
DeepNet導入手順
- F#プロジェクトを作成する(とりあえずコンソールアプリ)
- ターゲットフレームワークを「4.6.1」にする
- nugetにてDeep.Netをインストールする
- nugetにてFSharp.Core (F# 4.1)をインストールする(入ってなければ)
MNISTのアレを実行
データセットはここからとってきて任意のフォルダに格納しておく。
本家のサンプルを見ながらコーディング。しかしそのままではコンパイルエラーが発生するので、次のように修正する。
open Tensor //open ArrayNDNS
open SymTensor
open SymTensor.Compiler.Cuda
open Datasets
let mnist = Mnist.load (__SOURCE_DIRECTORY__ + "../../../Data/MNIST") 0.0
|> TrnValTst.ToCuda
printfn "MNIST training set: images have shape %A and labels have shape %A"
mnist.Trn.All.Input.Shape mnist.Trn.All.Target.Shape
printfn "MNIST test set: images have shape %A and labels have shape %A"
mnist.Tst.All.Input.Shape mnist.Tst.All.Target.Shape
let mi = mb.Instantiate DevHost
let hiddenAct = hiddenWeights .* input.T + hiddenBias
...
let outputAct = outputWeights .* hiddenVal
let optCfg = { Optimizers.GradientDescent.DefaultCfg with Step=1e-1f }
これ以外にも修正箇所があるけど、方針としては上記のいずれかなので、記載は割愛。
実行時のエラー
なんか、次のコードでエラーが発生する
let hiddenAct = hiddenWeights .* input.T + hiddenBias
hiddenBiasは隠れ層のノード数分の配列データなのだが、これがブロードキャストで列方向(横方向)に隠れ層のノード数分拡張される為、「+」演算が成立しないという例外が発生する。
あまりにも手詰まり感満載だったので、いよいよ本家Githubにissueを投げてみた。(Cannot apply element-wise operator Add)
その回答を元に書き直すと
let hiddenAct = hiddenWeights .* input.T + (Expr.reshape [nHidden;SizeSpec.broadcastable] hiddenBias)
いや、さすがにこれは無理ゲーだよwww (初見殺しにも程がある)
学習を重ねても減らないLoss
紆余曲折してようやく繰り返し学習ができるようになった……。
しかし!
Test loss after 0 iterations: 2.3019
Test loss after 50 iterations: 2.3019
...
Test loss after 950 iterations: 2.3019
Test loss after 1000 iterations: 2.3019
Lossが減ってねーー!!
終わりに
ここまできたら、少なくともWindows上ではできるようにしたいので、拙い英語力を駆使しながら、作者とのコミュニケーションを続けてみようと思う。
いつか本章のタイトルが「上手くいかず⇨いきました」になることを期待。
あとドキュメントも最新の実装に合わせた方が良い旨を提案してみようっと。