imported>Administrator |
|
1行目: |
1行目: |
− | '''TensorFlowSharp'''<ref>https://github.com/migueldeicaza/TensorFlowSharp</ref>とは、[[TensorFlow]]を[[Mono]]から叩けるようにしたバインディングライブラリである。 | + | '''Q学習'''([[英語]]:q-learning)とは、[[機械学習]]の手法のひとつである。 |
− |
| + | |
| == 概要 == | | == 概要 == |
− | [[Mono]]の神様である[[Miguel de Icaza]]氏のツイッターから流れてきた。
| + | Q学習は古典的な機械学習手法である。 |
− | [[ソースコード]]レベルでの[[移植]]ではなくバインディングなので事前の環境構築が必要となる。
| |
− | 事前に構築した[[データベース]]をもとに[[Xamarin]]と[[スマホ]]単体で[[人工知能]]が使えるようになると色々おもしろいかもしれない。
| |
− | | |
− | == 環境構築 ==
| |
− | === Mac ===
| |
− | TensorFlowSharp公式の説明ではlibtensorflowのバイナリを直接[[ダウンロード]]するように指示されているが、[[mac]]だとhomebrewにもlibtensorflowがあるようなのでこちらを使った。
| |
− | brew install libtensorflow
| |
− | | |
− | homebrewではlibtensorflowの拡張子が「.so」のままなので「.dylib」のシンボリックリンクを貼る。
| |
− | ln -s /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib
| |
− | | |
− | == 公式サンプルを動かしてみる ==
| |
− | TensorFlowSharpの[[ソースコード]](サンプル含む)を落としてくる。
| |
− | git clone https://github.com/migueldeicaza/TensorFlowSharp.git
| |
− | cd TensorFlowSharp
| |
− | | |
− | なぜかサンプル周りで使われているパッケージの復元を[[Xamarin Studio]]で実行すると失敗するのでコンソール上で復元しておく。
| |
− | nuget restore
| |
− | | |
− | [[Xamarin Studio]]で開いてみる
| |
− | open TensorFlowSharp.sln
| |
− | | |
− | SampleTestプロジェクトを実行してみると以下の部分で例外が発生して落ちる。なぜかは知らん。
| |
− | TFWhileParams result = TF_NewWhile (handle, inputs, inputs.Length, cstatus.handle);
| |
− | | |
− | == プロジェクトを作ってみる ==
| |
− | * プラットフォーム:x64 ←これ重要
| |
− | *: Xamarin Studioで「コンソールアプリケーション」を作るとデフォルトで「x86」となっているので変更する。libtensorflowが64ビット必須であるため「x86」にしたままビルドすると実行時に落ちる。必ずx64でビルドする必要がある。
| |
− | * フレームワーク:.NET Framework 4.6.1以上
| |
− | *: Xamarin Studioで「コンソールアプリケーション」を作るとデフォルトで「.NET Framework 4.5」となっているので変更する。これをやらないとTensorFlowSharpを参照に追加する際にグレーアウトしている。
| |
− | *: [[Visual Studio for Mac]]でプロジェクトを新規作成すると.NET Framework 4.7が選ばれるはずなので変更する必要はない。
| |
− | * TensorFlowSharpへの「参照」を追加する。
| |
− | *: <s>NuGetにもTensorFlowSharpCoreというライブラリがあるようだが何故かパッケージ追加に失敗する。TensorFlowSharpのソースコードを落としてきてプロジェクトごと参照に追加する方法だと問題ない。</s>
| |
− | *: NuGet版も正常に動くようになっている。「TensorFlowSharp」で検索していれる。
| |
− | | |
− | == サンプル ==
| |
− | | |
− | === 足し算 ===
| |
− | とりあえず「c = a + b」という式をTensorFlowに投げて実行してみる。<syntaxhighlight>
| |
− | using System;
| |
− | using System.Collections.Generic;
| |
− | using System.Linq;
| |
− | using TensorFlow;
| |
− | | |
− | namespace sample
| |
− | {
| |
− | class MainClass
| |
− | {
| |
− | public static void Main(string[] args)
| |
− | {
| |
− | var graph = new TFGraph();
| |
− | var a = graph.Const( 1, "a"); // a = 1
| |
− | var b = graph.Const( 2, "b"); // b = 2
| |
− | var c = graph.Add( a, b, "c"); // c = a + b
| |
− | | |
− | // 実行
| |
− | var session = new TFSession(graph, new TFSessionOptions());
| |
− | var runner = session.GetRunner();
| |
− | var result = runner.Run(c);
| |
− | | |
− | // c = 3
| |
− | Console.WriteLine(result.FirstOrDefault());
| |
− | }
| |
− | }
| |
− | }
| |
− | </syntaxhighlight>
| |
− | | |
− | === 保存と読込 ===
| |
− | 1年前はできなかった保存と読込ができるようになったぞ。トレーニングも捗るな。<syntaxhighlight>
| |
− | using System;
| |
− | using System.Collections.Generic;
| |
− | using System.Linq;
| |
− | using System.Text;
| |
− | using System.Threading.Tasks;
| |
− | using TensorFlow;
| |
− | | |
− | namespace tensor1
| |
− | {
| |
− | class MainClass
| |
− | {
| |
− | public static void Main(string[] args)
| |
− | {
| |
− | using (var graph = new TFGraph())
| |
− | {
| |
− | Console.WriteLine("-- save --");
| |
− | using (var session = new TFSession(graph))
| |
− | {
| |
− | // 数値を作る
| |
− | var a = session.Graph.Const(30, "a");
| |
− | var b = session.Graph.Const(12, "b");
| |
| | | |
− | // 足し算
| + | Q学習で[[ググる]]と小難しい説明が多いようだが、大雑把にいえば、 |
− | var multiplyResults = session.GetRunner().Run(session.Graph.Add(a, b));
| + | 関数qは、ある状況sにおいて、行動aを選択した場合の結果を得点として返す。 |
− | var multiplyResultValue = multiplyResults.GetValue();
| + | このQ(s,a)関数の行動aを変えまくって最高得点が出るパターンを力技で見つけるというものである。 |
− | Console.WriteLine("a + b = {0}", multiplyResultValue);
| + | Q(s, a) |
| | | |
− | // 保存
| + | 行動aの試行回数を多くすれば性能は次第に向上する。 |
− | session.SaveTensors("saved.tsf", ("a", a), ("b", b));
| + | 勉強に近道はないということだな。 |
− | }
| |
| | | |
− | Console.WriteLine("-- load --");
| + | 2015年2月26日にグーグルでAlphaGoを作った人たちが、 |
− | using (var session = new TFSession())
| + | 古典的なQ学習を、流行りの[[ディープラーニング]]に喰わせた「[[DQN (Deep Q Network)]]」という画期的な人工知能を発表し、とくに日本で話題となった<ref>[https://news.yahoo.co.jp/pickup/6151054 Yahoo!ニュース グーグル開発の人工知能、その名も「DQN」ネットでは「命名事故?」「奇跡的」]</ref><ref>[http://getnews.jp/archives/1481281 Google人工知能「賢いDQN」にネット困惑]</ref>。 |
− | {
| |
− | // 読込
| |
− | var a = session.RestoreTensor("saved.tsf", "a", TFDataType.Int32);
| |
− | var b = session.RestoreTensor("saved.tsf", "b", TFDataType.Int32);
| |
− | // 足し算
| |
− | var multiplyResults = session.GetRunner().Run(session.Graph.Add(a, b));
| |
− | var multiplyResultValue = multiplyResults.GetValue();
| |
− | Console.WriteLine("a + b = {0}", multiplyResultValue);
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | </syntaxhighlight> | |
| | | |
| == 関連項目 == | | == 関連項目 == |
− | * [[CentOS 7/MonoDevelopをインストールする]] | + | * [[DQN (人工知能)]] |
| | | |
| == 参考文献 == | | == 参考文献 == |
127行目: |
22行目: |
| | | |
| {{stub}} | | {{stub}} |
− | <references />
| + | |
| + | [[category: 機械学習]] |
| + | [[category: 人工知能]] |