visual studioでtensorflow

はじめましてkatoutです。

この記事は巷で流行ってると聞くTensorFlowをVisualStudioで動かそうという試みです。

ちなみに機械学習についてはこれが入門で始めるので新しい知識を求めている方向けではございません。
また、もっと他の最善の方法があると思うので知っている方がいましたら教えてください。

## 目的

[Installing TensorFlow for C](https://www.tensorflow.org/install/install_c)という公式ドキュメントがありますがwindowsはサポートに含まれていません。
それをwindowsでやってみようというのが今回の目的です。

## 全体の流れ

1. jenkinsおじさんがビルドしたdllをダンロード
2. libの生成
3. VisualStudioで読み込み
4. Hello World!

## 1.dllのダウンロード

tensorflow公式jenkinsよりcライブラリdllをダウンロードします。
[libtensorflow-cpu-windows-x86_64.zip](http://ci.tensorflow.org/view/Release/job/release-libtensorflow-windows/lastSuccessfulBuild/artifact/lib_package/libtensorflow-cpu-windows-x86_64.zip)

中身を見ると以下のようになっており暗黙的リンクをするにはlibが足りないため生成を行います。

> c_api.h
> LICENSE
> tensorflow.dll

## 2. libの生成

libを生成するにはvisual studioに付属しているlib.exeを利用することで作成できます。

libを作るためまずdefファイルが必要となるため以下のコマンドで定義を調べ

```
dumpbin.exe /EXPORTS tensorflow.dll > tensorflow.txt
```
```text:tensorflow.txt
Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file tensorflow.dll

File Type: DLL

  Section contains the following exports for libtensorflow.so

    00000000 characteristics
    593620A4 time date stamp Tue Jun  6 12:25:24 2017
        0.00 version
           1 ordinal base
         131 number of functions
         131 number of names

    ordinal hint RVA      name

          1    0 020A4440 ?DEVICE_CPU@tensorflow@@3QEBDEB
          2    1 020A4448 ?DEVICE_GPU@tensorflow@@3QEBDEB
          3    2 020A4450 ?DEVICE_SYCL@tensorflow@@3QEBDEB
          4    3 00172050 TF_AbortWhile
          5    4 00172060 TF_AddControlInput
          6    5 00172070 TF_AddGradients
...
```

defファイル自力を作ります。

```def:tensorflow.def
LIBRARY  tensorflow
EXPORTS
 TF_AbortWhile
 TF_AddControlInput
 TF_AddGradients

...

 TF_TensorType
 TF_Version
```

最後に作成したtensorflow.defからlib.exeを利用しtensorflow.libを生成します。

```
lib /def:tensorflow.def /machine:x64
```

> c_api.h
> LICENSE
> tensorflow.def
> tensorflow.dll
> tensorflow.exp
> tensorflow.lib
> tensorflow.txt

## 3.visual studioで読み込み

* 適当にwin32コンソールアプリケーションを作成
* プラットフォーム設定をx64に
![x64.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/3acdb610-6658-df24-a871-e6ea3acf72ac.png)


* 構成プロパティ / C/C++ / プリプロセッサの「プリプロセッサの定義」に「COMPILER_MSVC」を追加  
![pre.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/0b42ac44-644f-4386-b32f-7c57275513ed.png)


* 構成プロパティ / C/C++ / 全般の「追加インクルードディレクトリ」に一番はじめにdlしたc_api.hのフォルダを追加  
![inc.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/33816b24-f17a-62ec-63af-5a47ec888a1f.png)

* 構成プロパティ / リンカー / 全般の「追加ライブラリディレクトリ」にtensorflow.libが含まれるフォルダを追加  
![libdir.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/509d1d1a-e570-5453-a66d-bf31a6c63657.png)

* 構成プロパティ / リンカー / 入力の「追加の依存ファイル」にtensorflow.libを追加  
![lib.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/f37b85f5-cb1b-d480-4f49-16172cb37204.png)

* 一番はじめにdlしてきたtensorflow.dllを実行ファイルと同じ階層へ配置

```
$(SolutionDir)\x64\Debug\tensorflow.dll
```
## 4.Hello World!

[Installing TensorFlow for C](https://www.tensorflow.org/install/install_c)のドキュメントに従って以下のファイルを作成し実行。

```c:hello_tf.c
#include <stdio.h>
#include <c_api.h>

void main() {
	printf("Hello from TensorFlow C library version %s\n", TF_Version() );
}
```
![fin.PNG](https://qiita-image-store.s3.amazonaws.com/0/27776/a5899ed6-e97c-e148-8eb3-9bddc1708c26.png)

## おわりに

素直にcmake [CMakeLists.txt](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/cmake) でビルドすればいいと思います。時間があるときにやってみたいと思います。

次はc++のライブリラリを読み込んで実際にtensorflowにて機械学習を動かす部分を目指します。