apeescape2.com
  • メイン
  • 収益と成長
  • プロジェクト管理
  • Uiデザイン
  • 収益性と効率性
技術

方程式の解法からディープラーニングまで:TensorFlowPythonチュートリアル

最近、人工知能の世界では、自動運転車の進歩が広く公表されていることから、機械に至るまで、いくつかの注目すべき進展がありました。 ショパン作曲 模造品または ビデオゲームが本当に得意なだけです 。

これらの進歩の中心となるのは、 ツール ディープラーニングやその他の機械学習モデルの導出を支援するために、トーチ、カフェ、シーノが前面に出ています。ただし、Google Brainが独自のフレームワークであるTensorFlowを使用して2015年11月にオープンソースに移行して以来、このソフトウェアライブラリの人気が最も人気のあるディープラーニングフレームワークであることがわかりました。

TensorFlow



なぜこれが起こったのですか?理由には、利用可能な豊富なサポートとドキュメント、その生産準備、さまざまなデバイス間での計算の分散の容易さ、および優れた視覚化ツールが含まれます。 TensorBoard 。

最終的に、TensorFlowは、包括的で柔軟な一連の技術機能と非常に使いやすい組み合わせを実現します。

この記事では、このツールを使用して一般的な数値問題を解決することで、このツールの仕組みを理解します。その後、単純なニューラルネットワークの実装による深層学習での使用法を紹介します。

あなたが始める前に

機械学習方法の基本的な知識があることを前提としています。追いつく必要がある場合は、これをチェックしてください非常に便利です 役職 。

Python APIのデモを行うので、Numpyを理解することも有益です。

TensorFlowを設定するには、見つかった手順に従ってください ここに 。

Windowsを使用している場合は、執筆時点で、2.7ではなくPython3.4以降を使用する必要があることに注意してください。

準備ができたら、次のコマンドでライブラリをインポートできるようになります。

import tensorflow as tf

TensorFlowソリューションのステップ1/2:グラフを作成する

TensorFlowプログラムの構築は、通常2つの主要なステップで構成されます。最初のステップは、実行したい計算を説明する計算グラフを作成することですが、実際には実行したり、値を保持したりすることはありません。

他のグラフと同様に、ノードとエッジがあります。エッジはテンソルを表し、テンソルはn次元配列を表します。たとえば、次元(またはTensorFlowのランク)が0のテンソルはスカラー、ランク1はベクトル、ランク2は行列などです。

ノードは、必要に応じてテンソルを入力として使用して、出力テンソルを生成する操作を表します。このような演算には、加算(tf.add)、行列の乗算(tf.matmul)、および定数の作成(tf.constant)が含まれます。

それでは、これらのいくつかを組み合わせて最初のグラフを作成しましょう。

a = tf.constant([2.5, 2]) b = tf.constant([3, 6], dtype=tf.float32) total = tf.add(a, b)

ここでは、3つの操作を作成しました。そのうちの2つは、定数の1次元配列を作成するためのものです。

データ型は、渡されたvalues引数から推測されます。または、dtypeでこれらを示すことができます。引数。 bに対してこれを行っていなかった場合は、int32推測され、tf.addとしてエラーがスローされます。 2つの異なるタイプで加算を定義しようとしていたでしょう。

TensorFlowソリューションのステップ2/2:操作を実行します

グラフは定義されていますが、実際にグラフ(またはグラフの一部)で計算を行うには、TensorFlowセッションを設定する必要があります。

請負業者は従業員よりどれだけ多くを作るべきか
sess = tf.Session()

または、IPythonなどのインタラクティブシェルでセッションを実行している場合は、次を使用します。

sess = tf.InteractiveSession()

runセッションオブジェクトのメソッドは、テンソルを評価する1つの方法です。

したがって、上記で定義された加算計算を評価するために、取得するテンソルである「total」を渡します。これは、tf.addの出力を表します。 op。

print(sess.run(total)) # [ 5.5 8. ]

この時点で、TensorFlowのVariableクラスを紹介します。定数はグラフ定義の固定部分ですが、変数は更新できます。クラスコンストラクターには初期値が必要ですが、それでも、変数に対して他の操作を実行する前に、変数を明示的に初期化する操作が必要です。

変数は特定のセッションでのグラフの状態を保持するため、変数をよりよく理解するには、同じグラフを使用して複数のセッションで何が起こるかを観察する必要があります。

# Create a variable with an initial value of 1 some_var = tf.Variable(1) # Create op to run variable initializers init_op = tf.global_variables_initializer() # Create an op to replace the value held by some_var to 3 assign_op = some_var.assign(3) # Set up two instances of a session sess1 = tf.Session() sess2 = tf.Session() # Initialize variables in both sessions sess1.run(init_op) sess2.run(init_op) print(sess1.run(some_var)) # Outputs 1 # Change some_var in session1 sess1.run(assign_op) print(sess1.run(some_var)) # Outputs 3 print(sess2.run(some_var)) # Outputs 1 # Close sessions sess1.close() sess2.close()

グラフと2つのセッションを設定しました。

両方のセッションで初期化を実行した後(これを実行せずに変数を評価するとエラーが発生します)、1つのセッションでのみ割り当て操作を実行します。ご覧のとおり、変数値は持続しますが、セッション間では持続しません。

数値問題に取り組むためのグラフのフィード

TensorFlowのもう1つの重要な概念は、プレースホルダーです。変数は状態を保持しますが、プレースホルダーは、グラフが期待できる入力とそのデータ型(およびオプションでその形状)を定義するために使用されます。次に、計算を実行するときに、これらのプレースホルダーを介してデータをグラフにフィードできます。

TensorFlowグラフは、最終的にトレーニングしたいニューラルネットワークに似始めていますが、その前に、概念を使用して、金融界の一般的な数値問題を解決しましょう。

yを見つけたいとしましょうこのような方程式で:

c ++コーディングプログラム
v =何-0。5年+これ-Y+これ-1。5年+(C + P)e-2年

与えられたvに対して(CおよびP定数を使用)。

これは、市場価値y、元本v、およびクーポンPの債券の満期利回り(C)を計算するための式です。半年ごとに支払われますが、継続的な複利でキャッシュフローが割り引かれます。

基本的にこのような方程式を試行錯誤で解く必要があり、yの最終値に焦点を合わせるために二分法を選択します。

まず、この問題をTensorFlowグラフとしてモデル化します。

CおよびPは固定定数であり、グラフの定義の一部を形成します。 yの下限と上限を調整するプロセスが必要です。したがって、これらの境界(aおよびbで示される)は、yを推測するたびに変更する必要がある変数の適切な候補です。 (aとbの中間点と見なされます)。

# Specify the values our constant ops will output C = tf.constant(5.0) P = tf.constant(100.0) # We specify the initial values that our lower and upper bounds will be when initialised. # Obviously the ultimate success of this algorithm depends on decent start points a = tf.Variable(-10.0) b = tf.Variable(10.0) # We expect a floating number to be inserted into the graph v_target = tf.placeholder('float') # Remember the following operations are definitions, # none are carried out until an operation is evaluated in a session! y = (a+b)/2 v_guess = C*tf.exp(-0.5*y) + C*tf.exp(-y) + C*tf.exp(-1.5*y) + (C + P)*tf.exp(-2*y) # Operations to set temporary values (a_ and b_) intended to be the next values of a and b. # e.g. if the guess results in a v greater than the target v, # we will set a_ to be the current value of y a_ = tf.where(v_guess > v_target, y, a) b_ = tf.where(v_guess

これで、操作と変数のリストができました。これらはいずれも特定のセッションに対して評価できます。これらの操作の一部は、実行される他の操作に依存しているため、たとえばv_guessを実行します。 Cなどの他のテンソルを持つ連鎖反応を開始しますおよびP、最初に評価されます。

これらの操作の一部は、値を指定する必要があるプレースホルダーに依存しています。では、実際にその値をどのようにフィードするのでしょうか。

これはfeed_dictを介して行われますrunの引数関数自体。

a_を評価する場合は、次のようにプレースホルダーv_targetの値をプラグインします。

sess.run(a_, feed_dict={v_target: 100})

私たちに0.0を与えます。

v_targetを接続します130の場合、-10.0になります。

これは「ステップ」操作であり、実際には他のすべての操作を前提条件として実行する必要があり、実際にはグラフ全体を実行します。これは、セッション全体で実際の状態を実際に変更する操作でもあります。したがって、ステップを実行すればするほど、変数を段階的に微調整しますaおよびb yの実際の値に向かって。

それで、vの値を考えてみましょう方程式のは95に等しいです。セッションを設定し、そのセッションでグラフを100回実行してみましょう。

# Set up a session and initialize variables sess = tf.Session() tf.global_variables_initializer().run() # Run the step operation (and therefore whole graph) 100 times for i in range (100): sess.run(step, feed_dict={v_target:95})

yを評価すると今テンソル、私たちは望ましい答えに似た何かを得る

print(sess.run(y)) # 0.125163

ニューラルネットワーク

TensorFlowの仕組みを理解したので、これをTensorFlowに組み込まれたいくつかの追加の機械学習操作と組み合わせて、単純なニューラルネットワークをトレーニングできます。

ここでは、データポイントが特定の領域(原点を中心とする半径0.5の円)内にあるかどうかに応じて、2D座標系でデータポイントを分類します。

もちろん、これは特定のポイントをチェックするだけで具体的に確認できます(a,b) a^2 + b^2 <0.5の場合、ただしこの機械学習実験の目的のために、代わりにトレーニングセットを渡します。一連のランダムなポイントと、それらが目的の領域に該当するかどうか。これを作成する1つの方法は次のとおりです。

import numpy as np NO_OF_RANDOM_POINTS = 100 CIRCLE_RADIUS = 0.5 random_spots = np.random.rand(NO_OF_RANDOM_POINTS, 2) * 2 - 1 is_inside_circle = (np.power(random_spots[:,0],2) + np.power(random_spots[:,1],2)

次の特徴を持つニューラルネットワークを作成します。

  1. これは、2つのノードを持つ入力レイヤーで構成され、「random_spots」内に含まれる一連の2次元ベクトルをフィードします。これは、トレーニングデータを待機しているプレースホルダーによって表されます。
  2. 出力レイヤーにも2つのノードがあるため、一連のトレーニングラベル(「is_inside_circle」)をスカラーのプレースホルダーにフィードしてから、それらの値をワンホット2次元ベクトルに変換する必要があります。
  3. 3つのノードで構成される1つの隠れ層があるため、重み行列とバイアスベクトルに変数を使用する必要があります。これらは、トレーニングを実行するときに調整する必要がある値です。
INPUT_LAYER_SIZE = 2 HIDDEN_LAYER_SIZE = 3 OUTPUT_LAYER_SIZE = 2 # Starting values for weights and biases are drawn randomly and uniformly from [-1, 1] # For example W1 is a matrix of shape 2x3 W1 = tf.Variable(tf.random_uniform([INPUT_LAYER_SIZE, HIDDEN_LAYER_SIZE], -1, 1)) b1 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE], -1, 1)) W2 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE, OUTPUT_LAYER_SIZE], -1, 1)) b2 = tf.Variable(tf.random_uniform([OUTPUT_LAYER_SIZE], -1, 1)) # Specifying that the placeholder X can expect a matrix of 2 columns (but any number of rows) # representing random spots X = tf.placeholder(tf.float32, [None, INPUT_LAYER_SIZE]) # Placeholder Y can expect integers representing whether corresponding point is in the circle # or not (no shape specified) Y = tf.placeholder(tf.uint8) # An op to convert to a one hot vector onehot_output = tf.one_hot(Y, OUTPUT_LAYER_SIZE)

グラフの定義を完了するために、より良い分類器に到達するように変数をトレーニングするのに役立ついくつかのopsを定義します。これらには、行列計算、活性化関数、およびオプティマイザーが含まれます。

LEARNING_RATE = 0.01 # Op to perform matrix calculation X*W1 + b1 hidden_layer = tf.add(tf.matmul(X, W1), b1) # Use sigmoid activation function on the outcome activated_hidden_layer = tf.sigmoid(hidden_layer) # Apply next weights and bias (W2, b2) to hidden layer and then apply softmax function # to get our output layer (each vector adding up to 1) output_layer = tf.nn.softmax(tf.add(tf.matmul(activated_hidden_layer, W2), b2)) # Calculate cross entropy for our loss function loss = -tf.reduce_sum(onehot_output * tf.log(output_layer)) # Use gradient descent optimizer at specified learning rate to minimize value given by loss tensor train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss)

グラフを設定したら、セッションを設定して「train_step」を実行します(これは前提条件の操作も実行します)。これらの操作の一部はプレースホルダーを使用するため、それらの値を指定する必要があります。このトレーニングステップは、学習アルゴリズムの1つのエポックを表しているため、実行するエポックの数にループします。情報提供の目的で「損失」テンソルなど、グラフの他の部分を実行できます。

EPOCH_COUNT = 1000 sess = tf.Session() tf.global_variables_initializer().run() for i in range(EPOCH_COUNT): if i%100 == 0: print('Loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle}))) sess.run(train_step, feed_dict={X: random_spots, Y: is_inside_circle}) print('Final loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle})))

アルゴリズムをトレーニングしたら、ポイントを入力して、次のようにニューラルネットワークの出力を取得できます。

sess.run(output_layer, feed_dict={X: [[1, 1]]}) # Hopefully something close to [1, 0] sess.run(output_layer, feed_dict={X: [[0, 0]]}) # Hopefully something close to [0, 1]

出力ベクトルの最初のメンバーが0.5より大きい場合は、点を円の外側に分類できます。それ以外の場合は、内側に分類できます。

output_layerを実行する多くの点のテンソルを使用すると、学習者が正に分類された点を含む領域をどのように想定しているかを知ることができます。トレーニングセットのサイズ、学習率、その他のパラメータを試して、意図した円にどれだけ近づくことができるかを確認することをお勧めします。

ほぼ三角形

トレーニングセット:100ポイント
学習率:0.01
エポック:1000

プロトタイプは、次のプロセスで特に重要です。

小さな三角形

トレーニングセット:1000ポイント
学習率:0.01
エポック:1000

大きな三角形

トレーニングセット:1000ポイント
学習率:0.01
エポック:10000

ほぼ円

トレーニングセット:1000ポイント
学習率:0.001
エポック:10000

要約

これは、トレーニングセットまたはエポック量の増加が優れた学習者を保証するものではないという良い教訓です。学習率は適切に調整する必要があります。

うまくいけば、これらのデモンストレーションにより、TensorFlowのコア原則についての優れた洞察が得られ、より複雑な手法を実装するための強固な基盤が提供されます。

TensorboardやGPU全体でのモデルのトレーニングなどの概念については説明していませんが、これらについては TensorFlowドキュメント 。この強力なフレームワークを使用してエキサイティングなディープラーニングタスクに取り組むのに役立つレシピがドキュメントに多数あります。

関連: TensorFlowにおける最急降下法の多くのアプリケーション

基本を理解する

データフローグラフとは何ですか?

データフローグラフは計算グラフであり、実行したい計算を記述しますが、実際には実行したり、値を保持したりすることはありません。

TensorFlow変数とは何ですか?

TensorFlowの変数は、特定のセッションでのグラフの状態を保持します。 TensorFlowグラフの定数はグラフ定義の固定部分ですが、変数は操作を使用して更新できます。

リモートブランド戦略ワークショップ:究極のステップバイステップガイド

ツールとチュートリアル

リモートブランド戦略ワークショップ:究極のステップバイステップガイド
重要なテストを書く:最も複雑なコードに最初に取り組む

重要なテストを書く:最も複雑なコードに最初に取り組む

バックエンド

人気の投稿
Vue3でのオンデマンドの反応性
Vue3でのオンデマンドの反応性
VanillaJSでのReactとJSXのエミュレート
VanillaJSでのReactとJSXのエミュレート
カスタムMagento2ウィジェットを作成する方法
カスタムMagento2ウィジェットを作成する方法
不和ボットの作り方:概要とチュートリアル
不和ボットの作り方:概要とチュートリアル
JavaScriptデザインパターンの包括的なガイド
JavaScriptデザインパターンの包括的なガイド
 
Google BigQueryを使用する意味があるのはいつですか?
Google BigQueryを使用する意味があるのはいつですか?
Pythonビデオストリーミングでポルノを20倍効率化した方法
Pythonビデオストリーミングでポルノを20倍効率化した方法
ディストレストM&A:バーゲン購入の機会の評価
ディストレストM&A:バーゲン購入の機会の評価
スニペットブラウジングパターンのAndroid開発者ガイド
スニペットブラウジングパターンのAndroid開発者ガイド
究極のUXフック– UXにおける予測的、説得力のある、感情的なデザイン
究極のUXフック– UXにおける予測的、説得力のある、感情的なデザイン
人気の投稿
  • EUでビジネスを行う
  • 近接性の原理は次のように述べています
  • 営利目的の退職者コミュニティ向けではありません
  • 需要の価格弾力性を見つける方法
  • s法人とc法人の違いは何ですか
  • cプログラムを学ぶ方法
カテゴリー
データサイエンスとデータベース ライフスタイル 設計プロセス 投資家と資金調達 Kpiと分析 ブランドデザイン デザイナーライフ その他 プロセスとツール 製品ライフサイクル

© 2021 | 全著作権所有

apeescape2.com