TensorFlow : Guide : Misc : よくある質問 (FAQ) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/14/2018
作成日時 : 09/16/2017
* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* 本ページは、TensorFlow 本家サイトの Guide – Misc – Frequently Asked Questions を翻訳した上で
適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、適宜、追加改変している場合もあります。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
このドキュメントは TensorFlow についてのよくある質問の幾つかに対する回答を提供します。ここでカバーされていない質問がある場合には、TensorFlow community resources の一つで答えが見つかるかもしれません。
特徴と互換性
複数のコンピュータで分散訓練を実行できますか?
はい! TensorFlow はバージョン 0.8 で 分散計算のためのサポート を獲得しました。TensorFlow は今では一つまたはそれ以上のコンピュータで複数のデバイス (CPU と GPU) をサポートします。
TensorFlow は Python 3 で動作しますか?
0.6.0 リリース時間枠 (= timeframe) (2015年12月上旬) の時点で、Python 3.3+ をサポートしました。
TensorFlow グラフを構築する
グラフの構築についての API 文書 もまた見てください。
何故 c = tf.matmul(a, b) は行列乗算を直ちに実行しないのでしょう?
TensorFlow Python API では、a, b そして c は tf.Tensor オブジェクトです。Tensor オブジェクトは演算の結果へのシンボリック・ハンドルですが、しかし演算の出力の値を実際には保持していません。代わりに、TensorFlow は (ニューラルネットワーク全体とその勾配のような) 複雑な式をデータフロー・グラフとして組み上げることをユーザに奨励します。それからデータフロー・グラフ全体の計算を TensorFlow tf.Session に委ねます、これは計算全体を、演算を一つずつ実行するよりもはるかに効率的に実行することができます。
デバイスはどのように命名されますか?
サポートされるデバイス名は CPU デバイスに対しては “/device:CPU:0” (または “/cpu:0”) 、そして ith GPU デバイスに対しては “/device:GPU:i” (または “/gpu:i”) です。
特定のデバイス上にどのように演算を置きますか?
デバイス上に演算のグループを置くためには、それらを with tf.device(name): コンテキスト内で作成します。TensorFlow が演算をどのようにデバイスに割り当てるかの詳細のためには TensorFlow で GPU を使用する の how-to 文書を、そして複数の GPU を使用するサンプル・モデルについては CIFAR-10 チュートリアル を見てください。
TensorFlow 計算を実行する
グラフの実行についての API 文書 もまた見てください。
供給 (= feeding) と placeholder の処理とは何か?
供給は TensorFlow Session API のメカニズムで実行時に一つまたはそれ以上のテンソルのために異なる値を用いることを可能にします。tf.Session.run への feed_dict 引数は tf.Tensor オブジェクトを numpy 配列 (そして幾つかの他の型) にマップする辞書で、これはステップの実行でそれらのテンソルの値として使用されます。
しばしば、入力のような、常に供給されるあるテンソルを持ちます。tf.placeholder op は供給されなければならないテンソルを定義することを可能にし、そしてオプション的にそれらの shape を制約することも可能にします。ニューラルネットワークに訓練データを提供するためにどのように placeholder と供給が使用できるかについてのサンプルとしては 初心者の MNIST チュートリアル を見てください。
Session.run() と Tensor.eval() の間の違いは何でしょう?
t が tf.Tensor オブジェクトであるならば、tf.Tensor.eval は tf.Session.run に対する簡略記法です。次の2つのコードのスニペットは同値です (ここで sess は現在の tf.get_default_session です) :
# Using `Session.run()`. sess = tf.Session() c = tf.constant(5.0) print(sess.run(c)) # Using `Tensor.eval()`. c = tf.constant(5.0) with tf.Session(): print(c.eval())
2つめのサンプルでは、session は コンテキスト・マネージャ として振る舞います、これは with ブロックのライフタイムのためにそれをデフォルト・セッションとしてインストールする効果を持ちます。コンテキスト・マネージャのアプローチは (ユニットテストのような) 単純なユースケースのためのより簡潔なコードへと導かれます ; もし貴方のコードが複数のグラフとセッションを扱うのであれば、Session.run() への明示的な呼び出しを行なうことはより率直かもしれません。
Session はライフタイムを持ちますか?中間テンソル (= intermediate tensors) についてはどうでしょう?
Session は tf.Variable, tf.QueueBase, そして tf.ReaderBase のような、リソースを所有できます ; そしてこれらのリソースはメモリのかなりの量を使用できます。これらのリソース (そして関連するメモリ) は tf.Session.close を呼び出すことによって、session が閉じられたとき解放されます。
Session.run() への呼び出しの一部として作成される中間テンソルは呼び出しの最後かその前に解放されます。
ランタイムはグラフ実行の各部を並列化しますか?
TensorFlow ランタイムはグラフ実行を多くの異なる次元に渡り並列化します :
- 個々の ops は CPU の複数のコアを使用するか、GPU の複数スレッドを使用して並列実装を持ちます。
- TensorFlow グラフの独立的なノードは複数デバイス上で並列的に実行できます、これは 複数 GPU を使用した CIFAR-10 訓練 をスピードアップすることを可能にします。
- Session API は複数の同時に発生するステップを許します (i.e. tf.Session.run への並列的な呼び出し)。これはランタイムにより高いスループットを得ることを可能にします、もし貴方のコンピュータで単一のステップが総てのリソースを使用しないのであれば。
TensorFlow でどのクライアント言語がサポートされますか?
TensorFlow は複数のクライアント言語をサポートするように設計されています。現在、最高にサポートされているクライアント言語は Python です。グラフを実行して構築するための実験的なインターフェイスが C++ (訳注: リンク切れ), Java と Go のためにまた利用可能です。
TensorFlow はまたより多くのクライアント言語のサポートの構築を助けるために C-ベースのクライアント API も持ちます。新しい言語バインディングの寄与も求めています。
オープンソース・コミュニティで作成されてサポートされる様々な他の言語 (C#, Julia, Ruby そして Scala) のためのバインディングは TensorFlow 保守者によりサポートされる C API の上に構築されます。
TensorFlow は私のマシン上の利用可能なデバイス (GPU と CPU) 総てを使用しますか?
TensorFlow は複数の GPU と CPU をサポートします。演算をデバイスにどのように割り当てるかの詳細についての TensorFlow でGPU を利用する と、複数の GPU を使用するサンプルモデルのための CIFAR-10 チュートリアル の how-to 文書を見てください。
TensorFlow は計算能力 (= compute capability) が 3.5 より大きい GPU デバイスのみを使用することに注意してください。
リーダーまたはキューを使用するとき何故 Session.run() はハングするのでしょう?
tf.ReaderBase と tf.QueueBase クラスは入力 (または有界 (= bounded) キューのフリー空間) が利用可能になるまでブロックするという特別な操作を提供します。これらの操作はTensorFlow 計算を幾分より複雑にするという代償により、洗練された 入力パイプライン を構築することを可能にします。それらをどのように使うかについての更なる情報については using QueueRunner objects to drive queues and readers の how-to 文書を見てください。
変数
変数 (variables) の how-to 文書と 変数についての API 文書 もまた見てください。
変数のライフタイムは何ですか?
変数は、session でその変数のために最初に tf.Variable.initializer 演算を実行するときに作成されます。その tf.Session.close でそれは壊されます。
変数はそれらが同時にアクセスされたときどのように振る舞いますか?
変数は同時の読み書き演算を許します。変数から読まれる値は同時に更新された場合には変わるかもしれません。デフォルトでは、変数への同時の割り当て演算は相互排除 (= mutual exclusion) なしの実行が許可されています。変数を割り当てるときにロックを獲得するためには、use_locking=True を tf.Variable.assign に渡します。
テンソル shape
tf.TensorShape も見てください。
Python でテンソルの shape をどのように決定できますか?
TensorFlow では、テンソルは静的 (推論された) shape と動的 (真の) shape の両者を持ちます。静的 shape は tf.Tensor.get_shape メソッドを使用して読むことができます : この shape はテンソルを作成するために使用された演算から推論され、部分的に完全 (= partially complete) かもしれません。もし静的 shape が完全には定義されていない場合は、テンソル t の動的 shape は tf.shape(t) を評価することで決定されます。
x.set_shape() と x = tf.reshape(x)? の間の違いは何ですか?
tf.Tensor.set_shape メソッドはテンソル・オブジェクトの静的 shape を更新し、そして典型的には追加の shape 情報をこれが直接的に推論できないときに提供するために使用されます。それはテンソルの動的 shape は変更しません。
tf.reshape 演算は異なる動的 shape で新しいテンソルを作成します。
可変なバッチサイズで動作するグラフをどのように構築しますか?
可変なバッチサイズで動作するグラフを構築することはしばしば有用です、例えば同じコードが (ミニ)バッチ訓練、そして単一インスタンスの推論のために利用できます。結果のグラフは プロトコル・バッファとして保存 できて 他のプログラムにインポート 可能です。
可変サイズのグラフを構築するとき、覚えておくべき最も重要なことはバッチサイズを Python constant としてエンコードするのではなく、代わりにそれを表わすシンボリック・テンソルを使用することです。次のティップスは有用かもしれません :
- input と呼ばれるテンソルからバッチ次元を抽出して、batch_size と呼ばれるテンソルにそれをストアするために batch_size = tf.shape(input)[0] を使用します。
- tf.reduce_sum(…) / batch_size の代わりに tf.reduce_mean を使用します。
TensorBoard
TensorFlow グラフをどのように可視化できますか?
グラフ可視化チュートリアル を見てください。
TensorBoard にデータを送る最も単純な方法は何でしょう?
TensorFlow グラフに要約 (= summary) ops を追加して、これらの要約をログ・ディレクトリに書きます。それから、以下を使用して TensorBoard を開始します :
python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
更なる詳細のためには、要約と TensorBoard チュートリアル を見てください。
TensorBoard を launch するたびに、ネットワーク・セキュリティ・ポップアップが出ます!
TensorBoard を ‘0.0.0.0’ ではなく localhost 上でサービス提供するようにフラグ –host=localhost で変更できます。これは任意のセキュリティ警告を静かにするはずです。
TensorFlow を拡張する
TensorFlow に新しい演算を追加する ための how-to 文書を見てください。
私のデータはカスタム形式です。TensorFlow を使用してそれをどのように読みますか?
カスタム形式のデータを扱うためには3つの主要なオプションがあります。
最も簡単なオプションはデータを numpy 配列に変換する構文解析コードを Python で書くことです。それから tf.contrib.data.Dataset.from_tensor_slices を使用してインメモリ・データから入力パイプラインを作成します。
貴方のデータがメモリにフィットしない場合は、データセット・パイプラインで解析してみましょう。tf.contrib.data.TextLineDataset のような、適切なファイル・リーダーで始めます。それからそれに渡る適切な演算を マッピング することによりデータセットを変換します。
tf.decode_raw, tf.decode_csv, tf.parse_example, または tf.image.decode_png のような事前定義された TensorFlow 演算を選択しましょう。
もし貴方のデータが組み込みの TensorFlow 演算で簡単に構文解析できないのであれば、${tf.python_io.TFRecordWriter$TFRecord} 形式のような簡単に解析できる形式にそれをオフラインで変換することを考慮してください。
解析の振る舞いをカスタマイズするより効率的な方法は貴方のデータ形式を構文解析する C++ で書かれた新しい op を追加する ことです。新しいデータ形式を処理するためのガイド はこれを行なうためのステップについての更なる情報を持ちます。
雑多
TensorFlow のコーディングスタイル規約は何でしょう?
TensorFlow Python API は PEP8 規約に忠実です (*)。特に、クラスのためには キャメルケース名を使用して、関数、メソッド、そしてプロパティのためにはスネークケース名を使用します。Google Python style guide にもまた忠実です。
TensorFlow C++ コード・ベースは Google C++ style guide に忠実です。
(* 一つ例外があります : 4-スペース・インデントの代わりに 2-スペース・インデントを使用しています。)
以上