Neural Network Consoleは、綺麗なGUIでいいのですが、ノートパソコンなど、小さいモニタで使うと、文字が重なってしまって見づらいときがあります。
そんな時には、GUI表示のスケールを変更することで少し、見やすくなるかと思います。
設定方法は、右上の歯車ボタン(Setup)をクリックし、VIEWタブを選択し、GUI Scaleのスライダを調整することで、GUI全体の表示スケールを変更することができます。
←Deep Learningへ戻る
Neural Network Consoleは、綺麗なGUIでいいのですが、ノートパソコンなど、小さいモニタで使うと、文字が重なってしまって見づらいときがあります。
そんな時には、GUI表示のスケールを変更することで少し、見やすくなるかと思います。
設定方法は、右上の歯車ボタン(Setup)をクリックし、VIEWタブを選択し、GUI Scaleのスライダを調整することで、GUI全体の表示スケールを変更することができます。
←Deep Learningへ戻る
ソニーのNeural Network ConsoleでCPUとGPUの処理を切り替えるのは至って簡単。
あらかじめCUDAはインストールされている必要がありますが、Neural Network Consoleの右上の設定ボタンをクリックします。
次に表示された画面の ENGINEタブを選択し、CPU もしくは GPU を選択すれば、それだけで切り替わります。
GPUにエラーが出なければ(train_errorやvalid_errorは別)、設定が出来ているとのことですが、あまりに実感がないので、サンプルプロジェクトの学習時間の比較を行いました。
プロジェクト | CPU処理 | GPU処理 |
01_logostic_regression | 3秒 | 6秒 |
02_binary_cnn | 50秒 | 7秒 |
LeNet | 4分52秒 | 31秒 |
※CPU:i7-7700K(4.2GHz)、GPU:GeForce GTX1080
やっぱりGPUは早い!
今回は、学習時間が待てるレベルの物を選んで比較しましが、ニューラルネットワークによっては、CPU処理では数時間かかりそうなものもあるので、効果は大きそうです。
←Deep Learningへ戻る
Deep Learningの最適化において、素人ながらLearning Rate(学習率)の値の調整も大事なのかな?と思っているのですが、Learning Rateの値はNeural Network全体の値の設定と、各Afiineでの設定が可能になっています。
Neural Network全体のLearning Rateの値の設定は、プロジェクトを起動している状態で、右上にある、CONFIG をクリックします。
次に右側の Optimizer の部分をクリックすると、↓の画面ではAlphaの部分が学習率の値となります。
ここの表示は使用する更新の式(Updater)によって異なりますが、UpdaterがAdam(デフォルト)の時はAlphaの部分が学習率になります。
他のUpdaterの時(↓の例ではAdagrad)はLearningRateの部分がまさに学習率となります。
このLearningRateの値にさらに、各AfiineのプロパティにあるW.LRateMultiplier、b.LRateMultiplierの値を掛け合わせた値が学習率となります。
つまり、
重みの学習率は LearningRateの値 x W.LRateMultiplier
バイアスの学習率は LearningRateの値 x b.LRateMultiplier
となります。
Updaterの詳細については、ダウンロードしたファイルの中にあるpdfファイル(manual_ja.pdf)に書かれているので、確認すると良いかと思います。
←Deep Learningへ戻る
GUIベースでお手軽にAIのアルゴリズムが構築でいるというソフト【Neural Network Console】がソニーより無償で公開されました。
私は、まだDeep Learningを勉強し始めたばかりなのですが、簡単だという触れ込みなのでまずは試してみました。
動作環境は
・Windows 8.1 / 10 64bit
正式には書かれていませんが、Windows7 64bitでも動作してくれました。
・Visual Studio 2015 C++ 再頒布可能パッケージ
GPUは無くても動作します。(あれば対応させる事も可能)
また、モニタはFull HDサイズぐらいないと厳しいかと思います。
Neural Network Consoleの入手方法は、こちらのページ↓
より、Windowsアプリではじめる をクリックします。
すると、ページが下の方へ移動するので、メールアドレスを入力し、上記に同意して送信をクリックします。
しばらくすると、画面が切り替わるので、送られてきたメールを確認します。
メールには、こんな感じ↓のメールが送られてくるので、Download the Windows Appをクリックして、ファイル(neural_network_console_100.zip、約1GB)をダウンロードします。
メールにも書かれていますが、プログラムを動作さえるにはVisual Studio 2015 C++ 再頒布可能パッケージが必要になります。
https://www.microsoft.com/en-us/download/details.aspx?id=52685
これは、すでにVisual Studio 2015でC++をインストールしてあれば、インストールされているかと思います。
私の場合、Visual Studio 2015→Visual Studio 2017の順でインストールしたところ、Visual Studio 2015 C++ 再頒布可能パッケージ(Visual Studio C++ 2015 Redistributable)はWindowsの設定→アプリと機能で確認しても見つからない状態でしたが、動作してくれました。
次にダウンロードしたzipファイルを解凍します。(解凍後は約2GBになります)
プログラムにインストールそのものは、特に操作する必要が無いのですが、解凍したフォルダを2バイト文字が含まれていない(全角の日本が無い)フォルダに配置する必要があります。
また、Program Filesのような書き込み不可のフォルダでもダメとのこと。
解凍したフォルダ内に実行ファイル(neural_network_console.exe)があるので、これをダブルクリックして実行します。
プログラム起動後に、Visual Studio C++ 2015 Redistributableが入っているか?聞かれるの、入っていいれば、そのままOK、入っていなければ、別途、Visual Studio C++ 2015 Redistributableをインストールしてください。
次にライセンス条項が表示されるので、内容を確認して I Agree を選択し、Applyボタンをクリックします。
すると、このような画面↓が表示されるのですが、あらかじめ用意されているプロジェクト(あらかじめ準備されたニューラルネットワークの構造)が表示されるので、とりあえず
01_logostic_regressin.sdcproj
をクリックしてみます。
このプロジェクトは手書き文字の 4 と 9 を見分けるためのもので、MNISTというデータセットから文字の画像を入手し、4か?9か?を学習して、実際に判別させるためのプロジェクトです。
プロジェクトを起動させると、最初にMNISTから文字の画像データ一式を取得します。
データの入手が終わると、このような画面になります。
まだ、詳細まで理解できていませんが、Input(画像の入力)があって、Affine(画像のアフィン変換かと思いきや、重みを掛けてバイアス足す処理の事のよう)を行って、活性化関数にはSigmoid関数を使い、計算結果と出力の値が最小化されるような処理を行っている
という、シンプルな構成。
次に右上のTraningの下にある▶ボタンをクリックすると、学習が始まります。
Evalutionの下にある▶ボタンをクリックすると、学習データを用いて実際に画像を認識させた結果が表示されます。
ここでは x:image の部分が認識用に使った画像、 y:9 の部分が教え込んだ情報(0だと4の文字、1だと9の文字)、 y’の部分が判定結果になります。
判定結果は0に近いほど4の文字と認識していて、1に近いほど9の文字と認識しています。
この結果で認識が怪しい部分(0.5に近い部分)を抜き出してみると、こんな感じ↓
人の目で見ると126番はあきらかに4だし、203も同様に9にしか見えませんが、このサンプルプロジェクト的には上手く判別できていないようです。
この辺のチューニングが容易に、しかも結果がすぐにわかるのがNeural Network Consoleのプログラムの良いところだと思います。
しかし、結局はDeep Learningの知識は必要になるので、ゼロから作るDeep Learningの本でも読むか?っていう感じです。
また、ソニー製なので、日本語のマニュアルがあるのも助かります。
まずは、解凍したファイル内になったPDFファイル(manual_ja.pdf)に目を通すと良いかと思います。
Neural Network Consoleドキュメント(日本語)
←Deep Learningへ戻る
2017年8月現在、各種ライブラリを使う上で、Visual Studio 2015のC++の開発環境に依存したライブラリやアプリも多く、個人ユーザーとしてはVisual Studio Community 2015 を使いたくなるのですが、通常のダウンロードページ↓
https://www.visualstudio.com/ja/free-developer-offers/
を探しても古いバージョンのVisual Studio Community はダウンロードできません。
古いバージョンの入手ページは、こちら↓
https://www.visualstudio.com/ja/vs/older-downloads/
なのですが、「Visual Studio(MSDN)のサブクリプションにログインするか、無料のDev Essential プログラムに参加して、以前のバージョンにアクセスしてください。」と表示されているように、どちらかの方法で以前のバージョンを取得することになります。
私は「無料のDev Essential プログラムに参加」の方を選びましたが、無料のDev Essential プログラムをクリックすると、下記のページへ行きます。
このページで「今すぐ参加またはアクセス」をクリックすると、このような表示が出てきますが、無料ということで、確認ボタンをクリックします。
このDev Essentialプログラムに参加した状態で、再度、古いバージョンのダウンロードページへ行き、欲しいバージョン(2010,2012,2013,2015)の部分の右上にあるボタンをクリックすると、各バージョンごとのプログラムをダウンロードできるようになります。
https://www.visualstudio.com/ja/vs/older-downloads/
ただし、すでに新しいバージョンのVisual Studioがインストールされた状態で、古いバージョンのVisual Studio をインストールしようとしても失敗する場合があるので、その場合は、新しいバージョンをアンインストールしてから古い順にインストールする必要がありそうです。
(私はそうしましたが、他にいい方法があるのかは分かりません。。)
現状では、新しくPCを購入した場合は、Visual Studio 2015と2017の2つは入れておきたいところですが、私はVisual Studio 2017からインストールしてしまったのが、大きな失敗でした。
古いバージョンを入れたかったのは、2017年8月現在、Visual Studio 2015以前にしか対応していなかったためと、Visual C++ 2015 Redistributableを入れたかったのですが、結局、Visual C++ 2015 Redistributableは上書きされてVisual C++ 2017 Redistributableへ
Visual C++ 2015 Redistributableを必要とするC++のプログラムは動いてくれるのだろうか??
最近はDeep Learningの処理をやろうとすると、ほぼGPUのボードは必須の様なので、比較的最近PCを新調したのですが、私のPCの環境は
Windows10
NVIDIA GeForce GTX 1080
Visual Studio 2015
となります。
※CUDAの開発環境として、Visual Studio 2010,2012,2013のいずれかが必要になるようです。
Visual Studio 2017しか入れていなかった私の環境ではインストールできませんでした。
CUDAはGeForceでは10番台(GTX 1050~)であれば最新のCUDAが動く感じでしょうか?
詳細は以下のページにてご確認下さい。
http://developer.nvidia.com/cuda-gpus
下記ページよりダウンロードします。
https://developer.nvidia.com/accelerated-computing-toolkit
最新のバージョンでは無く、古いバージョンをインストールしたい場合は、ここ↓より入手できます。
https://developer.nvidia.com/cuda-toolkit-archive
CUDA Toolkitの部分のDownloadをクリックし、私の環境はWindowsなので、Windowsをクリックします。
すると、画面が切り替わって、Windowsのバージョンを聞かれるので、私の場合は10をクリックしました。
さらに画面が切り替わって、インストーラの種類を聞かれるので、私はネットワークにつながったPCにインストールするので、 exe[network] を選択しました。
するとさらに画面が開くので、とりあえずBase Installer と Patch2 の2つをダウンロードします。
まずはBaseのインストールから。
ダウンロードしたファイル(cuda_8.0.61_win10_network.exe)をダブルクリックして、インストールします。
exeファイルを起動したら、インストール先を聞かれますが、そのままでも良いと思いますが、私の場合、Cドライブは残りの容量が少ないので、Dドライブにしました。
OKボタンをクリックすると、システムのチェックが始まります。
しばらくすると、画面が切り替わるので、使用許諾に目を通して、 同意して続行する をクリックします。
次の画面はデフォルトのまま 高速(推奨) でOKだと思います。
ここで、Visual Studio 2017しか入れていなかった私のPC環境で出てくるエラー↓
(2010, 2012, 2013, 2015のいづれかが必要になります。)
上記のエラーが出たので、Visual Studio 2015を別途インストールしました。
Visual Studioをインストール後、再度、インストールを行い、
インストール完了!
次へ
サンプルを開いてみると、良さげなサンプルが↓
続いて、ダンロードしたPatch2(cuda_8.0.61.2_windows.exe)の方のインストール。
こちらは、ファイルをダブルクリックして、進めていけば、すぐにインストールは完了します。
CUDA Installation Guide for Microsoft Windows
http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html
古いバージョンのVisual Studio Community/Expressの入手ダウンロード
https://imagingsolution.net/program/visualstudio/download-old-version-visual-studio/
.NETでは座標のアフィン変換用にMatrixクラス(名前空間:System.Drawing.Drawing2D)が用意されています。
しかしながら、やっかいな事に、私の思う普通のアフィン変換の行列の表現が行と列が逆(転置されている)だし、行列の掛ける順番も逆になります。
つまり、私の思う普通のアフィン変換の行列は変換前の座標が\(\left( x,\quad y \right) \)、変換後の座標が\(\left( { x }^{ ‘ },\quad { y }^{ ‘ } \right) \)だとすると、
【普通のアフィン変換】
$$\left( \begin{matrix} { x }^{ ‘ } \\ { y }^{ ‘ } \\ 1 \end{matrix} \right) =\left( \begin{matrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{matrix} \right) \left( \begin{matrix} x \\ y \\ 1 \end{matrix} \right) $$
【マイクロソフトのアフィン変換】
$$\left( \begin{matrix} { x }^{ ‘ } & { y }^{ ‘ } & 1 \end{matrix} \right) =\left( \begin{matrix} x & y & 1 \end{matrix} \right) \left( \begin{matrix} a & d & 0 \\ b & e & 0 \\ c & f & 1 \end{matrix} \right) $$
となります。
さらにアフィン変換を行列で表現するときに、拡大縮小、回転、移動を行列で連続的に計算するときは、一般的なアフィン変換では行列の左側から掛けていきますが、マイクロソフト仕様では行列の右側から掛けてきます。
つまり、拡大縮小、回転、移動の行列をそれぞれ、S、R, T とするとし、拡大縮小S→回転R→移動Tの順番でアフィン変換をする場合、アフィン変換行列は
【普通のアフィン変換】
$$\left( \begin{matrix} { x }^{ ‘ } \\ { y }^{ ‘ } \\ 1 \end{matrix} \right) =TRS\left( \begin{matrix} x \\ y \\ 1 \end{matrix} \right)$$
【マイクロソフトのアフィン変換】
$$\left( \begin{matrix} { x }^{ ‘ } & { y }^{ ‘ } & 1 \end{matrix} \right) =\left( \begin{matrix} x & y & 1 \end{matrix} \right) SRT$$
のようになります。
さらに厄介なのが、アフィン変換行列にさらに変換行列を掛け合わせるメソッドが用意されていて、
拡大縮小:Scaleメソッド
回転:Rotateメソッド
移動:Translateメソッド
が用意されているのですが、例えば下記のようなコード
var mat = new Matrix(
1, 2,
3, 4,
5, 6
);
mat.Scale(7, 8);
を書くと、内部の計算は
$$\left( \begin{matrix} 7 & 0 & 0 \\ 0 & 8 & 0 \\ 0 & 0 & 1 \end{matrix} \right) \left( \begin{matrix} 1 & 2 & 0 \\ 3 & 4 & 0 \\ 5 & 6 & 1 \end{matrix} \right) =\left( \begin{matrix} 7 & 14 & 0 \\ 24 & 32 & 0 \\ 5 & 6 & 1 \end{matrix} \right) $$
となっています。
ここで問題なのが、最初にアフィン変換の行列はマイクロソフト仕様では行列の右側から掛けると言いましたが、単に
mat.Scale(7, 8);
と書くと、行列の左側から行列を掛けてしまいます。
これだと計算が合わないので、
mat.Scale(7, 8, MatrixOrder.Append);
と書くことで、
$$\left( \begin{matrix} 1 & 2 & 0 \\ 3 & 4 & 0 \\ 5 & 6 & 1 \end{matrix} \right) \left( \begin{matrix} 7 & 0 & 0 \\ 0 & 8 & 0 \\ 0 & 0 & 1 \end{matrix} \right) =\left( \begin{matrix} 7 & 16 & 0 \\ 21 & 32 & 0 \\ 35 & 48 & 1 \end{matrix} \right)$$
となります。
つまり、実質的にScaleメソッド、Rotateメソッド、Translateメソッドは必ずMatrixOrder.Appendを指定する必要があります。
私は、この事にハマったのですが、これさえ理解できれば
指定した点周りの回転:RotateAtメソッド
逆行列:Invertメソッド
なども用意されているので、アフィン変換をする分には使えなくは無い感じです。
座標の値をアフィン変換行列で変換した後の座標を求めるには TransformPointsメソッド を用います。
一連のソースコードは
var mat = new Matrix(
1, 2,
3, 4,
5, 6,
);
mat.Scale(7, 8, MatrixOrder.Append);
var poi = new Point[]{ new Point(10, 20), new Point(30, 40) };
mat.TransformPoints( poi );
とすると、
(10, 20) → (525, 848)
(30, 40) → (1085, 1808)
と変換されます。
ただ、さらに残念なのが、アフィン変換で用いられる行列は
$$\left( \begin{matrix} { m }_{ 11 } & { m }_{ 12 } & 0 \\ { m }_{ 21 } & { m }_{ 22 } & 0 \\ { d }_{ x } & { d }_{ y } & 1 \end{matrix} \right) $$
となり、3列目の値はアフィン変換では用いられないので、設定することはできません。
というのが、マイクロソフトの仕様なのですが、設定できればもう少し汎用的に使えたのに...
ここで、わざわざマイクロソフト仕様と書いたのは、他にもDirect3Dでも同様の計算となるためです。
Direct3Dに近いOpenGLでは、ここで言っている一般的なアフィン変換となるので、混同しないように注意してください。
【参考情報】
Matrixクラス:https://msdn.microsoft.com/ja-jp/library/system.drawing.drawing2d.matrix(v=vs.110).aspx
変換の行列表現:https://msdn.microsoft.com/ja-jp/library/8667dchf(v=vs.110).aspx
一般的なアフィン変換:https://imagingsolution.net/imaging/affine-transformation/
←C#へ戻る
C#でファイルを開くときに使うOpenFileDiaologクラス(名前空間: System.Windows.Forms)の例です。(主に自分のコピペ用)
下記のファイルは画像ファイルを開く例です。
//ファイルを開くダイアログボックスの作成
var ofd = new OpenFileDialog();
//ファイルフィルタ
ofd.Filter = "Image File(*.bmp,*.jpg,*.png,*.tif)|*.bmp;*.jpg;*.png;*.tif|Bitmap(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg|PNG(*.png)|*.png";
//ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない)
if (ofd.ShowDialog() == DialogResult.Cancel) return;
// 取得したファイル名
var fileName = ofd.FileName;
←C#へ戻る
そこそこ前に買ったキヤノンのプリンター(MG6930)ですが、何気に初めてCDのレーベルを印刷してみようとしたところ、CDのトレーが見当たらない!!
これ↓(見つかった後の写真)
付属品や段ボールも探してみたけど無い!!!
と、あちこち10分ぐらい探したら、結局、こんなところで発見!
CDトレーの場所は、2段になっている給紙トレーの上側(1と書いてある方)を外して。。。
その裏に、くっ付いてた!!
あやうくアマゾンでCDトレーを買ってしまうところでした!
と、きっと同じ経験をした人がいるんではないかな~と思って、記事にしてみました。