しんさんのブログ

科学や技術のこと読書のことなど

TensorFlow始めました [環境整備編]

今年になってTensorFlow1.0がリリースされてWindows上でも比較的安定して動くようですので、 Windows10 64bitが動いているデスクトップマシンとノートPCでTensorFlow1.0の実行環境を整備してみました.

情報はすべて2017/4/15のものです.


まずはTensorFlowのドキュメント確認

とりあえずTensorFlowのトップページを見てみます。
https://www.tensorflow.org/

一番上のタグにInstallという項目があるのでそこをクリックするとインストールに関する情報が出てきます。
この説明に従ってTensorFlow環境を構築していきます。

わかりやすい英語で書いてあるので読みやすいですが、開発中ということもありリンク先や記述にたまに間違いがあります

Anaconda(Python3環境)のインストール

私のPC環境:Windows10 Pro64bit
CPU: Intel Corei7-7700 3.6GHz
Memory: 32GB
GPU: NVIDIA GTX 1050

まずはOS選択でWindowsを選ぶ

TensorFlowのドキュメントにはGPU,CPU版があるよという説明があります。
GPU版はNvidia GPUとCudaが必要だよという説明がありますね。

その下に行くと、Pythonの環境をどうするかが書いてあります。 Anacondaがお手軽そうなので"Installing with Anaconda"という項目を読みます。 Anacondaのダウンロードサイトから https://www.continuum.io/downloads Anaconda 4.3.1をダウンロードし、インストールします。 コンソールから、

    C:> conda create -n tensorflow

でtensorflowという名前の仮想環境を作ります。 これは、スタートメニューのAnaconda-> Anaconda Navigator -> Environments からでも作れます。 私はこのGUIから仮想環境を作りました。その際、Pythonのバージョンの選択を3.5にしておきました。 ちなみにtensorflowという環境名は任意の名前でOKです。 すると、Anacondaが自動的に必要なパッケージをインストールしてくれます。 作成した仮想環境でjupyter notebookが使えるように Anaconda NavigatorのHomeで Applications on “” ののところを先ほど構築した仮想環境に変更してjupyter notebookをインストールします。
これでpythonの環境構築は修了です。

TensorFlow本体のインストール

コマンドプロンプト

    conda info -e

で作成した環境を確認する。

    C:> activate tensorflow
     (tensorflow)C:>  # Your prompt should change

で構築した仮想環境をactiveにする。(もとに戻すにはdeactiveコマンド) 星印がついているのがactiveになっている環境です.

次に以下のコマンドでこの環境にTensorFlowをインストールします

    pip install --upgrade tensorflow

GPU版は 

        pip install --upgrade tensorflow-GPU

で最新版がインストールできるようです。
バージョンを指定してインストールするにはtensorflowのページに書いてあるように パッケージ名を指定すればいいようです。
ちなみにGPU版をインストールするときはCPU版と別の仮想環境にインストールするように注意しましょう。
これであとは自動的にtensorflow本体と実行するのに必要なパッケージをインストールしてくれます。
私の環境では初めにこのpip install がうまく動かなかったので

            pip install --upgrade -I setuptool

としてセットアップツールをインストールすると解決しました。

以上で環境構築は修了です。簡単ですね。

最後に正しくインストールされているかどうかの確認を行います。

コンソール上でPythonを起動して

    >>> import tensorflow as tf

    hello = tf.constant('Hello, TensorFlow!')
    sess = tf.Session()
    print(sess.run(hello))

これで、正しくHello, TensorFlow!が表示されればOKです。

次回はTensorFlowのドキュメントのdevelopタグに移ります
https://www.tensorflow.org/get_started/get_started
ここの"Getting Started With TensorFlow “を順を追って読んで、自分の環境でTensorFlowで簡単な機械学習を動作させてみます.

Firefox 52.0.2 ではてなツールバーのログイン状態が維持できない

Windows10 + Firefox 52.0.2 64bit版を使用しているのですが、なぜかはてなツールバーのログイン状態が維持できないです。
サードパーティークッキーは許可しているのですが、はてなにログインボタンを押してログインした後もログイン状態が維持できないです。
理由がわかる方おられたらコメントいただけると嬉しいです。

Visual Studio Codeの設定メモ. Markdown, Latexなどなど

Visual Studio codeの設定メモ

VS code設定追加と見直し 2020/7/22版

からあげさんのページを参考にしました。 karaage.hatenadiary.jp 以下の3つはコーディングには必須ですね。便利です。 Bracket Pair Colorizer 2 indent-rainbow Trailing Spaces その他、markdown関連を少し見直してインストールしなおしました。

Visual Studio codeにインストールした拡張機能

  • Auto-Opne Markdown Preview: 自動的にプレビューが開くので便利
    - 複数のmdのタブがあるときも一つしかプレビューできない
    -> 便利かなと思ったが急にタブが開くのもうっとおしいので無効にしてある
  • Markdown+Math: Markdownのプレビューで数式が表示可能
  • MarkdownPDF: MarkdownをPDFに変換するツール
  • VSCode Great Icons: アイコンを表示
  • Latex Workshop: Latexコンパイルとpdf出力やプレビュー可能
  • Latex Preview: Latex Workshopと比べてみる(今はdisabelにしている)

以下のサイトを参考にしました
http://www.procrasist.com/entry/vscode-fallinlove

フォントの設定, MathJaxの有効化などの解説が以下にあります
http://qiita.com/yumetodo/items/1a8d371a20ba9a50eeaf

tex fileに関しては,以下のサイトに書いてあるように基本Texで書いてめんどくさいところで適宜Pandocでmd -> Tex変換がベストな気がする. http://qiita.com/ssh0/items/679ac9dd3c33b0e5cd90

後はVS codeでターミナルを開いて( Ctrl+`でVS code内に, Ctrl+Shift+Cで別ウインドウで)そこでコンパイルしたりプレビューすればいいのかなと思います. 適当にエリアスを作っておけば, コマンド一発なのでそれが便利かな.

そもそもVS codeってどんなことできるのという段階では以下を読むとよくわかる http://www.atmarkit.co.jp/ait/articles/1507/10/news028.html

Sublime3+Windows10で日本語変換の場所がずれる問題

最近Windows10の環境に移行したので、Sublime3を早速セットアップしました。
基本的なセットアップはこのブログに書いてある通りなのですが、IMESupportを導入しても日本語変換の返還窓がずれて表示されます。
入力している文字のすぐそばに表示してくれればいいのですが、その場所が左のほうにだいぶずれてしまいます.
github.com
この問題はまだ解決されていないようですが、日本語を入力するときだけ少し不便な程度なのでいまは目をつぶることにします。(2017/3/9)
Visual studio Codeに乗り換えた人もいるようですが、僕はやっぱりSublimeを使い続けようかなと思います.
[追記:使い続けようといいつつVS codeに乗り移りつつあります]

Processingの高速化 Tips その1

Processingでpixel shaderを使って、ピクセル操作を行っているときにシェーダーはほとんど何もしていないのに異常に処理速度がかかってしまう問題にはまりましたので、その原因と解決方法をメモっておきます。

やっていることは、以下のコードを見ていただくとわかりますがProcessing のPGraphicsオブジェクトを使用して、pixel shaderでカラーをバッファーに書き込み表示するという非常に単純なものです。

[Processingの本体のコード]

// Processing performance test
PShader simpleShader;
PGraphics pgShader;

int scrn_w = 0;
int scrn_h = 0;

float time;
PImage image0, image1;

void setup() {
  size(400, 400, P2D);
  frameRate(120);
  scrn_w = width;
  scrn_h = height;
  simpleShader = loadShader("simpleShader.glsl");
  image0 =createImage( scrn_w, scrn_h, RGB );
 
  pgShader = createGraphics(scrn_w, scrn_h, P2D);
   
}

void draw() {
    float starttime = millis();
    pgShader.beginDraw();
    pgShader.shader(simpleShader);
    //pgShader.image(image0, 0, 0);
    pgShader.image(pgShader.get(), 0, 0); // this line take a lot of time
    pgShader.endDraw();
    image(pgShader, 0, 0);
    float endtime = millis();
    println("time " + (endtime - starttime) + "ms"); 
     
    // faster code
    //shader(simpleShader); 
    //rect(0, 0, width, height);
}

[pixel shaderのコード: simpleShader.glsl]

void main(void) {
  gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
}

このコードを実行すると私の使用しているマシーンですと20msec近くかかってしまいます。
以下の一行をコメントアウト

pgShader.image(pgShader.get(), 0, 0); // this line take a lot of time

以下の1行をアンコメントすると、

//pgShader.image(image0, 0, 0);

期待通り1msec程度で走るようになります。
おそらくpgShader.get()がバッファーのコピーを行っているのではないかと思われます。
あるいは、pgShaderが毎フレームレンダー用のバッファを用意しているのかもしれません。

Processingのインプリに詳しい方で原因のわかる方おられましたら教えてください。

球面調和関数を視覚化してみまして

球面調和関数と言えば物理やってる人は、水素原子のシュレディンガー方程式の解ということで学部時代に一度は教科書で見たことあるとか、テスト勉強で解いてみたことあるっていう人も多いのではないかと思います。
ルジャンドルの陪関数が出てきたり、添え字がいくつか出てきて混乱したり数式を見て挫折することも多いですが、よくよく見ると構造は単純で、三角関数の三次元版だと思えばいいわけです。

そんな球面調和関数ですが、コンピュータグラフィックスの世界でも意外と使われています。
先日ブログで球面調和に関するリンク集をつくりましたが、そこにいくつかCGでの応用例があります。
球面調和関数と大域照明について(web上のリンク集) - 科学やら技術やら

ざっくり言って信号処理で信号をフーリエ展開するように、CGでオブジェクトのライティングを行う際にいろんな方向からやってくるたくさんの光をひとまとめにして球面調和関数で展開してしまい、入ってくる光の情報を展開係数に圧縮してしまおうという話です。光源の高周波成分はどうせ拡散反射するならわかりませんから。

そんな球面調和関数をprocessingを使って描画するコードを書いてみました。
WEB上には、OpenGLとかDirectXを使ったコードは転がっていますが実行するにはライブラリやらSDKやらなにかと必要で敷居が高いのでさくっと実行できるProcessingで書いてみました。
元にした球面調和関数のコードは以下から使用させていただきました。
☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(1)』

実行結果はこんな感じです↓
f:id:wshinya:20161208103747j:plain

まあやっていることは、ものすごく単純で、Processingのサンプルにある
processing-docs/NoiseSphere.pde at master · processing/processing-docs · GitHub
を改造して、lineで書いた球を乱数でゆらゆらしている部分の、lineで線を書いている部分を流用して、線の長さを球面調和関数の結果に置き換え、符号を色に置き換えただけです。
球面調和関数の計算コードは、Project Asuraさんのコードほぼそのままです。
キーボードからの入力でリアルタイムに球面調和の次数(l, m)を変えてイガイガの形を変えたり、マウスでぐりぐり回転させたりして楽しんでます。

コードは以下からどうぞ↓
github.com

球面調和関数と大域照明について(webリンク集)

大域照明について、球面調和関数を使用する方法と球面調和関数そのものについての解説記事にリンク集を自分メモように作ります。
多くのサイトで球面調和を計算したり可視化するコードが公開されていますが、ほぼ同じようなコードとなっているようです。

1) 以下のサイトでは球面調和関数をつかったリアルタイム大域照明について解説してあります。

数式もあり、DirectX9のコードもあります。
実装コードが何を意味しているのかも解説があります。球面調和関数そのものについての説明はありません。
t-pot『リアルタイム大域照明』

2) そもそも大域照明(グローバルイルミネーション)ってなに?ということに関して、ゲームでの事例の解説記事です。

セガ、新作「ソニック ワールドアドベンチャー」におけるライティング技法を公開

3) この記事も大域照明に関する解説記事、(2)よりも詳しい。球面調和だけでなくPRT(Precomputed Radiance Transfer)全般についてまとめてある。

筆者は西川善司さん.
itmemolog.blogspot.jp
上の記事は古くて、最新の記事は以下の記事一部になっているのかも。
news.mynavi.jp

4) 球面調和関数で大域照明をするときの実装に関するものすごく簡単な解説。

実装されたコードへのリンクがある。
blogs.yahoo.co.jp

5) (4)のブログで実装先としてリンクされいるサイト。球面調和関数で大域照明を実装するときに多くのサイトから参照されている大元になるぺージ。

このサイトのコードが元になっているサイトが多い。
An Efficient Representation for Irradiance Environment Maps

6) Asuraさんの記事。球面調和を視覚化するサンプルコード。具体的に式もかいてある。CGで使う場合は実部のみを利用するがようの式もきちんと記述してある

☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(1)』
球面調和関数を使ってキューブマップを近似(圧縮)するコードと解説。
☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(2)』

7) 藤田さんの球面調和関数の多項式表現のpdfドキュメント。

CGで利用する実数球面調和関数について正しく記述してある(ネットにはこの記述間違いの記事もある)
また、デカルト座標系での球面調和関数についての記述もある。
http://lucille.sourceforge.net/blog/images/shpoly.pdf

8) 球面調和関数計算の高速化についての記述。Web上で球面調和展開した画像を取得するアプリも公開されている。

Spherical Harmonic Expansion

9) GLUTを使って球面調和関数の値を描画するテストプログラムのソース

http://harumune.s56.xrea.com/assari/index.php?%B5%E5%CC%CC%C4%B4%CF%C2%B4%D8%BF%F4

10) pythonを用いた球面調和関数の視覚化

takuyaokada.hatenablog.com

11) msdnによるPRTの解説とサンプル.サイトの一番下にあるリンクからさらにPRTレンダリングに関する解説に飛べます.

PRTDemo サンプル