[[185581]] 導入 TensorFlow は、DistBelief に基づいて Google が開発した第 2 世代の人工知能学習システムです。音声認識や画像認識など、多くの機械学習のディープラーニング分野で広く使用されています。その名前はその動作原理に由来しています。 Tensor は N 次元配列を意味し、Flow はデータフローグラフに基づく計算を意味します。TensorFlow は、グラフの一方の端からもう一方の端に流れるテンソルの計算プロセスを表します。これは、複雑なデータ構造を分析および処理するために人工知能ニューラル ネットワークに転送するプロセスです。 TensorFlow は完全にオープンソースであり、誰でも使用できます。スマートフォンのような小型デバイスからデータセンター内の数千台のサーバーまで、さまざまなデバイスで動作します。 「上級機械学習ノート」シリーズでは、TensorFlow システムの技術的な実践をゼロから浅いところから深いところまで深く分析し、皆さんと一緒に機械学習の高度な道を歩んでいきます。 CUDA と TensorFlow のインストール 過去の経験によれば、 fq ツールがあれば、TensorFlow は 1 つの pip コマンドだけでインストールできます。 fq ツールがない場合は、壁の内側で他の人が共有しているアドレスを探してください。最も落とし穴が多いのは、GPUのサポートをインストールすることです。Nvidiaのcudaを事前にインストールする必要があります。ここには多くの落とし穴があります。cudaをインストールするには、ubuntu debインストール方法を使用することをお勧めします。run.shメソッドは常に多くの問題があるように感じます。cudaの具体的なインストールを参照してください。 リンク先の tensorflow バージョンは古いバージョンですので、ご注意ください。現在 tensorflow の公式要件は cuda7.5+cudnnV4 です。インストールの際はこの点にご注意ください。 こんにちは世界 - テンソルフローをtfとしてインポートする
- hello = tf.constant( 'こんにちは、TensorFlow!' )
- sess = tf.Session()
- sess.run(hello) を印刷します。
まず、tf.constant を通じて定数を作成し、次に Tensorflow セッションを開始し、sess の run メソッドを呼び出してグラフ全体を開始します。 次に簡単な計算をします。 - テンソルフローをtfとしてインポートする
- a = tf.定数(2)
- b = tf.定数(3)
- tf.Session()を sessとして使用:
- 「a=2, b=3」と印刷する
- print "定数による加算: %i" % sess.run(a+b)
- 「定数による乗算: %i」を印刷% sess.run(a*b)
- #出力
- a=2、b=3
- 定数による加算: 5
- 定数による乗算: 6
次に、Tensorflow のプレースホルダーを使用して、同様の計算用の変数を定義します。 プレースホルダーの使用については、https://www.tensorflow.org/versions/r0.8/api_docs/python/io_ops.html#placeholder を参照してください。 - テンソルフローをtfとしてインポートする
- a = tf.プレースホルダー(tf.int16)
- b = tf.プレースホルダー(tf.int16)
- 追加= tf.add (a, b )
- mul = tf.mul(a, b)
- tf.Session()を sessとして使用:
- #変数入力ですべての操作を実行する
- print "変数を使用した加算: %i" % sess.run( add , feed_dict={a: 2, b: 3})
- 「変数を使用した乗算: %i」を出力します% sess.run(mul, feed_dict={a: 2, b: 3})
- #出力:
- 変数を使った加算: 5
- 変数を使った乗算: 6
- 行列1 = tf.定数([[3., 3.]])
- 行列2 = tf.定数([[2.],[2.]])
- tf.Session()を sessとして使用:
- 結果 = sess.run(製品)
- 結果を印刷
線形回帰 以下のコードは GitHub から取得しました - aymericdamien/TensorFlow-Examples: 初心者向けの TensorFlow チュートリアルと例、学習目的のみ - アクティベーション = tf.add ( tf.mul(X, W), b)
-
- # 二乗誤差を最小化する
- コスト = tf.reduce_sum(tf.pow(activation-Y, 2))/(2*n_samples) #L2損失
- optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #勾配降下法
-
- # 変数の初期化
- 初期化 = tf.initialize_all_variables()
-
- # グラフを起動する
- tf.Session()を sessとして使用:
- セッションの実行(初期化)
-
- #すべてのトレーニングデータを適合する
- 範囲内のエポックの場合(training_epochs):
- zip(train_X, train_Y)内の(x, y)の場合:
- sess.run(オプティマイザ、feed_dict={X: x, Y: y})
-
- #エポックステップごとにログを表示する
- エポック% display_step == 0の場合:
- 「エポック:」 、 '%04d' % (エポック+1)、 "cost=" 、\ を印刷します
- "{:.9f}" .format(sess.run(コスト、feed_dict={X: train_X, Y:train_Y})), \
- "W=" 、 sess.run(W)、 "b=" 、 sess.run(b)
-
- 「最適化が完了しました!」と印刷します。
- 「cost=」を印刷します。sess.run(cost, feed_dict={X: train_X, Y: train_Y}), \
- "W=" 、 sess.run(W)、 "b=" 、 sess.run(b)
-
- #グラフィック表示
- plt.plot(train_X, train_Y, 'ro' , label= '元のデータ' )
- plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label= '適合線' )
- plt.凡例()
- plt.show()
ロジスティック回帰 - テンソルフローをtfとしてインポートする
- # MINSTデータをインポート
- tensorflow.examples.tutorials.mnistからinput_dataをインポートします
- mnist = input_data.read_data_sets( "/tmp/data/" 、 one_hot= True )
-
- # パラメータ
- 学習率 = 0.01
- トレーニングエポック = 25
- バッチサイズ = 100
- 表示ステップ = 1
-
- # tf グラフ入力
- x = tf.placeholder(tf.float32, [None, 784]) #形状 28*28=784のmnist データ画像
- y = tf.placeholder(tf.float32, [None, 10]) # 0~9の数字の認識 => 10クラス
-
- #モデルの重みを設定する
- W = tf.Variable(tf.zeros([784, 10]))
- b = tf.Variable(tf.zeros([10]))
-
- # モデルの構築
- pred = tf.nn.softmax(tf.matmul(x, W) + b) # ソフトマックス
-
- #クロスエントロピーを使用してエラーを最小化する
- コスト = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
- # 勾配降下法
- オプティマイザー = tf.train.GradientDescentOptimizer(learning_rate).minimize(コスト)
-
- # 変数の初期化
- 初期化 = tf.initialize_all_variables()
-
- # グラフを起動する
- tf.Session()を sessとして使用:
- セッションの実行(初期化)
-
- # トレーニングサイクル
- 範囲内のエポックの場合(training_epochs):
- 平均コスト = 0。
- total_batch = int (mnist.train.num_examples/batch_size)
- #すべてのバッチをループする
- iが範囲内(total_batch)の場合:
- batch_xs、batch_ys = mnist.train.next_batch(batch_size)
- # 最適化オペレーション(バックプロパゲーション)とコストオペレーション(損失値を取得するため)を実行します
- _, c = sess.run([オプティマイザ, コスト], feed_dict={x: batch_xs,
- y: batch_ys})
- # 平均損失を計算する
- 平均コスト += c / 合計バッチ
- # エポックステップごとにログを表示する
- (エポック+1) % display_step == 0の場合:
- 「エポック:」 、 '%04d' % (エポック+1)、 「コスト=」 、 "{:.9f}" .format(avg_cost)を出力します。
-
- 「最適化が完了しました!」と印刷します。
-
- # テストモデル
- 正しい予測 = tf.equal(tf.argmax(予測, 1), tf.argmax(y, 1))
- # 精度を計算する
- 精度 = tf.reduce_mean( tf.cast (correct_prediction, tf.float32))
- 「精度:」を印刷します。accuracy.eval({x: mnist.test.images, y: mnist.test.labels})
-
- # 結果 :
- エポック: 0001 コスト = 29.860467369
- エポック: 0002 コスト = 22.001451784
- エポック: 0003 コスト = 21.019925554
- エポック: 0004 コスト = 20.561320320
- エポック: 0005 コスト = 20.109135756
- エポック: 0006 コスト = 19.927862290
- エポック: 0007 コスト = 19.548687116
- エポック: 0008 コスト = 19.429119071
- エポック: 0009 コスト = 19.397068211
- エポック: 0010 コスト = 19.180813479
- エポック: 0011 コスト = 19.026808132
- エポック: 0012 コスト = 19.057875510
- エポック: 0013 コスト = 19.009575057
- エポック: 0014 コスト = 18.873240641
- エポック: 0015 コスト = 18.718575359
- エポック: 0016 コスト = 18.718761925
- エポック: 0017 コスト = 18.673640560
- エポック: 0018 コスト = 18.562128253
- エポック: 0019 コスト = 18.458205289
- エポック: 0020 コスト = 18.538211225
- エポック: 0021 コスト = 18.443384213
- エポック: 0022 コスト = 18.428727668
- エポック: 0023 コスト = 18.304270616
- エポック: 0024 コスト = 18.323529782
- エポック: 0025 コスト = 18.247192113
- 最適化が完了しました!
- (10000, 784)
- 精度 0.9206
ここでちょっとしたエピソードを。ノートブックで ipython ノートブックを開くと、GPU リソースを占有しています。以前から常に開いているノートブックがあり、それが GPU リソースを占有していたため、Accuracy を計算するときに「InternalError: Dst tensor is not initialized.」が発生していた可能性があります。その後、github でこの問題を見つけました: InternalError: Dst tensor is not initialized. GPU メモリに関連する問題であることは間違いないので、tf.device('/cpu:0') を追加して Accuracy ステップを CPU にプルして計算するようにしましたが、OOM 問題が再び発生しました。nvidia-smi を実行すると、python スクリプトが 3g を超えるビデオ メモリを占有していることがわかりました。それを強制終了して復元しました。以前は、10000*784 の float がビデオ メモリをバーストさせる可能性があると文句を言っていましたが、それは自分の問題であることが判明しました。 ここで、ロジスティック回帰モデルは多変量分類に使用されるソフトマックス関数であり、大まかに言えば、10 の中から *** 予測確率 *** を最終分類として選択することを意味します。 実際、基本的な tensorflow を説明するのは簡単ではありません。文法コースについては、基本的なドキュメントを読むことができます。後で、古典的で興味深い tensorflow コード アプリケーションをいくつか見つけて見ていきます。結局のところ、「コードを見せてください」というのは、プログラマーが持つべき姿勢です。 [この記事は51CTOコラムニスト「Big Uのテクノロジー教室」によるオリジナル記事です。転載については、WeChatパブリックアカウント(ucloud2012)を通じて著者にご連絡ください] この著者の他の記事を読むにはここをクリックしてください |