Tensorflow-印象的なディープラーニングライブラリ!

ソースノード: 1058343

この記事は、の一部として公開されました データサイエンスブログソン

概要

Tensorflow(以下– TF)は、Google Brainで開発されている、ディープマシンラーニング用のかなり若いフレームワークです。 長い間、フレームワークは不信と呼ばれるクローズドモードで開発されていましたが、9年2015月1.0日にグローバルにリファクタリングされた後、オープンソースにリリースされました。 TFが小さいXNUMX年で、バージョンXNUMXに成長し、Kerasとの統合を取得し、はるかに高速になり、モバイルプラットフォームのサポートを受けました。 Python APIのみを検討しますが、これが唯一のオプションではありません。C++およびモバイルプラットフォーム用のインターフェイスもあります。

インストール

TFはpython-pipを介して標準でインストールされます。 ニュアンスがあります。CPUとビデオカードで実行するための個別のインストールアルゴリズムがあります。

CPUの場合、すべてが単純です。TensorFlowと呼ばれるpipからパッケージをインストールする必要があります。

XNUMX番目のケースでは、次のものが必要です。

  1. ビデオカードとの互換性を確認してください。 CUDA ComputeCapabilityパラメーターは3.0より大きくなければなりません。

  2. CUDAツールキットバージョン8をインストールします

  3. cuDNNバージョン5.1をインストールします

  4. pipからTensorFlow-GPUパッケージをインストールします

ただし、ドキュメントには、以前のバージョンのCUDA ToolkitとcuDNNがサポートされていると記載されていますが、上記のバージョンをインストールすることをお勧めします。

開発者は、バージョン管理や依存関係の問題を回避するために、仮想環境を備えた別の環境にTFをインストールすることをお勧めします。

基本的なTF要素

「Hello、world」の助けを借りて、すべてが正しくインストールされていることを確認します。

import tensorflow as tf#connect TF hello = tf.constant( 'Hello、TensorFlow!')#TFからオブジェクトを作成sess = tf.InteractiveSession()#新しいセッションを構築するprint(sess.run(hello))#sessionオブジェクトを「実行」します>>> b 'こんにちは、TensorFlow! '

TFを最初の行に接続します。 フレームワークに対応する略語を導入するルールはすでにあります。 同じコードがドキュメントにあり、すべてが正しくインストールされていることを確認できます。

計算グラフ

TFの操作は、計算のグラフの作成と実行を中心に構築されています。 計算グラフは、計算がどのように実行されるかを説明する構成です。 TFの基本は、計算の順序を指定する構造の作成です。 プログラムは当然、計算グラフのコンパイルと作成された構造での計算の実行というXNUMXつの部分に構造化されます。

TFでは、グラフはプレースホルダー、変数、および演算で構成されます。 これらの要素から、テンソルが計算されるグラフを組み立てることができます。 テンソルは、単一の数値、解決されている問題からの特徴のベクトルまたは画像、あるいはオブジェクト記述のバッチ全体または画像の配列のいずれかであるマルチD配列です。 XNUMXつのオブジェクトの代わりに、オブジェクトの配列をグラフに渡すことができ、そのために応答の配列が計算されます。 テンソルを使用したTFの動作は、NumPyが配列を処理する方法と似ており、その関数では、計算が実行される相対的な配列の軸を指定できます。

セッションズ

計算グラフはセッションで実行されます。 セッションオブジェクト(tf.Session)は、グラフ実行のコンテキスト(必要なリソース、補助クラス、アドレススペース)を非表示にします。

セッションにはXNUMXつのタイプがあります。XNUMXつは通常のセッションで、tf.Sessionに実装され、もうXNUMXつはインタラクティブで、(tf.InteractiveSession)に実装されます。 XNUMXつの違いは、対話型セッションがコンソールでの実行に適しており、すぐにデフォルトセッションとして識別されることです。 主な効果は、セッションオブジェクトをパラメータとして計算関数に渡す必要がないことです。 以下の例では、最初の例で宣言した対話型セッションが現在実行中であると想定し、セッションにアクセスする必要がある場合は、オブジェクトsessを参照します。

さらに投稿では、Tensorboardと呼ばれる組み込みユーティリティによって生成されたグラフ画像を含む標準のTF画像が表示されます。 そこにある指定は次のとおりです。

変数 操作 補助的な結果
グラフノードには通常、データが含まれています。 変数を使って何かをします。 これには、グラフに値を代入するプレースホルダーも含まれます。 キャッシュやグラデーションなどのサイド計算は、通常、グラフの別の部分へのリンクと呼ばれます。

変数| Tensorflow

操作| Tensorflow

補助的な結果

テンソル、演算、および変数

たとえば、ゼロで満たされたテンソルを作成しましょう。

zeros_tensor = tf.zeros([3、3])

一般に、TFのAPIは多くの点でNumPyに似ており、tf.zeros()はNumPyに直接アナログを持つ唯一の関数とはほど遠いものです。 テンソルの値を確認するには、テンソルを実行する必要があります。 グラフの実行に関する詳細は少し低くなりますが、今のところ、テンソルの値とテンソル自体を出力するという事実で管理します。

print(zeros_tensor.eval())print(zeros_tensor)>>> [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] >>> Tensor( "zeros_1:0 "、shape =(3、3)、dtype = float32)

行間の違いは、最初の行でテンソルを計算し、XNUMX番目の行でオブジェクトの表現を出力することです。

テンソルの説明によって表示される重要なもの:

  1. テンソルには名前があります。 私たちのものにはゼロがあります:0

  2. テンソル形状の概念があり、NumPyの配列の次元に似ています。

  3. テンソルは型付けされ、それらの型はライブラリから設定されます。

テンソルに対してさまざまな操作を実行できます。

a = tf.truncated_normal([2、2])b = tf.fill([2、2]、0.5)print(sess.run(a + b))print(sess.run(a --b))print( sess.run(a * b))print(sess.run(tf.matmul(a、b)))>>> [[-1.12130964 -1.02217746] [0.85684788 0.5425666]] >>> [[0.35249496 0.96118248] [- 1.55395389 -1.18111515]] >>> [[-0.06559008 -0.11100233] [0.51474923 -0.27813852]] >>> [[-0.16202734 -0.16202734] [-0.8864761 -0.8864761]]

上記の例では、構築sess.runを使用しています。これは、セッションでグラフ操作を実行するためのメソッドです。 正規分布の標準生成を使用しますが、2つの標準偏差の範囲外のすべてを除外します。 TFの非常に典型的なこと–操作を実行するための一般的なオプションのほとんどはすでに実装されており、おそらく、自転車を発明する前に、ドキュメントを確認する価値があります。 2番目のテンソルは、値0.5で満たされたXNUMX×XNUMXの多次元配列であり、多次元配列を作成するためのNumPyとその関数に似ています。

次に、テンソルベースの変数を作成しましょう。

v = tf.Variable(zeros_tensor)

変数は、計算グラフのノードがその状態を保持し、ある種の初期化を必要とするため、計算に参加します。 したがって、次の例で最初の行を指定せずに実行すると、TFは例外をスローします。

sess.run(v.initializer)v.eval()>>> array([[0.、0.、0。]、[0.、0.、0。]、[0.、0.、0。 ]]、dtype = float32)

変数の操作により、実行可能な計算グラフが作成されます。 プレースホルダーもあります。これは、グラフをパラメーター化し、外部値の置換のために場所をマークするオブジェクトです。 公式ドキュメントに記載されているように、プレースホルダーは後で値を置き換えることを約束します。 プレースホルダーを作成して、データ型とサイズを割り当てましょう。

x = tf.placeholder(tf.float32、shape =(4、4))

別の使用例。 ここで、加算器の入力として機能するノードはXNUMXつのプレースホルダーです。

a = tf.placeholder( "float")b = tf.placeholder( "float")y = tf.multiply(a、b)print(sess.run(y、feed_dict = {a:100、b:500}) )>>> 50000.0

最も単純な計算。

例として、いくつかの式を作成して評価してみましょう。

ans = tf.placeholder(tf.float32)f = 1 + 2 * ans + tf.pow(ans、2)sess.run(f、feed_dict = {x:10})>>> 121.0

そして計算グラフ:

計算グラフ| Tensorflow

このスキームの操作を示すXとyは追加のパラメーターであり、代わりにグラフのエッジが存在する可能性がありますが、スカラー値にf1と2を代入しました。これは、グラフの数値の表記にすぎません。 。 この例では、プレースホルダーを作成し、それに基づいて式グラフを作成し、その後、現在のセッションのコンテキストでグラフ計算を実行します。 プレースホルダーパラメーターで形状を指定していません。つまり、任意のサイズのテンソルを入力できます。 指定する必要があるのはテンソルタイプだけです。 セッション内でパラメーターを計算するとき、パラメーターは、計算に必要なすべてのものを含む辞書であるfeed_dictを介して渡されます。

たとえば、S状結腸:

x = tf.placeholder(dtype = tf.float32)sigma = 1 /(1 + tf.exp(-x))sigma.eval(feed_dict = {x:np.linspace(-5、5)})

そして、ここに彼女のためのそのようなグラフがあります。

シグモイド計算グラフ| Tensorflow

関数計算の開始を含むスニペットには、この例を前の例と区別するXNUMXつのポイントがあります。 実際には、単一のスカラー値ではなく、配列全体をプレースホルダーに渡します。 TFは、単一のテンソル内で配列のすべての値を一緒に処理します(array ==テンソルであることを忘れないでください)。 まったく同じ方法で、オブジェクトをバッチ全体でグラフに転送し、全体像をニューラルネットワークに提供できます。

一般に、テンソルの操作はNumPyの配列の操作に似ています。 ただし、いくつかの違いがあります。 特定の次元に沿ってテンソルの値を何らかの方法で組み合わせることによって次元を縮小したい場合は、縮小で始まる関数を使用します。

Theano APIと比較すると、TFではベクトルと行列に分割されていませんが、代わりにグラフ内のテンソルの次元を監視する必要があり、テンソル形式を導出するメカニズムがあります。これにより、実行前でもディメンション。

機械学習

まず、すでに何度も言及されている古典的な線形回帰を分析しましょうが、トレーニングには最急降下法を使用します。

機械学習| Tensorflow

SOURCE

この写真なしでどこに行けますか?

最初に線形回帰から始め、その後、多項式の特徴を追加します。

合成データを抽出するには:

x = np.linspace(0、10、1000)y = np.sin(x)+ np.random.normal(size = len(x))

それらは次のようになります。

グラフ| Tensorflow

SOURCE

また、サンプルを70/30の比率でトレーニングとコントロールに分割しますが、これと他のいくつかの日常的な瞬間を完全なソースに残します。リンクは少し下にあります。

まず、単純な線形回帰を作成しましょう。

a_ = tf.placeholder(name = "input"、shape = [None、1]、dtype = tf.float32)b_ = tf.placeholder(name = "output"、shape = [None、1]、dtype = tf。 float32)model_op = tf.Variable(tf.random_normal([1])、name = 'bias')+ tf.Variable(tf.random_normal([1])、name = 'k')* x_

ここでは、属性と応答のXNUMXつのプレースホルダーとビュー式を作成します。

ニュアンス–プレースホルダーの形状パラメーターにはNoneが含まれます。 プレースホルダーの寸法は、プレースホルダーがXNUMX次元のテンソルを消費することを意味しますが、軸のXNUMXつに沿って、テンソルのサイズは定義されておらず、何でもかまいません。 これは、ユーザーが一度にバッチ全体で値をグラフに転送できるようにするために行われます。 このような特定のディメンションは動的と呼ばれ、TFは実行時に関連する要素の実際のディメンションを計算します。

数式では機能のプレースホルダーが使用されていますが、損失関数の回答の代わりにプレースホルダーを使用します。

損失= tf.reduce_mean(tf.pow(y_ --model_output、2))

TFはXNUMXの最適化手法を実装しています。 パラメータで学習率を指定して、古典的な最急降下法を使用します。

gd = tf.train.GradientDescentOptimizer(0.001)train_step = gd.minimize(loss)

変数の初期化–さらに計算する必要があります。

sess.run(tf.global_variables_initializer())

最終的にすべてを教えることができます。 サンプルのトレーニング部分で100のトレーニングエポックを実行し、各トレーニングの後に、延期された部分の制御を調整します。

n_epochs = 100 train_errors = [] test_errors = []
for i in tqdm.tqdm(range(n_epochs)):#100 _、train_err = sess.run([train_step、loss]、feed_dict = {x_:X_Train.reshape((len(X_Train)、1))、y_:Y_Train.reshape ((len(Y_Train)、1))})train_errors.append(train_err)test_err.append(ses.run(loss、feed_dict = {x_:X_Test.reshape((len(X_Test)、1))、y_:Y_Test .reshape((len(Y_Test)、1))}))

両方の操作train_stepandloss make直接とトレーニングの実装の最初のセッション、およびトレーニングセットのエラーの評価、つまり実際にサンプルをどれだけよく記憶したかの推定。 セッションのXNUMX番目の実行は、テストサンプルの損失の計算です。 パラメータでは、feed_dictIはプレースホルダーの値をグラフに渡し、データ配列の次元が一致するように形状を変更します。 プレースホルダーNoneに値があった場合は、任意の数を転送できます。 このような不定次元のテンソルは動的と呼ばれ、ここではそれらを使用して、例を含むバッチをトレーニング用のグラフに転送します。

これが学習のダイナミクスであることがわかります。

トレーニングとテスト学習

このグラフには、勾配と初期化操作を伴う補助変数が含まれており、それらは別のブロックに配置されます。

グラデーションを使用した計算グラフ

モデルの計算結果は次のとおりです。

モデルの計算結果| Tensorflow

私はこの方法でグラフの値を計算しました:

sess.run(model_output、feed_dict = {x_:x.reshape((len(x)、1))})

ここでは、プレースホルダーx_の値のみをグラフに渡します。残りは、式model_outputを評価するために必要ありません。

多項式回帰

多項式の特徴、正則化、およびモデルの学習率の変更を使用して、回帰を多様化してみましょう。

データセットの生成では、度数を追加し、scikit-learnライブラリのPolynomialFeaturesとStandardScalerを使用して特徴を正規化します。 最初のオブジェクトは必要な数の多項式フィーチャを作成し、XNUMX番目のオブジェクトはそれらを正規化します。

多項式回帰に切り替えるには、計算グラフの数本の線を置き換えます。

order = 26 x_ = tf.placeholder(name = "input"、shape = [None、order]、dtype = tf.float32)y_ = tf.placeholder(name = "output"、shape = [None、1]、dtype = tf.float32)w = tf.Variable(tf.random_normal([order、1])、name = 'weights')model_output = tf.matmul(x_、w)

実際、私たちは今数えています。 明らかに、モデルが突然オーバーフィットする危険性があるので、重みに正則化ペナルティを追加しましょう。 追加の用語の形で損失関数(例では損失)にペナルティを追加し、sklearnからほぼElasticNetを取得します。

損失= tf.reduce_mean(tf.square(y_ --model_output))+ 0.85 * tf.nn.l2_loss(w)+ 0.15 * tf.reduce_mean(tf.abs(w))

最も一般的なL2回帰には、別の関数l2_lossがありますが、L1を使用した特徴選択は手動で実装する必要がありますが、重みの全体的な絶対値の平均があります。

例として、学習のペースに影響を与えるもうXNUMXつの重要な変更を追加します。 多くの場合、重い神経ネットワークをトレーニングする場合、これはトレーニングの問題を回避し、許容できる結果を得るために必要な手段です。 非常に簡単なアイデアは、大きな問題を回避しながら、学習しながらステップパラメータを徐々に下げることです。

一定のテンポの代わりに、ドキュメントから直接取得した指数関数的減衰を使用します。

Learning_rate = tf.train.exponential_decay(starter_learning_rate、global_step、100000、0.96、staircase = True)

数式は関数内に隠されています。

この例のdecay_stepでは、値は100000、decay_rate-0.96です。

トレーニングと制御のエラーを減らすために、次の割合が得られます。

トレインテストエラー| Tensorflow

指数関数的減衰に加えて、学習率を下げることができる他の関数があります。もちろん、ニーズに合わせて別の関数を作成することを妨げるものは何もありません。

グラフの保存と読み込み

私たちはモデルを手に入れました、そしてそれを保持するのは素晴らしいことです。 APIの特別なシリアライザーオブジェクトが行うXNUMXつのことは次のとおりです。

  1. 現在のグラフ、その状態、および変数値をファイルに保存します;

  2. ファイルからすべて同じように読み取ります。

あなたがする必要があるのはこのオブジェクトを作成することです:

セーバー= tf.train.Saver()

現在のセッションの状態は、saveメソッドを使用して保存されます。

saver.save(sess、 "checkpoint_dir / model.ckpt")

モデルの保存された状態がチェックポイントと呼ばれることは、どういうわけか受け入れられています。したがって、フォルダーとファイル拡張子の名前です。 リカバリは、restoreメソッドを使用して実行されます。

ckpt = tf.train.get_checkpoint_state(ckpt_dir)
if 確認 および ckpt.model_checkpoint_path:print(ckpt.model_checkpoint_path)saver.restore(session、ckpt.model_checkpoint_path)

まず、特別な関数を使用して、チェックポイントの状態を取得します(ターゲットディレクトリに保存されたモデルが突然ない場合、関数はNoneを返します)。 デフォルトでは、関数はファイルチェックポイントを検索しますが、この動作はパラメーターを使用して変更できます。 その後、グラフの状態を復元します。

テンソルボード

TFの一部として非常に便利なシステムはWebダッシュボードです。これを使用すると、ダンプとログから統計を収集し、計算中に実際に何が起こっているかを観察できます。 ダッシュボードがWebサーバー上で実行されると非常に便利です。たとえば、クラウド内のリモートマシンでテンソルボードを実行することにより、ブラウザーウィンドウで何が起こっているかを監視できます。

Tensorboardは次のことができます。

コインの反対側は、統計がダッシュボードに入るには、特別なAPIを使用してログに(protobuf形式で)保存する必要があるということです。 APIはそれほど複雑ではなく、tf.summaryにグループ化されています。

Tensorboardを使用する場合でも、変数名のパラメーターを忘れないようにすることも重要です。 変数に割り当てられる名前は、グラフの描画に使用され、ダッシュボードのユーザーインターフェイスで一般的にどこでも選択できます。 小さなグラフの場合、これは重要ではありませんが、問題の複雑さが増すにつれて、何が起こっているのかを理解する上で問題が発生する可能性があります。

さまざまな方法で変数データを格納する関数には、いくつかの種類があります。

tf.summary.histogram( "layer_output"、w_h)

この関数を使用すると、レイヤーの出力のヒストグラムを収集し、トレーニング中の変化のダイナミクスを概算できます。 関数tf.summary.scalar( "accuracy"、learning_rate)は数値を保持します。 音声や画像を保存することもできます。

ログを保存するには、もう少し必要です。まず、ファイルを書き込むためのFileWriterを作成する必要があります。

writer = tf.summary.FileWriter( "./ logs / nn_logs"、sess.graph)#1.0の場合merge = tf.summary.merge_all()

そして、すべての統計をXNUMXつのオブジェクトに結合します。

次に、実行のためにこのオブジェクトをセッションにマージ転送してから、FileWriterがメソッドを使用してセッションから受信した新しいデータを追加する必要があります。

summary、op_res = ses.run([merged、op]、feed_dict = {X:X_train、Y:y_train、p_keep_input:1.0、p_keep_hidden:1.0})writer.add_summary(summary、i)

ただし、グラフを簡単に保存するには、次のコードで十分です。

マージ済み= tf.summary.merge_all(key = 'summaries')
if   os.path.exists( 'tensorboard_logs /'):os.makedirs('tensorboard_logs /')my_writer = tf.summary.FileWriter( 'tensorboard_logs /'、sess.graph)

そしてニュアンス:デフォルトでは、Tensorboardは127.0でローカルに利用可能です。 1 .1:6006。うまくいけば、このメモで読者に数秒の時間とニューロンを節約しました。

多層パーセプトロン

関数xorを記憶する標準的な例を分析してみましょう。これは、特徴空間の線形除算が不可能なため、線形モデルが同化できないものです。

多層パーセプトロン| Tensorflow

多層ネットワークは、特徴空間を分離可能なものに暗黙的に変換する、または(実装に応じて)この空間の非線形パーティションを作成するという事実により、機能を学習します。 最初のオプションを実装します–層の非線形活性化を伴うXNUMX層パーセプトロンを作成します。 最初のレイヤーは非線形変換を実行し、XNUMX番目のレイヤーは変換された特徴空間で機能するほぼ線形の回帰です。

relu関数を非線形要素として使用します。

ネットワークの構造を定義しましょう。

x_ = tf.placeholder(name = "input"、shape = [None、2]、dtype = tf.float32)y_ = tf.placeholder(name = "output"、shape = [None、1]、dtype = tf。 float32)hidden_​​neurons = 15 w1 = tf.Variable(tf.random_uniform(shape = [2、hidden_​​neurons]))b1 = tf.Variable(tf.constant(value = 0.0、shape = [hidden_​​neurons]、dtype = tf.float32) )layer1 = tf.nn.relu(tf.add(tf.matmul(x_、w1)、b1))w2 = tf.Variable(tf.random_uniform(shape = [hidden_​​neurons、1]))b2 = tf.Variable( tf.constant(value = 0.0、shape = [1]、dtype = tf.float32))nn_output = tf.nn.relu(tf.add(tf.matmul(layer1、w2)、b2))

Kerasや他の高レベルのライブラリとは異なり、TheanoのようなTFは、いくつかの算術演算のコレクションとして各レイヤーの詳細な定義を想定しています。 これはすべてのタイプのレイヤーに当てはまるわけではありません。たとえば、畳み込みレイヤーとドロップアウトレイヤーはXNUMXつの関数で定義されますが、通常の完全に接続されたレイヤーは、重みとシフトの変数だけでなく、操作自体の宣言です(重みと前のレイヤーの出力、シフトの追加、アクティブ化関数の適用)。

もちろん、ほとんどの場合、すべてが同様の機能になります。

def full_connected(input_layer、weights、bias):layer = tf.add(tf.matmul(input_layer、weights)、bias)
return(tf.nn.relu(layer))

同時に、私自身の経験によれば、変数を外部で宣言して初期化する方が便利です。グラフ内の別の場所で変数を使用する必要がある場合(典型的な例は、共通の重みを持つシャムニューラルネットワークです)、または単にファイルにログインして現在の値を表示するだけですが、何らかの理由でテンソルボードを使用したくありません。

基本損失関数を使用します。

gd = tf.train.GradientDescentOptimizer(0.001)loss = tf.reduce_mean(tf.square(nn_output --y _))train_step = gd.minimize(loss)

と電車:

a = np.array([[0、0]、[0、1]、[1、0]、[1、1]])b = np.array([[0]、[1]、[1] 、[0]])
for _ in range(20000):sess.run(train_step、feed_dict = {x_:a、y_:b})

結果のグラフ:

結果のグラフ

回帰と比較すると、実質的に何も変わっていません。同じ学習プロセス、同じ損失関数です。 大幅に変更されたコードの唯一の部分は、計算グラフを作成するためのコードです。 特定のタスク用の一連のスクリプトを蓄積し、データフィードと計算グラフのみを変更するようになりました。

もちろん、この例では遅延フェッチチェックはありません。 グラフでニューラルネットワークの出力を計算することにより、ネットワークが正しく機能していることを確認できます。

sess.run(nn_output、feed_dict = {x_:x})

もちろん、より複雑なモデルの場合は、トレーニング中のレイジーサンプリングと品質追跡の検証、およびデータをグラフにフィードするためのTFに組み込まれたメソッドが追加されます。

資源管理

多くの場合、世界は不公平であり、タスクが0つのデバイスに完全に収まらない場合があります。 または、経営陣がテスラを0つだけ購入し、開発者が忙しいカードをめぐって定期的に競合します。 TFには、このような場合の計算制御メカニズムがあります。 フレームワーク内では、デバイスは「/ cpu:XNUMX」、「/ gpu:XNUMX」などと呼ばれます。最も簡単なことは、この変数またはその変数が「存在する」場所を正確に指定できることです。

  tf.device( '/ cpu:0'):a =..。

この例では、変数はプロセッサに送信されます。

構成オブジェクトをセッションに転送することもできます。これを使用して、グラフ計算の実行を変更できます。 これは次のようになります。

cfg = tf.ConfigProto()sess = tf.Session(config = cfg)

構成では、まず、パラメーターlog_device_placementを有効にして、グラフのこの部分またはその部分の計算がどのコンピューティングデバイスに行われたかを理解できます。

開発チームがGPUメモリの消費を制限することに同意できるとしましょう。 以下のコードはそれを示しています:

gpu_opts = tf.GPUOptions(per_process_gpu_memory_fraction = 0.25)sess = tf.Session(config = tf.ConfigProto(gpu_options = gpu_opts))

この構成では、セッションはGPUメモリのXNUMX分のXNUMXを超えて消費しません。つまり、同時に複数のモデルの計算を実行でき、CPUでカウントされるモデルを実行することもできますが、最も簡単な方法は、TFがこれらの問題自体を解決するパラメータallow_soft_placementsoを有効にすることです。 APIのこの部分では、ドキュメントはまだ非常に断片的であり、一部のリンクは構成クラスのソースコードでGitHubに直接つながっています。 一部のプロパティは廃止としてマークされていますが、その他は実験的なものであるため、ここでは注意する必要があります。

まとめ

TFは文字通りXNUMX年半で大きく成長したため、畳み込みネットワークとリカレントネットワークの使用、強化学習、およびさまざまなタスクへのフレームワークの適用について個別にレビューするときが来ました。

この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、作成者の裁量で使用されています。

出典:https://www.analyticsvidhya.com/blog/2021/08/tensorflow-an-impressive-deep-learning-library/

タイムスタンプ:

より多くの 分析Vidhya