TensorFlowとは何か?その仕組み、 Archi構造と特長
⚡ スマートサマリー
TensorFlowはオープンソースのプラットフォームです Google 機械学習向けに構築されており、すべての計算をテンソルのデータフローグラフとして表現します。この概要では、アーキテクチャ、コンポーネント、計算の実行方法、および入力パイプラインを通してデータを供給する方法について説明します。

TensorFlowとは何ですか?
TensorFlow は、機械学習アプリケーションを作成するためのオープンソースのエンドツーエンド プラットフォームです。データフローと微分可能プログラミングを使用して、ディープ ニューラル ネットワークのトレーニングと推論に重点を置いたさまざまなタスクを実行するシンボリック数学ライブラリです。これにより、開発者はさまざまなツール、ライブラリ、コミュニティ リソースを使用して機械学習アプリケーションを作成できます。
現在、世界で最も有名なディープラーニングライブラリは GoogleTensorFlow の。 Google 同社は、検索、翻訳、画像キャプション、レコメンデーションの精度向上を目的として、製品全体に機械学習を適用している。
TensorFlow の例
具体的な例を挙げると、 Google AI により、ユーザーはより高速で洗練された検索体験を得ることができます。ユーザーが検索バーにキーワードを入力すると、 Google 次に使うべき単語についての提案を提供します。

Google 膨大なデータセットを活用してユーザーに最高の体験を提供するために、機械学習を利用したいと考えている。機械学習を利用するグループは3つある。
- 研究者
- データサイエンティスト
- プログラマ
全員が同じツールセットを使用して相互に連携し、効率を向上させることができます。
Google 大規模なデータセットを保持するだけでなく、膨大な計算インフラストラクチャも実行するため、TensorFlow は最初からスケーラブルになるように構築されています。TensorFlow は、 Google Brain Teamは、機械学習と深層ニューラルネットワークの研究を加速させる。
複数のCPUやGPU、さらにはモバイルオペレーティングシステム上で動作するように構築されており、次のような複数の言語で複数のラッパーが用意されています。 Python, C++ or Java.
TensorFlow の歴史
数年前から、ディープラーニングは膨大な量のデータを与えた場合、他のすべての機械学習アルゴリズムを凌駕する性能を発揮し始めた。 Google 同社は、これらの深層ニューラルネットワークを利用してサービスを改善できると考えた。
- Gmail
- 写真
- Google 検索エンジン
彼らはフレームワークを構築しました TensorFlow そうすることで、研究者と開発者が同じモデルに基づいて作業を進め、その後、多くの人が利用できる規模で展開できるようになる。
TensorFlowは2015年11月に一般公開され、バージョン1.0は2017年2月にリリースされました。はるかに大きな変化は、 TensorFlow 2.0(2019年9月リリース)これにより、Eager Executionがデフォルトとなり、Kerasが標準の高レベルAPIとして採用されました。バージョン2.16以降はKeras 3がデフォルトとなり、同じモデルコードはJAXまたはPyでも実行できます。Torchバックエンド。
TensorFlowはApache 2.0ライセンスの下でリリースされているため、商用利用を含め、料金を支払うことなく使用、変更、再配布することができます。 Google.
TensorFlow の仕組み
TensorFlow を使用すると、データフロー グラフと構造を構築して、Tensor と呼ばれる多次元配列として入力を受け取り、グラフ内でデータがどのように移動するかを定義することができます。これにより、これらの入力に対して実行できる操作のフローチャートを構築できます。このフローチャートは、一方の端から入力され、もう一方の端から出力されます。
TensorFlow Archi構造
TensorFlowのアーキテクチャは、以下の3つの部分で構成されています。
- データの前処理
- モデルを構築する
- モデルをトレーニングして推定する
TensorFlowと呼ばれるのは、入力を多次元配列として受け取るためです。 テンソル。 ある種のものを構築できます フローチャート 入力に対して実行する操作の集合 (グラフと呼ばれます) を作成します。入力は一方の端から入力され、複数の操作から成るこのシステムを通過して、もう一方の端から出力として出てきます。
TensorFlowはどこで実行できますか?
TensorFlowのハードウェアおよびソフトウェア要件は、2つのフェーズに分けられます。
開発フェーズこれは、通常デスクトップまたはノートパソコン上でモデルをトレーニングする段階です。
実行フェーズまたは推論フェーズトレーニングが完了すると、モデルは多くのプラットフォームで実行できます。
- デスクトップの実行 Windows, macOS またはLinux
- Webサービスとしてのクラウド
- iOS などのモバイル デバイス Android
複数のマシンでトレーニングし、トレーニングされたモデルを取得したら、別のマシンで実行できます。
このモデルはGPUとCPUの両方でトレーニングおよび使用できます。GPUは当初ビデオゲーム用に設計されました。2009年頃、スタンフォード大学の研究者たちは、GPUがニューラルネットワークが依存する行列演算と線形代数演算において非常に効率的であることを示しました。ディープラーニングは多くの行列乗算に依存しています。TensorFlowは、行列乗算の計算が非常に高速です。 C++実装されていますが C++TensorFlowは主に他の言語からアクセスして制御できます。 Python.
もう一つ重要な特徴は テンソルボードこれは、モデルの実行中にグラフ、トレーニング指標、および重みの分布を視覚化します。
TensorFlow コンポーネント
テンソル
TensorFlowという名前は、そのコアフレームワークから直接派生したものです。 テンソルTensorFlowでは、すべての計算にテンソルが関係します。テンソルとは、 ベクトル or マトリックス あらゆる種類のデータを表す n 次元。 テンソル内のすべての値は、既知 (または部分的に既知) と同一のデータ型を保持します。 形状。 データの形状は、行列または配列の次元です。
テンソルは入力データまたは計算結果から生成されます。TensorFlowでは、すべての操作はテンソルの内部で実行されます。 グラフグラフは連続的に行われる計算の集合である。各操作は opノード そして相互につながっています。
グラフには、オペレーションとノード間の接続の概要が表示されます。ただし、値は表示されません。ノードのエッジはテンソル、つまりオペレーションにデータを入力する方法です。
グラフ
TensorFlow はグラフ フレームワークを利用します。 グラフは、トレーニング中に実行されたすべての一連の計算を収集して説明します。 グラフには多くの利点があります。
- 複数のCPUやGPU、さらにはモバイルオペレーティングシステム上でも動作します。
- グラフの移植性により、計算結果をすぐにまたは後で使用するために保存できます。グラフは将来実行するために保存できます。
- グラフ内のすべての計算は、テンソルを接続することによって行われます。
- グラフはノードとエッジで構成されます。各ノードは数学演算を行い、出力を生成します。一方、エッジはノード間の入力と出力の関係を表します。テンソル自体はエッジに沿って移動します。
TensorFlow が人気がある理由
TensorFlowは、あらゆるレベルの専門知識を持つユーザーが利用できるため、広く採用されています。そのAPIは、わずか3行のKerasモデルから、手作業で構築したCNNやRNNまで、あらゆるものを網羅しています。計算はグラフとして表現されるため、TensorBoardはネットワークを視覚化し、デバッグをはるかに容易にします。また、CPU、GPU、TPU上で動作し、TensorFlow Liteを介してモバイル環境でも動作するため、大規模な展開にも対応しています。
TensorFlowは、Pyと並んでGitHub上で最もよく使われているディープラーニングフレームワークの2つのうちの1つです。TorCH。
TensorFlow Algorithms
TensorFlowには、いくつかの古典的なアルゴリズム用の高レベル推定器が付属しています。TensorFlow 1.xでは、これらはtf.estimatorの下にありました。
- 線形回帰: tf.estimator.LinearRegressor
- 分類: tf.estimator.LinearClassifier
- 深層学習分類: tf.estimator.DNNClassifier
- 広範囲かつ深層的な学習: tf.estimator.DNNLinearCombinedClassifier
- ブーストツリー回帰: tf.estimator.BoostedTreesRegressor
- ブーストされたツリー分類: tf.estimator.BoostedTreesClassifier
TensorFlow vs PyTorch: どちらを選ぶべきでしょうか?
TensorFlowとPyTorch は 2 つの主要な深層学習フレームワークであり、TensorFlow 2.0 が Eager Execution を採用して以来、実用上の違いはかなり縮小しました。
| 基準 | TensorFlow | PyTorch |
|---|---|---|
| によって開発された | Google 脳 | メタAI |
| 実行 | グラフコンパイルオプション付きで、積極的に取り組みます。 | 熱心に、オプションのコンパイル付き |
| 高レベルの API | Kerasは、 | Lightningなどの独立したライブラリ |
| モバイルとエッジ | TensorFlow Lite を通じて成熟した | Execu を通じて改善するTorch |
| ブラウザ展開 | TensorFlow.js | ONNXへの変換が必要です |
| 典型的な要塞 | 生産と展開 | 研究と実験 |
実用的な答えは、モデルをモバイル、ブラウザ、またはマネージドサービングスタックに配信する必要がある場合は TensorFlow を選択し、それ以外の場合は Py を選択することです。Torモデルアーキテクチャを反復しているときに、ch を使用します。TensorFlow 2.16 以降のデフォルトである Keras 3 では、同じ Keras コードを TensorFlow、JAX、または Py で実行できるため、決定がさらに容易になります。Torchバックエンド。
TensorFlowにおける計算の仕組み
⚠️ バージョンに関する注記: 以下のウォークスルーでは、 TensorFlow 1.x グラフとセッションを組み合わせたスタイルは、データフローグラフが実際にどのように機能するかを最も分かりやすく示す方法です。 TensorFlow 2.0 では、tf.placeholder()、tf.Session()、make_initializable_iterator() が削除されました。 そして、現在のインストールではAttributeErrorが発生します。 TensorFlow 1.x と TensorFlow 2.x の比較 さらに下の方では、それぞれの例の現代版を示しています。
import numpy as np import tensorflow as tf
コードの最初の XNUMX 行では、tensorflow を tf としてインポートしました。 と Python、ライブラリに短い名前を使用するのが一般的です。 利点は、ライブラリを使用する必要があるときに、ライブラリの完全な名前を入力する必要がないことです。 たとえば、tensorflow を tf としてインポートし、tensorflow 関数を使用したいときに tf を呼び出すことができます。
TensorFlowの基本的なワークフローを、簡単なTensorFlowの例を使って練習してみましょう。2つの数値を掛け合わせる計算グラフを作成してみましょう。
この例では、X_1 と X_2 を乗算します。TensorFlow は、この演算を接続するためのノードを作成します。この例では、そのノードは multiply と呼ばれます。グラフが決定されると、TensorFlow の計算エンジンが X_1 と X_2 を乗算します。
最後に、X_1 と X_2 の値を使用して計算グラフを実行し、乗算の結果を出力する TensorFlow セッションを実行します。
X_1とX_2の入力ノードを定義しましょう。TensorFlowでノードを作成する際には、どのような種類のノードを作成するかを選択する必要があります。X1とX2ノードはプレースホルダーノードになります。プレースホルダーは、計算を行うたびに新しい値を割り当てます。これらをTFドットプレースホルダーノードとして作成します。
ステップ 1: 変数を定義する
X_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2")
プレースホルダーにはデータ型が必要です。これらは数値なので、tf.float32 が適切な選択です。name 引数は省略可能ですが、グラフの TensorBoard 可視化に表示されるラベルとなるため、便利です。X_2 も同様に定義されます。
ステップ 2: 計算を定義する
multiply = tf.multiply(X_1, X_2, name = "multiply")
これで、乗算演算を行うノードを定義できます。TensorFlowでは、tf.multiplyノードを作成することでこれを実現できます。
X_1 ノードと X_2 ノードを乗算ノードに渡します。 これは、計算グラフ内のこれらのノードをリンクするように tensorflow に指示するため、x と y から値を取得して結果を乗算するように指示します。 また、乗算ノードに multiply という名前を付けましょう。 これは、単純な計算グラフの定義全体です。
ステップ3: 操作を実行する
グラフで操作を実行するには、セッションを作成する必要があります。TensorFlow では、tf.Session() を使用してこれを行います。セッションが作成されたら、session を呼び出すことで、計算グラフ上で操作を実行するようにセッションに要求できます。計算を実行するには、run を使用する必要があります。
乗算演算を実行する際には、X_1ノードとX_2ノードの値が必要となるため、実行時にこれらの値を渡す必要があります。そのためには、feed_dictというパラメータを指定します。X_1には1,2,3、X_2には4,5,6の値を渡します。
print(result) で結果を出力します。 4×10、18×1、4×2には5、3、6が表示されるはずです。
X_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2") multiply = tf.multiply(X_1, X_2, name = "multiply") with tf.Session() as session: result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]}) print(result)
[ 4. 10. 18.]
データを TensorFlow にロードするためのオプション
トレーニング前の最初のステップ 機械学習アルゴリズム データの読み込みは、データのロードが主な方法です。データのロードには、主に2つの方法があります。
1. データをメモリにロードするこれは最もシンプルな方法です。すべてのデータを単一の配列としてメモリにロードします。 Python これは、TensorFlow固有のものではありません。
2. TensorFlowデータパイプラインTensorFlowは、データの読み込み、変換の適用、モデルへのデータ供給を行う組み込みAPIを提供します。この方法は、特に大規模なデータセットを扱う場合に非常に効果的です。例えば、画像データは膨大な量になることが知られており、メモリに収まりきりません。データパイプラインはメモリを自動的に管理します。
どのような解決策を使用すればよいでしょうか?
データをメモリにロードする
データセットが大きすぎない場合、つまり 10 ギガバイト未満の場合は、最初の方法を使用できます。 データはメモリに収まります。 Pandas という有名なライブラリを使用して CSV ファイルをインポートできます。 次のチュートリアルでパンダについて詳しく学びます。
TensorFlowパイプラインを使用してデータをロードします。
50 番目の方法は、大規模なデータセットがある場合に最適です。 たとえば、16 ギガバイトのデータセットがあり、コンピュータのメモリが XNUMX ギガバイトしかない場合、マシンはクラッシュします。
このような状況では、TensorFlowパイプラインを構築する必要があります。パイプラインはデータをバッチ(小さなチャンク)単位で読み込みます。各バッチはパイプラインにプッシュされ、トレーニングの準備が整います。パイプラインの構築は、並列コンピューティングを利用できるため、優れた解決策です。つまり、TensorFlowは複数のCPUにわたってモデルをトレーニングします。これにより計算速度が向上し、より大規模なネットワークのトレーニングが可能になります。
要するに、小さなデータセットはpandasを使ってメモリに読み込み、データが大きい場合や複数のCPUにまたがって並列処理を行いたい場合は、TensorFlowパイプラインを使用してください。
TensorFlow パイプラインを作成する方法
TensorFlow パイプラインを作成する手順は次のとおりです。
前の例では、X_1とX_2に3つの値を手動で追加しました。次に、TensorFlowにデータをロードする方法を見ていきましょう。
ステップ1) データを作成する
まず、numpy ライブラリを使用して XNUMX つのランダムな値を生成しましょう。
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
[[0.8835775 0.23766977]]
ステップ 2) プレースホルダーを作成する
前の例と同様に、X という名前のプレースホルダーを作成します。テンソルの形状を明示的に指定する必要があります。 場合に備えて、値が 1,2 つだけある配列をロードします。 形状はshape=[XNUMX]として書くことができます。
# using a placeholder x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')
ステップ 3) データセットメソッドを定義する
次に、プレースホルダー x の値を入力できるデータセットを定義する必要があります。 tf.data.Dataset.from_tensor_slices メソッドを使用する必要があります。
dataset = tf.data.Dataset.from_tensor_slices(x)
ステップ 4) パイプラインを作成する
ステップ XNUMX では、データが流れるパイプラインを初期化する必要があります。 make_initializable_iterator を使用してイテレータを作成する必要があります。 これをイテレータと名付けます。 次に、このイテレータを呼び出して、データの次のバッチ get_next にフィードする必要があります。 このステップに get_next という名前を付けます。 この例では、XNUMX つの値のみを持つデータのバッチが XNUMX つだけあることに注意してください。
iterator = dataset.make_initializable_iterator() get_next = iterator.get_next()
ステップ5) 操作を実行する
最後のステップは前の例と似ています。セッションを開始し、操作イテレータを実行します。feed_dictに生成された値を入力します。 numpy。 これら XNUMX つの値は、プレースホルダー x に設定されます。 次に、get_next を実行して結果を出力します。
with tf.Session() as sess:
# feed the placeholder with data
sess.run(iterator.initializer, feed_dict={ x: x_input })
print(sess.run(get_next))
[0.8835775 0.23766978]
TensorFlow 1.xとTensorFlow 2.x:何が変わったのか
TensorFlow 2.0 は、ユーザー向け API の互換性を損なう大幅な書き換えでした。上記の例を含め、オンライン上のチュートリアルコードの多くは 1.x スタイルを対象としているため、この違いを理解することが重要です。
| 概念 | TensorFlow 1.x | TensorFlow 2.x |
|---|---|---|
| 実行モデル | グラフを定義してから実行します。 | デフォルトでは、操作は即座に実行されます。 |
| 給餌データ | tf.placeholder と feed_dict を併用 | 合格 Python 値またはテンソルを直接 |
| 実行中の操作 | tf.Session().run() | セッションは不要で関数を呼び出します。 |
| 高レベルの API | tf.estimator | Keras、tf.keras |
| グラフ最適化 | 常にグラフベース | @tf.function デコレータを使用してオプトインします。 |
| データセットを反復処理する | make_initializable_iterator() | シンプルスタイル Python データセットに対するforループ |
掛け算の例を書き直したもの。 3つのステップと1つのセッションが1行にまとめられます。なぜなら、この操作は呼び出された瞬間に実行されるからです。
import tensorflow as tf X_1 = tf.constant([1, 2, 3], dtype=tf.float32) X_2 = tf.constant([4, 5, 6], dtype=tf.float32) result = tf.multiply(X_1, X_2, name="multiply") print(result.numpy()) # [ 4. 10. 18.]
入力パイプラインを書き直しました。 プレースホルダーやイテレータオブジェクトは不要です。
import numpy as np import tensorflow as tf x_input = np.random.sample((1, 2)) dataset = tf.data.Dataset.from_tensor_slices(x_input) for batch in dataset: print(batch.numpy())
コンパイル済みグラフの速度が必要な場合は、関数を @tf.function と TensorFlow でラップしてください。 trac自動的に1つにまとめられます。レガシー1.xスクリプトは、tf.compat.v1名前空間を通して変更せずに実行することもできますが、このパスはメンテナンス専用であり、新規作業には使用しないでください。
TensorFlow: 重要なポイントと Code 参 考
- TensorFlow の意味: TensorFlow は近年最も有名な深層学習ライブラリです。 TensorFlow を使用する実践者は、CNN、RNN、または単純な人工ニューラル ネットワークなど、あらゆる深層学習構造を構築できます。
- TensorFlowは主に、研究機関、スタートアップ企業、大企業で利用されています。 Google TensorFlowをほぼすべての分野で使用 Google 日用品を含む Gmail写真と Google 検索エンジン。
- その Google Brainチームは、研究者と製品開発者の間のギャップを埋めるためにTensorFlowを開発しました。2015年にTensorFlowを公開すると、急速に人気が高まりました。現在、TensorFlowはGitHub上で最も多くのリポジトリを持つディープラーニングライブラリとなっています。
- 実務家が TensorFlow を使用する理由は、クラウド、ブラウザ、または iOS と Linux を実行するモバイル デバイスに簡単に大規模に展開できるためです。 Android.
TensorFlowはセッション単位で動作します。各セッションは、異なる計算を含むグラフによって定義されます。簡単な例として、数値を乗算する場合を考えてみましょう。TensorFlowでは、次の3つのステップが必要です。
- 変数を定義する
X_1 = tf.placeholder(tf.float32, name = "X_1") X_2 = tf.placeholder(tf.float32, name = "X_2")
- 計算を定義する
multiply = tf.multiply(X_1, X_2, name = "multiply")
- 操作を実行する
with tf.Session() as session:
result = session.run(multiply, feed_dict={X_1: [1, 2, 3], X_2: [4, 5, 6]})
print(result)
TensorFlowでは、データを読み込むためのパイプラインを作成するのが一般的な方法です。以下の5つの手順に従えば、TensorFlowにデータを読み込むことができます。
- データを作成する
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
- プレースホルダーを作成する
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')
- データセットメソッドを定義する
dataset = tf.data.Dataset.from_tensor_slices(x)
- パイプラインを作成する
iterator = dataset.make_initializable_iterator() get_next = iterator.get_next()
- プログラムを実行する
with tf.Session() as sess:
sess.run(iterator.initializer, feed_dict={x: x_input})
print(sess.run(get_next))
