「TensorFlowSharp」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
 
(4人の利用者による、間の12版が非表示)
1行目: 1行目:
'''TensorFlowSharp'''<ref>https://github.com/migueldeicaza/TensorFlowSharp</ref>とは、TensorFlowを[[Mono]]から叩けるようにしたバインディングライブラリである。
+
'''TensorFlowSharp'''<ref>https://github.com/migueldeicaza/TensorFlowSharp</ref>とは、[[TensorFlow]]を[[Mono]]から叩けるようにしたバインディングライブラリである。
 
   
 
   
 
== 概要 ==
 
== 概要 ==
Miguel de Icaza氏のツイッターから流れてきた。
+
[[Mono]]の神様である[[Miguel de Icaza]]氏のツイッターから流れてきた。
ソースコードレベルでの移植ではなくバインディングなので事前の環境構築が必要となる。
+
[[ソースコード]]レベルでの[[移植]]ではなくバインディングなので事前の環境構築が必要となる。
 +
事前に構築した[[データベース]]をもとに[[Xamarin]]と[[スマホ]]単体で[[人工知能]]が使えるようになると色々おもしろいかもしれない。
  
 
== 環境構築 ==
 
== 環境構築 ==
13行目: 14行目:
 
  ln -s /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib
 
  ln -s /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib
  
 +
== 公式サンプルを動かしてみる ==
 
TensorFlowSharpの[[ソースコード]](サンプル含む)を落としてくる。
 
TensorFlowSharpの[[ソースコード]](サンプル含む)を落としてくる。
 
  git clone https://github.com/migueldeicaza/TensorFlowSharp.git
 
  git clone https://github.com/migueldeicaza/TensorFlowSharp.git
26行目: 28行目:
 
  TFWhileParams result = TF_NewWhile (handle, inputs, inputs.Length, cstatus.handle);
 
  TFWhileParams result = TF_NewWhile (handle, inputs, inputs.Length, cstatus.handle);
  
== プロジェクトを作る ==
+
== プロジェクトを作ってみる ==
* フレームワーク:.NET Framework 4.6.1
 
 
* プラットフォーム:x64 ←これ重要
 
* プラットフォーム: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」で検索していれる。
  
libtensorflowが64ビット必須であるため、プラットフォームターゲットを「x86」にしたままビルドすると実行時に落ちる。
+
== サンプル ==
必ずx64でビルドする必要がある。
+
 
 +
=== 足し算 ===
 +
とりあえず「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");
 +
 
 +
                    // 足し算
 +
                    var multiplyResults = session.GetRunner().Run(session.Graph.Add(a, b));
 +
                    var multiplyResultValue = multiplyResults.GetValue();
 +
                    Console.WriteLine("a + b = {0}", multiplyResultValue);
 +
 
 +
                    // 保存
 +
                    session.SaveTensors("saved.tsf", ("a", a), ("b", b));
 +
                }
 +
 
 +
                Console.WriteLine("-- load --");
 +
                using (var session = new TFSession())
 +
                {
 +
                    // 読込
 +
                    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>
  
 
== 関連項目 ==
 
== 関連項目 ==
40行目: 127行目:
  
 
{{stub}}
 
{{stub}}
 +
<references />

2018年8月21日 (火) 06:03時点における最新版

TensorFlowSharp[1]とは、TensorFlowMonoから叩けるようにしたバインディングライブラリである。

概要[編集 | ソースを編集]

Monoの神様であるMiguel de Icaza氏のツイッターから流れてきた。 ソースコードレベルでの移植ではなくバインディングなので事前の環境構築が必要となる。 事前に構築したデータベースをもとに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への「参照」を追加する。
    NuGetにもTensorFlowSharpCoreというライブラリがあるようだが何故かパッケージ追加に失敗する。TensorFlowSharpのソースコードを落としてきてプロジェクトごと参照に追加する方法だと問題ない。
    NuGet版も正常に動くようになっている。「TensorFlowSharp」で検索していれる。

サンプル[編集 | ソースを編集]

足し算[編集 | ソースを編集]

とりあえず「c = a + b」という式をTensorFlowに投げて実行してみる。

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());
		}
	}
}

保存と読込[編集 | ソースを編集]

1年前はできなかった保存と読込ができるようになったぞ。トレーニングも捗るな。

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");

                    // 足し算
                    var multiplyResults = session.GetRunner().Run(session.Graph.Add(a, b));
                    var multiplyResultValue = multiplyResults.GetValue();
                    Console.WriteLine("a + b = {0}", multiplyResultValue);

                    // 保存
                    session.SaveTensors("saved.tsf", ("a", a), ("b", b));
                }

                Console.WriteLine("-- load --");
                using (var session = new TFSession())
                {
                    // 読込
                    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);
                }
            }
        }
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]