「TensorFlowSharp」の版間の差分
imported>Administrator |
|||
(4人の利用者による、間の11版が非表示) | |||
1行目: | 1行目: | ||
− | '''TensorFlowSharp'''<ref>https://github.com/migueldeicaza/TensorFlowSharp</ref> | + | '''TensorFlowSharp'''<ref>https://github.com/migueldeicaza/TensorFlowSharp</ref>とは、[[TensorFlow]]を[[Mono]]から叩けるようにしたバインディングライブラリである。 |
== 概要 == | == 概要 == | ||
− | Miguel de | + | [[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); | ||
− | == | + | == プロジェクトを作ってみる == |
− | |||
* プラットフォーム: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」で検索していれる。 | ||
== サンプル == | == サンプル == | ||
− | |||
− | < | + | === 足し算 === |
+ | とりあえず「c = a + b」という式をTensorFlowに投げて実行してみる。<syntaxhighlight> | ||
using System; | using System; | ||
using System.Collections.Generic; | using System.Collections.Generic; | ||
49行目: | 54行目: | ||
{ | { | ||
var graph = new TFGraph(); | var graph = new TFGraph(); | ||
− | var a = graph.Const(1, "a"); // a = 1 | + | var a = graph.Const( 1, "a"); // a = 1 |
− | var b = graph.Const(2, " | + | var b = graph.Const( 2, "b"); // b = 2 |
− | var c = graph.Add(a, b, "c"); // c = a + b | + | var c = graph.Add( a, b, "c"); // c = a + b |
// 実行 | // 実行 | ||
63行目: | 68行目: | ||
} | } | ||
} | } | ||
− | </ | + | </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> | ||
== 関連項目 == | == 関連項目 == | ||
72行目: | 127行目: | ||
{{stub}} | {{stub}} | ||
+ | <references /> |
2018年8月21日 (火) 06:03時点における最新版
TensorFlowSharp[1]とは、TensorFlowをMonoから叩けるようにしたバインディングライブラリである。
目次
概要編集
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);
}
}
}
}
}