ソースコードのダウンロードアドレス: https://share.weiyun.com/a0c1664d334c4c67ed51fc5e0ac5f2b2 私は機械学習の初心者なので、これから始めようとしている人たちの役に立つことを願って、この記事を書いてマークしました。この記事では、環境のインストールから入門用機械学習プログラム MNIST デモの実行まで、機械学習の入門知識を紹介します。 [[222620]] コンテンツ: - 環境構築
- Tensorflowの動作メカニズムを理解する
- MNIST (手書き数字認識) ソフトマックス線形回帰
- MNIST 深層畳み込みニューラルネットワーク (CNN)
- ツール
- CPU & GPU & マルチGPU
- 学習教材
1 環境設定(Windows) - Python パッケージの管理と環境の分離を容易にするために、仮想環境 Anaconda をインストールします。
Anaconda3 4.2 https://www.anaconda.com/downloads には、Python 3.5 が付属しています。 - TensorFlow の分離された環境を作成します。 Anacondaをインストールした後、Anaconda Promptターミナルを開き、次のコマンドを実行します。
- conda create -n tensorflow python=3.5 #Python バージョン 3.5 で tensorflow という名前の仮想環境を作成します
- tensorflow をアクティブ化 #この環境をアクティブ化
- deactivate #現在の仮想環境を終了します。これは実行する必要はありません
CPUバージョン - pip install tensorflow #パッケージ管理を通じてインストール
- pip install whl-file #whl ファイルをダウンロードしてインストールします。tensorflow-cpu インストール パッケージ: http://mirrors.oa.com/tensorflow/windows/cpu/tensorflow-1.2.1-cp35-cp35m-win_amd64.whl、cp35 は python3.5 を指します
GPU バージョン。私のラップトップは NVIDIA グラフィック カードをサポートしているので、CUDA をインストールできます。GPU は CPU よりもはるかに高速ですが、ラップトップのビデオ メモリは大きくありません。小さなモデルでも実行できます。大規模なモデルは CPU を使用してローカルで実行し、Tesla プラットフォームでトレーニングすることをお勧めします。 注意: 正しい CUDA と cuDNN のバージョンの組み合わせを選択してください。Tensorflow がサポートしていない可能性があるため、最新バージョンをそのままインストールしないでください。 現在、Tensorflow は CUDA 9 と cuDNN 7 をサポートしています。以前のインストールでは CUDA 8 と cuDNN 6 のみがサポートされていたため、以下を使用しました。 CUDA8.1 https://developer.nvidia.com/cuda-80-ga2-download-archive cudnn 6 https://developer.nvidia.com/cudnn 、cudnn パッケージを解凍し、cuda インストールの対応するディレクトリ (C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0) にファイルを置きます。bin は bin に、include は include にそれぞれ対応し、bin ディレクトリを環境変数パスに追加します。 - pip install tensorflow-gpu #パッケージ管理からインストール
- pip install whl-file #http://mirrors.oa.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl
いくつかの Python ツール パッケージがインストールされています。必要なものだけをインストールし、pip install を使用します。それが機能しない場合は、ソースコードからコンパイルしてインストールします。 - (tensorflow) D:\> pip install opencv-python #opencv、tensoflow を仮想環境でインストール
- (tensorflow) D:\> pip install scipy #画像の読み取りと書き込み、scipy.misc.imread
- (tensorflow) D:\> pip install Pillow #PIL/Pillow、ここに落とし穴があります。バージョン 1.x で解析すると、圧縮された PNG 画像の透明チャネルの品質が低下します。
2 Tensorflowの動作メカニズムを理解する - ここにコードがあります。コメントに注意してください
- テンソルフローをtfとしてインポートする
- hello_world = tf.constant( 'Hello World!' , dtype=tf.string) #定数テンソル
- print(hello_world) #この時点で、hello_worldはテンソルであり、演算の出力を表します
- #出力: Tensor( "Const:0" , shape=(), dtype=string)
- hello = tf.placeholder(dtype=tf.string, shape=[None])#プレースホルダーテンソル、sess.run中に割り当てられた値
- world = tf.placeholder(dtype=tf.string, shape=[なし])
- hello_world2 = hello+world #加算演算テンソル
- 印刷(hello_world2)
- #出力: Tensor( "add:0" , shape=(?,), dtype=string)
- #数学
- x = tf.Variable([1.0, 2.0]) #変数テンソル、変数。
- y = tf.定数([3.0, 3.0])
- mul = tf.multiply(x, y) #点乗算演算テンソル
- #論理的
- rgb = tf.constant([[[255], [0], [126]]], dtype=tf.float32)
- logical = tf.logical_or(tf.greater(rgb,250.), tf.less(rgb, 5.))#論理演算、rgb>250または<5 の位置はTrueとしてマークされ、その他はFalseになります
- where = tf.where ( logical, tf.fill(tf.shape(rgb),1.), tf.fill(tf.shape(rgb),5.)) # Trueには 1 が割り当てられ、 Falseには 5 が割り当てられます
- # デフォルトのイメージを起動します。
- # sess = tf.Session()
- tf.Session()を sessとして使用:
- sess.run(tf.global_variables_initializer())# 変数の初期化
- result = sess.run(hello_world) #フェッチ、テンソル演算結果を取得
- print(result, result.decode(), hello_world.eval())#`t.eval()` は`tf.get_default_session().run(t)` を呼び出すためのショートカットです。
- # out : b 'Hello World!' Hello World! b 'Hello World!' # プレフィックス'b' はバイト文字列形式を示し、文字列形式にデコードされます
- print(sess.run(hello, feed_dict={hello: [ 'Hello' ]}))
- #出力: [ 'こんにちは' ]
- print(sess.run(hello_world2, feed_dict={hello: [ 'Hello' ], world: [ ' World!' ]}))#フィード、プレースホルダーの割り当て
- #出力: [b 'Hello World!' ]
- 印刷(sess.run(mul))
- #出力: [ 3. 6.]
- print(sess.run(論理))
- # out : [[[ True ] [ True ] [ False ]]] #rgbが250より大きいか5より小さい位置はTrue 、それ以外はFalseとマークされます
- print(sess.run(どこ))
- # out : [[[ 1.] [ 1.] [ 5.]]] # Trueには1が代入され、 Falseには5が代入される
- # sess.close ()#sessはwithメソッドを使用して定義されていない場合は閉じる必要があります
- テンソル。演算の出力を表すハンドルですが、演算出力の結果は格納されません。出力結果は、tf.Session.run(Tensor) または Tensor.eval() を通じて演算プロセスが実行された後にのみ取得できます。 Tensor は、Operation の出力の 1 つへのシンボリック ハンドルです。Tensor は、その操作の出力の値を保持するのではなく、TensorFlow でそれらの値を計算する手段を提供します。
- Tensorflow 実行プロセス: 計算ロジックを定義し、グラフを構築 => セッションを通じて結果データを取得します。基本的な使い方についてはリンクをご覧ください。
3 MNIST(手書き数字認識)ソフトマックス線形回帰 MNIST は、手書きの数字のさまざまな画像を含むエントリーレベルのコンピューター ビジョン データセットです。 また、各画像にはその番号を示すラベルも含まれています。たとえば、上の 4 つの画像のラベルはそれぞれ 5、0、4、1 です。 データセットの画像サイズは 28 x 28 で、シングル チャネルのグレースケール画像です。保管スタイルは次のとおりです。 MNIST 手書き数字認識の目的は、手書き数字を含む 28x28 の画像を入力し、画像に含まれる数字を予測することです。 ソフトマックス線形回帰では、画像内の数字は N 通りの可能性があり、これは画像内の各ピクセルによって決まると想定します。 数字iの可能性を示し、すべての数字(0~9)の確率、つまりすべての数字の信頼度を計算し、最も確率の高い数字を予測値とします。 証拠の計算は次のとおりです。 で 重量を表します。 デジタルクラス i のオフセットを表し、j はピクセルの合計に使用される指定された画像 x のピクセルインデックス (0~28x28=784) を表します。つまり、画像内の各ピクセル値 x の重みの合計とバイアス b が、尤度値を取得するために使用されます。 ソフトマックスを導入する目的は、すべての可能性の合計が 1 になるように確率値を正規化することです。これは、これらの可能性を確率 y に変換します。 データ Xサンプルサイズ 28x28 = 784 Yサンプル、スタイルは次のとおりです 読む - tensorflow.examples.tutorials.mnistからinput_dataをインポートします
- mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot= True ) #合計 55000、one_hot メソッド、画像 x 形式は 1D 配列、サイズ 784
- batch_xs, batch_ys = mnist.train.next_batch(batch_size) #バッチで読み込む
グラフの構築 推論とは、入力 x から予測値 y を出力するまでの推論のプロセスです。 - x = tf.placeholder(tf.float32, [None, 784], name = "input" )#Noneはバッチサイズを決定することを意味します
- tf.variable_scope( "inference" ):#スコープを定義し、inference という名前を付けます
- W = tf.Variable(tf.zeros([784, 10])) #初期値は0、サイズは784x10
- b = tf.Variable(tf.zeros([10])) #初期値は0、サイズは10
- y = tf.matmul(x, W) + b #行列の乗算
損失損失関数、分類では一般にクロスエントロピーが使用されますが、ここではソフトマックスクロスエントロピーを使用します。クロスエントロピーは、2 つの確率分布間の差異情報を測定するために使用されます。クロスエントロピーの式は次のとおりです。 - tf.variable_scope( "loss" )を使用する場合:
- 損失 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y),名前= "損失" )
- #softmax クロスエントロピー式: z * -log(softmax(x)) + (1 - z) * -log(1 - softmax (x)) # x: ロジット、z: ラベル
損失を計算する方法は多数ありますが、最も一般的なものは、L1 損失、L2 損失、シグモイドクロスエントロピー、ジョイント損失、カスタム損失などです。 精度: 予測値が実際の値と同じである確率。行列乗算の出力 y 値は配列です。tf.argmax 関数は、データから最大要素の添え字を見つけることができます。予測値の最大添え字が真の値の最大添え字と一致していれば、正しいことになります。 - tf.variable_scope( "accuracy" )を使用する場合:
- 精度 = tf.reduce_mean( tf.cast (tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)), tf.float32), name = "精度" )
トレーニング: トレーニングの目的は、損失を最小限に抑え、予測値を実際の値に近づけることです。Tensorflow は、オプティマイザーを通じてこれを実現します。 y = Wx+b では、トレーニングの開始時に W と b に初期値(ランダムまたは 0)が割り当てられます。Optimizer による継続的な最適化の後、Loss は最小値に近づき、W と b は理想値に近づき続けます。 W と b を合わせると、合計 784x10+10 個のパラメータが存在します。 - train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(損失)
最小化機能: 損失を最小化するためにパラメータを更新します。これには、勾配の計算とパラメータの更新という 2 つのステップが含まれます。 - grad_var = compute_gradients(loss) # (勾配、変数) のペアを返す
- apply_gradients(grad_var) #パラメータ勾配の反対方向にパラメータを更新して損失を小さくする
GradientDescentOptimizer: 勾配降下アルゴリズムのオプティマイザー。Tensorflow は SGD (確率的勾配降下法) を実装します。欠点は、現在のバッチに依存し、変動が大きいことです。 その他の強化されたオプティマイザー: 参照リンク。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer ... セッション: Tensorflow は推論操作を実行するためにセッションを使用する必要があります。セッションを作成するには 2 つの方法があります。2 つの違いは、InteractiveSession が自身をデフォルトのセッションとして設定することです。デフォルトのセッションでは、tensor.eval() を実行できます。 - sess = tf.Session()
- セッション = tf.InteractiveSession()
次の方法でデフォルトのセッションを設定することもできます。 - sess.as_default()の場合: xx.eval()
- tf.Session()をsess: xx.eval()として使用
GPU 関連のセッション パラメータを設定します。 - sess_config = tf.ConfigProto(allow_soft_placement= True , log_device_placement= False )#GPU がない場合や GPU が不十分な場合にソフトウェア シミュレーションを許可する
- sess_config.gpu_options.allow_growth = True #ビデオメモリに動的に適用します。追加しないと、すべてのアプリケーションが適用され、他のトレーニング プログラムの実行が失敗します。
- #sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8 #ビデオメモリを比例して適用する
- sess = tf.InteractiveSession(config=sess_config)
ネットワークのトレーニング プロセスは反復的な (順方向 + 逆方向) プロセスです。フォワードアルゴリズムは、ネットワークの各層の出力を前方から後方に計算し、リバースアルゴリズムは、後方から前方にパラメータの勾配を計算し、パラメータを最適化して損失を削減します。プロセスは次のとおりです。 注: 効果を確認するには、ネットワーク損失と精度を定期的に出力します。突然の中断を防ぎ、復元するために、ネットワーク パラメータを定期的にキャッシュします。 モデルパラメータの保存と復元: チェックポイント: デフォルトの保存方法。 pb: モバイル用。 npz: 辞書の保存方法、{name: value}、numpy の保存方法。名前でパラメータを保存および復元します。保存および復元方法は独自に制御されており、選択的に保存および復元できます。近くのコードの [tools.py] の save_npz_dict および load_and_assign_npz_dict メソッドを参照してください。 - セーバー = tf.train.Saver(max_to_keep = 3、write_version = 2)
- save_path = saver.save(sess, FLAGS.out_model_dir+ '/model.ckpt' )#チェックポイントメソッド
- output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=[ 'output' ])#ネットワークで定義する必要がある出力ノード名を指定します。
- tf.gfile.FastGFile (FLAGS.out_model_dir+ '/mobile-model.pb' 、 mode= 'wb' )を fとして:
- f.write(output_graph_def.SerializeToString()) #pb メソッド
- tools.save_npz_dict(save_list=tf.global_variables(), name =FLAGS.out_model_dir+ '/model.npz' , sess=sess) #pnz メソッド
回復する: - #チェックポイント
- セーバー = tf.train.Saver(max_to_keep = 3、write_version = 2)
- モデルファイル=tf.train.latest_checkpoint(FLAGS.log_dir)
- モデルファイルの場合:
- saver.restore(sess, モデルファイル)
- #npz
- tools.load_and_assign_npz_dict( name =FLAGS.log_dir+ '/model.npz' , sess=sess)) は、ネットワーク内のパラメータ情報を出力します。ネットワークパラメータが正しいかどうかを確認するのに便利です。
- def print_all_variables(train_only= False ):
- train_onlyの場合:
- t_vars = tf.trainable_variables()
- print( " [*] トレーニング可能な変数を印刷する" )
- それ以外:
- t_vars = tf.global_variables()
- print( " [*] グローバル変数を印刷する" )
- enumerate(t_vars)のidx、vについて:
- print( " var {:3}: {:15} {}" .format(idx, str(v.get_shape()), v.name ) )
- 視覚化。 Tensorflow は、Tensorboard 可視化ツールを提供します。コマンドで Web サービスを開き、ブラウザで表示します。URL に http://localhost:6006 と入力します。
- tensorboard
- # トレーニングプロセス中に対応するログパスを指定し、関連情報を書き込む必要があります
- # 要約とライター関連のキーワードコードは添付ファイル [sample.py] を参照してください。
グラフの視覚化: トレーニングプロセスの視覚化: バッチ サイズ = 128、トレーニング セット、検証セット。損失が収束し、精度が向上していることがわかります。トレーニング セット曲線は現在のバッチの損失と精度を反映するため、バッチ サイズは比較的小さく、ジッターは大きくなります。検証セットはすべての画像でテストされ、曲線はより滑らかになります。 4 MNIST 深層畳み込みニューラルネットワーク (CNN) Softmax 線形回帰ネットワークでは、出力 y は入力 x の線形結合、つまり y = Wx+b となり、線形関係になります。多くの問題では、線形関係では解決が完了できません。ディープラーニングでは、多層畳み込みニューラル ネットワークを非線形活性化関数と組み合わせて、より複雑な非線形関係をシミュレートすることができ、その効果は単一の線形関係よりも優れていることがよくあります。まず、深層畳み込みニューラル ネットワーク (CNN) を使用して構築された MNIST 予測モデルを見て、次に各ネットワーク レイヤーを 1 つずつ紹介します。 - MNIST CNN 推論図。入力から出力まで、reshape、conv 畳み込み、pool プーリング、fc フル接続、およびドロップアウトという複数のネットワーク レイヤーがあります。元の画像データ x は下から上に向かって入力され、各レイヤーを順番に処理されて、各デジタル分類確率の予測出力 y が得られます。推論の結果は、反復トレーニングのために loss に転送されます。
AdamOptimizer オプティマイザーが使用されていることがわかります。 - Reshape は、2 次元データを 4 次元データに変更するなど、データの論理構造を変更します ([1, 784] => [1, 28, 28, 1])。ただし、データの格納内容は変更されません。ここで、データストレージに入力される手書き画像は1次元データであるため、[batch_size、height、width、channels]の形式に変換される。
- tf.name_scope( 'reshape' ): #scopeの場合
- 入力 = tf.reshape(入力、[-1, 28, 28, 1])
- #[batch_size, height, width,channels]、バッチサイズ=-1 は入力によって決定されることを意味します。
- #バッチサイズ=入力サイズ/(28x28x1)
- conv2d 畳み込みでは、畳み込みカーネル (黄色) に画像要素 (緑) を掛けて、出力要素の値 (赤) を累積します。画像の各チャネルは異なる畳み込みカーネルに対応し、チャネル内の畳み込みカーネル パラメータは共有されます。すべての入力チャネルはカーネルで乗算され、累積されて、出力のチャネル値が得られます。出力に複数のチャネルがある場合は、複数回繰り返され、カーネルも異なります。したがって、input_channel_count * output_channel_count 個の畳み込みカーネルが存在することになります。畳み込みカーネルは畳み込み層でトレーニングされます。
- def conv2d(x, W): #W: フィルター [カーネル[0], カーネル[1], in_channels, out_channels]
- tf.nn.conv2d(x, W, ストライド=[1, 1, 1, 1], パディング= 'SAME' )を返します。
tf.nn.conv2d: data_format: 入力データと出力データの論理構造、NHWC: バッチの高さと幅のチャネル。 NCHW: バッチ チャネルの高さの幅。一般的に使用される形式は NHWC です。一部の入力データでは、各チャネルのデータが個別に保存されるため、NCHW の方が適しています。 input: 入力。data_format=NHWC の場合、形状は batch、in_height、in_width、in_channels、Tensor です。 filter: 畳み込みカーネル、形状は filter_height、filter_width、in_channels、out_channels で、filter_height、filter_width の畳み込みカーネルは合計で in_channels*out_channels 個あります。入力および出力チャネルの数が多いほど、計算量が多くなります。 strides: ステップ サイズ、形状は 1、stride_h、stride_w、1、通常、stride_h と stride_w は等しく、畳み込みカーネルが毎回垂直方向と水平方向に実行するステップ数を示します。上記の GIF のストライドは 1 です。 padding: 畳み込み計算時にデータが揃っていない場合のパディング方法。VALID: 余分な部分を破棄します。SAME: 余分な部分を計算できるように両端に 0 を追加します。 出力: 出力、形状はバッチ、out_height、out_width、out_channels - 出力[b, i, j, k] =
- 合計_{di, dj, q} 入力[b, ストライド[1] * i + di, ストライド[2] * j + dj, q] *
- フィルター[di, dj, q, k]
- 畳み込みで使用される活性化関数。活性化関数は、何かを活性化するものではありません。ニューラル ネットワークでは、活性化関数の役割は、ニューラル ネットワークがより複雑な問題をより適切に解決できるように、ニューラル ネットワークにいくつかの非線形要素を追加することです。
tf.nn.relu は、畳み込み出力に対して非線形処理を実行する活性化関数です。その機能は次のとおりです。 他にはシグモイドがあります: タン: - プーリングには、最大プーリングと平均プーリングがあります。計算は畳み込み計算に似ていますが、畳み込みカーネルはありません。カーネルがカバーする範囲の最大値または平均値が計算されます。入力チャネルは出力チャネルに対応しており、多層累積はありません。入力チャネルと出力チャネルの数は同じで、出力の高さと幅はストライドによって異なります。
- is_max_poolの場合:
- x = tf.nn.max_pool(x, [1,カーネル[0],カーネル[1],1], ストライド=[1,ストライド[0],ストライド[1],1], パディング=パディング,名前= 'プール' )
- それ以外:
- x = tf.nn.avg_pool(x, [1,カーネル[0],カーネル[1],1], ストライド=[1,ストライド[0],ストライド[1],1], パディング=パディング,名前= 'pool' )
- ドロップアウトは、一部のデータをランダムに削除し、ネットワークがこれらの削除されたデータに対して正確な結果を生成するようにトレーニングできるようにします。これにより、ネットワークの適応性が高まり、過剰適合が減少します。
- x = tf.nn.dropout(x, keep_prob) #keep_probは比率を保持し、keep_prob=1.0はドロップアウトがないことを意味します
- BN (バッチ正規化)、バッチ正規化。これは Inference ではマークされておらず、デモでは使用されていませんが、ネットワークでは非常によく使用されるレイヤーでもあります。 BN は多くの場合、非線形マッピングの前に動作し、Conv の結果を正規化します。一般的な順序は、畳み込み -> BN -> 活性化関数です。
BN の利点: トレーニング速度の向上、損失収束の加速、ネットワークの適応性の向上、バックプロパゲーション プロセスにおける勾配消失と爆発の問題をある程度解決します。詳細についてはクリックしてください。 - FC(フルコネクション)は完全に接続されており、コアは行列乗算です
ソフトマックス線形回帰は FC です。 CNN では、完全な接続は最後の数層に現れることが多く、以前に設計された機能の加重合計を作成するために使用されます。 Tensorflow は対応する関数 tf.layers.dense を提供します。 - 次の図は、モデルでトレーニングする必要があるパラメータの形状と、各レイヤーの出力データの形状を示しています(batch_size = 1の場合)。関連するコードは添付ファイル[tool.py]にあります。目的は、構築したネットワーク構造が期待どおりであるかどうかを観察しやすくすることです。
データは、[1x784] -reshape-> [1x28x28x1] (batch_size、高さ、幅、チャネル) -conv-> [1x28x28x32] -pool-> [1x14x14x32] -conv-> [1x14x14x64] -pool-> [1x7x7x64] -fc-> [1x1024] -fc-> [1x10] (各数字の確率) で構成されています。 - トレーニング効果、詳細なコードは添付ファイル[cnn.py]を参照してください。
- インターネット上の視覚的な手書き認識のデモ、http://scs.ryerson.ca/~aharley/vis/conv/flat.html
- LeNet、AlexNet、VGG-Net、GoogLeNet、ResNet、U-Net、FPN などの CNN ファミリーのクラシック ネットワーク。これらは、ビルディング ブロックのように、基本的なネットワーク層要素 (上記で紹介) を積み重ねることによって構築されます。
以下に示すように、VGG は非常に有名な特徴抽出および分類ネットワークです。これは複数の層の畳み込みプーリング層で構成され、最終的に FC を使用して特徴融合を実行し、分類を実現します。多くのネットワークは、前の層の畳み込みプーリング層に基づいて特徴抽出を実行し、独自のビジネスを展開します。 5 ツール 【tool.py】は、添付ファイルにある、Tensorflow 二次カプセル化に基づくツールクラスです。利点は、将来プログラミングがより便利になり、コード構造がより見栄えが良くなることです。また、インターネット上にはTensorLayer、Keras、Tflearnなど、既製のオープンソースライブラリも存在します。自分でカプセル化する目的は、Tensorflow APIをより深く理解することであり、パラメータをトレーニングしてログを出力するかどうかなど、自分で作った方が制御性も高くなります。 次の図は、MNIST CNN ネットワークの推論コードです。 6 CPU & GPU & マルチ GPU - CPUの場合、TensorflowはデフォルトですべてのCPUに対して/cpu:0に設定され、デフォルトですべてのCPUを占有します。占有数はコードを通じて指定できます。
- sess_config = tf.ConfigProto(device_count={ "CPU" : 14}, allow_soft_placement= True , log_device_placement= False )
- sess_config.intra_op_parallelism_threads = 56
- sess_config.inter_op_parallelism_threads = 56
- sess = tf.InteractiveSession(config=sess_config)
- GPU、Tensorflow はデフォルトで /gpu:0 を占有しますが、デバイスを指定してコードが実行される GPU を決定できます。下
- tf.device( '/device:GPU:2' )を使用する場合:
- a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], 形状=[2, 3],名前= 'a' )
- b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], 形状=[3, 2],名前= 'b' )
- c = tf.matmul(a, b)
- #次のコード構成は、GPUが完全に占有されるのを防ぎ、可能な限り多くのメモリを使用します。
- sess_config = tf.ConfigProto(allow_soft_placement = True 、log_device_placement = False )
- sess_config.gpu_options.allow_growth =有効
- sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8
- sess = tf.InteractiveSession(config=sess_config)
GPU が複数ある場合は、ターミナルで次のコマンドを実行して、CUDA の可視 GPU ブロックを設定し、プログラムが使用する GPU を制御できます。 - CUDA_VISIBLE_DEVICES=2,3 をエクスポートする
- 複数の GPU を使用する場合、Tensorflow でのマルチ GPU プログラミングはかなり扱いにくく、ドキュメントは優れていますが、コードの記述が複雑になり、Caffe ほど優れていません。
Tensorflow では、複数の GPU の損失と勾配のマージを制御するために独自のコードを記述する必要があります。こちらが公式の例です。マルチ GPU プロジェクトも作成しました。添付のコード [tmp-main-gpus-unavailable.py] は参照として使用できますが、他のプロジェクトからのものであるため、ここでは利用できません。 7 学習教材 機械学習に関連するいくつかの情報を収集したので、皆さんと共有したいと思います。まだほんの一部しか見ていないので、まだ勉強中です... Google の最近の機械学習クラッシュコース https://developers.google.cn/machine-learning/crash-course/ml-intro スタンフォード大学オープンコース: 機械学習コース Andrew Ng http://open.163.com/special/opencourse/machinelearning.html 私は機械学習のブログが大好きです https://www.52ml.net/ 小雷機械学習ノート https://zhuanlan.zhihu.com/xiaoleimlnote Lilicao ブログ http://www.cnblogs.com/lillylin/ 猫と犬の知乎コラム https://zhuanlan.zhihu.com/alpha-smart-dog コンピュータビジョンと機械学習関連分野のソースコードの大規模なコレクション https://zhuanlan.zhihu.com/p/26691794 オブジェクト検出コレクション https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html#r-cnn 機械学習ノート https://feisky.xyz/machine-learning/ オリジナルリンク: https://cloud.tencent.com/developer/article/1058521 [この記事は51CTOコラムニスト「雲家コミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください] この著者の他の記事を読むにはここをクリックしてください |