TensorFlow とは何ですか? 使い方? 概要とアーキテクチャ

TensorFlow の概要からこのチュートリアルを始めましょう。

TensorFlowとは何ですか?

TensorFlow は、機械学習アプリケーションを作成するためのオープンソースのエンドツーエンド プラットフォームです。 これは、データフローと微分可能プログラミングを使用して、ディープ ニューラル ネットワークのトレーニングと推論に焦点を当てたさまざまなタスクを実行するシンボリック数学ライブラリです。 これにより、開発者はさまざまなツール、ライブラリ、コミュニティ リソースを使用して機械学習アプリケーションを作成できます。

現在、世界で最も有名な深層学習ライブラリは Google の TensorFlow です。 Google 製品では、すべての製品で機械学習を使用して、検索エンジン、翻訳、画像のキャプション、レコメンデーションを改善しています。

TensorFlow の例

具体的な例を挙げると、Google ユーザーは AI によってより高速で洗練された検索エクスペリエンスを体験できます。 ユーザーが検索バーにキーワードを入力すると、Google は次の単語となる可能性のある単語を推奨します。

TensorFlow の例
TensorFlow の例

Google は、機械学習を使用して膨大なデータセットを活用し、ユーザーに最高のエクスペリエンスを提供したいと考えています。 XNUMX つの異なるグループが機械学習を使用します。

  • 研究者
  • データサイエンティスト
  • プログラマ

全員が同じツールセットを使用して相互に連携し、効率を向上させることができます。

Google が保有しているのはデータだけではありません。 彼らは世界で最も大規模なコンピューターを持っているため、Tensor Flow は規模に合わせて構築されました。 TensorFlow は、機械学習とディープ ニューラル ネットワークの研究を加速するために Google Brain チームによって開発されたライブラリです。

複数の CPU や GPU、さらにはモバイル オペレーティング システムでも実行できるように構築されており、Python などの複数の言語のラッパーがいくつかあります。 C + + or Java.

TensorFlow の歴史

数年前、ディープラーニングは、大量のデータを与えた場合に他のすべての機械学習アルゴリズムを上回るパフォーマンスを発揮し始めました。 Google は、これらのディープ ニューラル ネットワークを使用してサービスを改善できると考えました。

  • Gmail
  • 写真
  • Google検索エンジン

彼らは、と呼ばれるフレームワークを構築します。 テンソルフロー 研究者と開発者が AI モデルで共同作業できるようにします。 開発して拡張すると、多くの人が使用できるようになります。

これは 2015 年後半に初めて公開され、最初の安定バージョンは 2017 年に登場しました。Apache オープンソース ライセンスに基づくオープンソースです。 Google に何も支払うことなく、使用したり、変更したり、変更したバージョンを有償で再配布したりすることができます。

次に、この TensorFlow ディープ ラーニング チュートリアルでは、TensorFlow アーキテクチャと TensorFlow がどのように動作するかについて学びます。

TensorFlow の仕組み

TensorFlow を使用すると、入力を Tensor と呼ばれる多次元配列として受け取ることによって、データフロー グラフと構造を構築し、データがグラフ内を移動する方法を定義できます。 これにより、これらの入力に対して実行できる操作のフローチャートを構築できます。操作は一方の端で実行され、もう一方の端で出力として送信されます。

TensorFlow アーキテクチャ

Tensorflow アーキテクチャは XNUMX つの部分で動作します。

  • データの前処理
  • モデルを構築する
  • モデルをトレーニングして推定する

入力を多次元配列 (別名: としても知られる) として受け取るため、Tensorflow と呼ばれます。 テンソル。 ある種のものを構築できます フローチャート その入力に対して実行する一連の操作 (グラフと呼ばれます)。 入力は一方の端から入り、次にこの複数の操作のシステムを通って、もう一方の端から出力として出てきます。

これが TensorFlow と呼ばれる理由です。これは、テンソルが操作のリストを通過し、反対側から出てくるためです。

Tensorflow はどこで実行できますか?

TensorFlow ハードウェア、および ソフトウェア要件 に分類することができます

開発フェーズ: モードをトレーニングする段階です。 トレーニングは通常、デスクトップまたはラップトップで行われます。

実行フェーズまたは推論フェーズ: トレーニングが完了すると、Tensorflow はさまざまなプラットフォームで実行できます。 で実行できます

  • Windows、macOS、または Linux を実行しているデスクトップ
  • Webサービスとしてのクラウド
  • iOSやAndroidなどのモバイルデバイス

複数のマシンでトレーニングし、トレーニングされたモデルを取得したら、別のマシンで実行できます。

モデルは CPU だけでなく GPU でもトレーニングして使用できます。 GPU は当初、ビデオ ゲーム用に設計されました。 2010 年後半、スタンフォード大学の研究者は、GPU が行列演算と代数にも優れているため、この種の計算を非常に高速に実行できることを発見しました。 ディープラーニングは多くの行列乗算に依存しています。 TensorFlow は C++ で記述されているため、行列の乗算の計算が非常に高速です。 TensorFlow は C++ で実装されていますが、主に Python などの他の言語でアクセスして制御することができます。

最後に、TensorFlow の重要な機能は TensorBoard です。 の テンソルボード TensorFlow が何を行っているかをグラフィカルかつ視覚的に監視できるようになります。

TensorFlow コンポーネント

テンソル

Tensorflow の名前は、そのコア フレームワークに直接由来しています。 テンソル。 Tensorflow では、すべての計算にテンソルが含まれます。 テンソルとは、 ベクトル or マトリックス あらゆる種類のデータを表す n 次元。 テンソル内のすべての値は、既知 (または部分的に既知) と同一のデータ型を保持します。 形状。 データの形状は、行列または配列の次元です。

テンソルは、入力データまたは計算の結果から生成できます。 TensorFlow では、すべての操作が内部で実行されます。 グラフ。 グラフは、連続して行われる一連の計算です。 それぞれの操作は opノード そして相互につながっています。

グラフは、ノード間の操作と接続の概要を示します。 ただし、値は表示されません。 ノードのエッジはテンソル、つまり操作にデータを入力する方法です。

グラフ

TensorFlow はグラフ フレームワークを利用します。 グラフは、トレーニング中に実行されたすべての一連の計算を収集して説明します。 グラフには多くの利点があります。

  • 複数の CPU または GPU、さらにはモバイル オペレーティング システム上で実行するために行われました。
  • グラフの移植性により、すぐに使用するため、または後で使用するために計算を保存することができます。 グラフは保存して後で実行できます。
  • グラフ内のすべての計算は、テンソルを接続することによって行われます。
    • テンソルにはノードとエッジがあります。 ノードは数学演算を実行し、エンドポイント出力を生成します。 エッジはノード間の入出力関係を説明します。

TensorFlow が人気がある理由

TensorFlow は、誰でもアクセスできるように構築されているため、すべてのライブラリの中で最高です。 Tensorflow ライブラリには、CNN や RNN などの大規模な深層学習アーキテクチャを構築するためのさまざまな API が組み込まれています。 TensorFlow はグラフ計算に基づいています。 これにより、開発者は Tensorboad を使用してニューラル ネットワークの構築を視覚化できます。 このツールはプログラムのデバッグに役立ちます。 最後に、Tensorflow は大規模にデプロイできるように構築されています。 CPUとGPUで動作します。

Tensorflow は、他の深層学習フレームワークと比較して、GitHub で最大の人気を集めています。

TensorFlow アルゴリズム

TensorFlow でサポートされているアルゴリズムは次のとおりです。

現在、TensorFlow 1.10 には次の API が組み込まれています。

  • 線形回帰: tf.estimator.LinearRegressor
  • 分類:tf.estimator.LinearClassifier
  • 深層学習分類: tf.estimator.DNNClassifier
  • ディープ ラーニング ワイプとディープ: tf.estimator.DNNLinearCombinedClassifier
  • ブースター ツリー回帰: tf.estimator.BoostedTreesRegressor
  • ブーストされたツリー分類: tf.estimator.BoostedTreesClassifier

TensorFlow での計算の仕組み

import numpy as np
import tensorflow as tf

コードの最初の XNUMX 行では、tensorflow を tf としてインポートしました。 と Python 、ライブラリに短い名前を使用するのが一般的です。 利点は、ライブラリを使用する必要があるときに、ライブラリの完全な名前を入力する必要がないことです。 たとえば、tensorflow を tf としてインポートし、tensorflow 関数を使用したいときに tf を呼び出すことができます。

簡単な TensorFlow の例を使用して、Tensorflow の基本的なワークフローを練習してみましょう。 XNUMX つの数値を乗算する計算グラフを作成してみましょう。

この例では、X_1 と X_2 を掛け合わせます。 Tensorflow はオペレーションを接続するノードを作成します。 この例では、それは乗算と呼ばれます。 グラフが決定されると、Tensorflow 計算エンジンは X_1 と X_2 を掛け合わせます。

TensorFlow での計算の動作
TensorFlow の例

最後に、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 を使用しましょう。 このノードに名前を付ける必要もあります。 この名前は、モデルのグラフィカルな視覚化を見るときに表示されます。 X_1 の値を持つ name というパラメーターを渡すことによって、このノードに X_1 という名前を付けて、同じ方法で X_2 を定義しましょう。 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 ノードの値を取得する必要があることがわかります。そのため、X_1 と X_2 の値をフィードする必要もあります。 これを行うには、feed_dict というパラメータを指定します。 X_1,2,3 には値 1 を、X_4,5,6 には値 2 を渡します。

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 にロードするためのオプション

トレーニング前の最初のステップ 機械学習アルゴリズム データをロードすることです。 データをロードするには XNUMX つの一般的な方法があります。

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 に XNUMX つの値を手動で追加しました。 次に、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 に、によって生成された値を入力します。 貧弱。 これら 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)) # output [ 0.52374458  0.71968478]
[0.8835775  0.23766978]

まとめ

  • TensorFlow の意味: TensorFlow は近年最も有名な深層学習ライブラリです。 TensorFlow を使用する実践者は、CNN、RNN、または単純な人工ニューラル ネットワークなど、あらゆる深層学習構造を構築できます。
  • TensorFlow は主に学者、新興企業、大企業によって使用されています。 Google は、G を含むほぼすべての Google 日用品で TensorFlow を使用しています。mail、写真、Google 検索エンジン。
  • Google Brain チームは、研究者と製品開発者の間のギャップを埋めるために TensorFlow を開発しました。 2015 年に、彼らは TensorFlow を公開しました。 それは急速にグロですwing 人気で。 現在、TensorFlow は、GitHub 上で最も多くのリポジトリを持つディープ ラーニング ライブラリです。
  • Tensorflow は大規模な展開が簡単であるため、実務家は Tensorflow を使用します。 クラウドまたは iOS や Android などのモバイル デバイスで動作するように構築されています。

Tensorflow はセッションで動作します。 各セッションは、異なる計算を使用したグラフによって定義されます。 簡単な例としては、数値の乗算が挙げられます。 Tensorflow では、次の XNUMX つの手順が必要です。

  1. 変数を定義する
X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")
  1. 計算を定義する
multiply = tf.multiply(X_1, X_2, name = "multiply")
  1. 操作を実行する
with tf.Session() as session:
result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
print(result)

Tensorflow での一般的な手法の XNUMX つは、データをロードするパイプラインを作成することです。 次の XNUMX つの手順に従うと、データを TensorFLow にロードできるようになります。

  1. データを作成する
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
  1. プレースホルダーを作成する
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')
  1. データセットメソッドを定義する
dataset = tf.data.Dataset.from_tensor_slices(x)
  1. パイプラインを作成する
iterator = dataset.make_initializable_iterator() get_next = iterator.get_next()
  1. プログラムを実行する
with tf.Session() as sess:  
sess.run(iterator.initializer, feed_dict={ x: x_input })  
print(sess.run(get_next))