学習ノートTF 029:ステップアップボリュームネットワークを実現

10074 ワード

クラシックデータセットCIFAR-1060000枚32 x 32カラー画像、トレーニングセット50000枚、テストセット10000枚.10種類を表示し、各種類の画像6000枚を表示します.airplance、automobile、bird、cat、deer、dog、frog、horse、ship、truck.何の重なりもない.CIFAR-100100類表記.深い学習の父Geofrey Hintonと学生Alex Krizhevsky、Vinod Nairが収集した.画像は80 million tiny imagesデータセットに由来する.State-of-the-art 3.5%誤り率、GPU訓練十数時間.詳細Benchmarkとランキングはhttp://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html .LeCun,既存のボリュームニューラルネットワークはCIFAR−10データセットの問題を解決した.
Alex cuda-convnetモデルの修正により,3000個のbatch,各batch 128個のサンプル,73%の正解率に達した.GTX 1080単グラフィックス数十秒モデルトレーニング時間.CPUがかなり遅い.学習速度decay(学習速度を一定時間ごとに低下させる比率)を100 k batchで組み合わせると、正確率は86%に達することができる.モデル訓練パラメータは100万個,予測4則演算総量は2000万回であった.weightsをL 2正規化する.画像の反転、ランダムカットなどのデータが強化され、より多くのサンプルが作成されます.各ボリューム−最大プール化層の後にLRN層を用いてモデル汎化能力を増強した.
TensorFlow Modelsライブラリをダウンロードし、CIFAR-10データクラスを提供します.git clone https://github.com/tensorflow/models.git.models/tutorials/image/cifar10.
共通ライブラリ、NumPy、time、TensorFlow Modelsが自動的にCIFAR-10データクラスをダウンロード、読み込みします.
batch_の定義size,トレーニングホイール数max_steps、CIFAR-10データのデフォルトパスをダウンロードします.
初期化weight関数、tfを定義する.truncated_normalは正規分布初期化ウェイトを遮断する.WeightにL 2 lossを加え、L 2を正規化します.フィーチャーを減らしたり、重要でないフィーチャーの重みを罰したりして、フィーチャーが多すぎるとフィットしすぎます.正規化は、罰のフィーチャーウェイトを見つけるのに役立ちます.ある特徴を使用するには、lossの代価が必要です.L 1は正則的に疎フィーチャーを製造し,ほとんどの不要フィーチャーウェイトは0に設定される.L 2は正則的に特徴重みが大きすぎず、特徴重みが平均的である.wl制御L 2 lossサイズ、tf.nn.l2_loss関数はweight L 2 loss,tfを計算する.Multiply L 2 lossにwlを乗じて、最後にweight lossを得ます.tf.add_to_collection weight lossはcollection lossesに統一的に存在し,ニューラルネットワーク全体のloss使用を計算する.
cifar 10クラスでデータセットをダウンロードし、デフォルトの場所に解凍、展開します.
cifar 10_でinputクラスdistorted_Inputs関数は、フィーチャー、labelを含むトレーニングデータを生成し、パッケージtensorに戻り、batch_を生成するたびに実行します.size数量サンプル.Data Augmentation(データ強化)、cifar 10_input.distorted_inputs関数、ランダム水平反転(tf.image.random_flip_left_right)、ランダムカット24 x 24ピクチャ(tf.random_crop)、ランダム輝度コントラスト設定(tf.image.random_brightness、tf.image.random_contrast)、データ標準化(tf.image.per_image_whitening、データ減平均値、分散を除き、データゼロ平均値、分散1)を保証します.より多くのサンプルが得られ,ノイズがあり,1枚の画像サンプルが複数の画像になり,サンプル量が拡大し,精度が向上した.データ拡張操作にCPU時間がかかる、distored_Inputsは16個の独立したスレッドでタスクを加速し,関数内部にスレッドプールを生成し,TensorFlow queueでスケジューリングする.
cifar 10_でinput.inputs関数はテストデータを生成し、画像の真ん中の24 x 24サイズのブロックを切り取り、データを標準化する.
入力データplaceholderx、フィーチャー、labelを作成します.placeholderデータサイズの設定、batch_sizeはネットワーク構造を定義するために使用し、データサイズの最初の値サンプル数は予め設定する必要があり、Noneを設定することはできません.データサイズのピクチャサイズは24 x 24、トリミング後サイズ、カラーチャネル数3、カラーRGB 3チャネルである.
最初のボリューム層、variable_with_weight_loss関数はボリュームコアパラメータの初期化を作成します.ボリュームコアサイズ5 x 5,3色チャネル,64ボリュームコア,weight初期化関数標準差0.05を設定した.wl(weight loss)は0に設定します.tf.nn.conv 2 d関数対入力データimage_holder畳み込み操作、ステップstride設定1、paddingモードSAME、bias初期化0、畳み込み結果にbiasを加え、ReLUで関数を非線形化する.サイズ3 x 3、ステップ2 x 2最大プール化層でデータを処理し、サイズ、ステップが一致せず、データの豊富性を増加させる.tf.nn.lrn関数,LRN,処理結果.
LRNはAlexからCNNでImageNet試合論文に参加した.LRNは生物神経系側抑制機構を模倣し,局所ニューロン活動に対して競合環境を作成し,応答が大きい値が相対的に大きくなり,他のフィードバックが小さいニューロンを抑制し,モデル汎化能力を増強した.LRN使用後CNN Top 1エラー率は1.4%減少した.LRNは無上限境界活性化関数ReLUに有用であり,近傍の複数のボリュームコア応答(Response)から大きなフィードバックを選択し,固定境界に適さず過大値活性化関数Sigmoidを抑制できる.
第2のボリューム層、ボリュームコアサイズ第3次元入力チャネル数64、bias値全初期化0.1.まずLRN層処理を行い,さらに最大プール化層を用いた.
全接続層は、前の2つの積層層の出力結果を全てflatten,tf.reshape関数は各サンプルを1次元ベクトルに変えます.get_shape関数は、データの平坦化長を取得します.variable_with_weight_loss関数は全接続層weightを初期化し,ノード384を隠し,正規分布標準差0.04,bias 0.1を初期化した.非ゼロweight loss値0.04を設定し、すべてのパラメータがL 2正則に拘束され、フィットしすぎないようにします.ReLUは関数の非線形化をアクティブにします.
2番目の全接続層は、ノード192を隠す.
最後のレイヤは、まずweightを作成し、正規分布標準差は前の隠しレイヤノード数の逆数を設定し、L 2正則を計上しない.Softmax操作は計算loss部分に置いてあり,inferenceに対してsoftmax処理を出力する必要がなく,最終分類を得ることができ,inference出力の各種数値サイズを直接比較することができる.
ボリュームニューラルネットワーク全体が入力から出力プロセスに移行する.CNNを設計し、畳み込み層、プール化層、全接続層の分布と順序を手配し、超パラメータ設定、Trickで使用する.ボリュームニューラルネットワーク構造:conv 1:ボリューム層とReLUアクティブ関数pool 1:最大プール化norm 1:LRN conv 2:ボリューム層とReLUアクティブ関数norm 2:LRN pool 2:最大プール化local 3:全接続層とReLUアクティブ関数local 4:全接続層とReLUアクティブ関数logits:モデルInference出力結果
CNN lossを計算します.softmax計算とcross entropy loss計算を合わせて、tf.nn.sparse_softmax_cross_entropy_with_logits.tf.reduce_meanはcross entropyの平均値、tfを計算する.add_to_collection cross entropy lossを全体losses collectionに追加します.tf.add_n全体losses collectionのすべてのlossを合計し、cross entropy lossと後の2つの接続層weight L 2 lossを含む最終lossを得た.Logitsノード、label_placeholderはlossの子供数を伝え,最終lossを得る.
オプティマイザはAdam Optimizer,学習速度1 e-3を選択する.
tf.nn.in_top_k関数は出力結果top k精度を求め、デフォルトtop 1、出力分類最高クラス精度を求める.
tf.InteractiveSessionはデフォルトsessionを作成し、すべてのモデルパラメータを初期化します.
画像データ強化スレッドキューを起動し、16スレッドが加速します.
訓練する.各stepトレーニングプロセス、session runメソッドはimages_を実行します.train、 labels_train計算、batchトレーニングデータを取得し、train_に転送opとloss計算.各step時間を記録し、10ステップごとに現在のloss、毎秒訓練サンプル数、訓練batchデータ時間を計算し、訓練プロセス全体を監視する.GTX 1080、毎秒1800個のサンプルを訓練し、batch_size 128、batchあたり0.066 s.ロスlossは、4.6300ステップの訓練を開始して1.0に下がった.
モデルテストセットの精度を評価します.テストセット10000サンプル、固定batch_を使用size、batchごとにテストデータを入力します.すべてのサンプル評価済みbatch数を計算します.各stepはセッションrunメソッドでimages_を取得するtest、labels_testのbatch、top_を実行k_op計算モデルbatch top 1は正確なサンプル数を予測する.すべての予測の正しい結果をまとめ、すべてのテストサンプルの予測の正しい数を求める.
印刷精度評価結果計算.
73%の精度.増加し続けるmax_stepsは,期待精度が徐々に増加した.max_stepsは大きく,学習速度減衰(decay)のSGD訓練で86%に近い.L 2正則,LRN層はモデル精度を向上させ,フレーム汎化性を向上させた.
データ強化(Data Augmentation)は、単一の図に複数のコピーを追加し、画像の利用率を高め、画像構造の学習がフィットしすぎることを防止する.画像自体の性質を利用して、画像冗長情報量が大きく、異なるノイズを製造し、識別することができる.ニューラルネットワークはノイズを克服して正確に識別し,汎化性がより良い.深い学習は十分に多様な本を提供すれば、正確率は持続的に向上することができる.規模が大きいほど複雑なニューラルネットワークモデルは,精度レベルが高いほど,より多くのデータ訓練を必要とする.Alex cuda-convnetテストの結果、CIFAR-10は、データが強化されず、エラーが最低17%に低下し、データが強化され、エラー率が11%に低下した.
import cifar10,cifar10_input
import tensorflow as tf
import numpy as np
import time
max_steps = 3000
batch_size = 128
data_dir = '/tmp/cifar10_data/cifar-10-batches-bin'
def variable_with_weight_loss(shape, stddev, wl):
    var = tf.Variable(tf.truncated_normal(shape, stddev=stddev))
    if wl is not None:
        weight_loss = tf.multiply(tf.nn.l2_loss(var), wl, name='weight_loss')
        tf.add_to_collection('losses', weight_loss)
    return var
def loss(logits, labels):
    labels = tf.cast(labels, tf.int64)
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits=logits, labels=labels, name='cross_entropy_per_example')
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
    tf.add_to_collection('losses', cross_entropy_mean)
    return tf.add_n(tf.get_collection('losses'), name='total_loss')

###
cifar10.maybe_download_and_extract()
images_train, labels_train = cifar10_input.distorted_inputs(data_dir=data_dir,
                                                        batch_size=batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data=True,
                                            data_dir=data_dir,
                                            batch_size=batch_size)                                                  
#images_train, labels_train = cifar10.distorted_inputs()
#images_test, labels_test = cifar10.inputs(eval_data=True)
image_holder = tf.placeholder(tf.float32, [batch_size, 24, 24, 3])
label_holder = tf.placeholder(tf.int32, [batch_size])
#logits = inference(image_holder)
weight1 = variable_with_weight_loss(shape=[5, 5, 3, 64], stddev=5e-2, wl=0.0)
kernel1 = tf.nn.conv2d(image_holder, weight1, [1, 1, 1, 1], padding='SAME')
bias1 = tf.Variable(tf.constant(0.0, shape=[64]))
conv1 = tf.nn.relu(tf.nn.bias_add(kernel1, bias1))
pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
                   padding='SAME')
norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75)
weight2 = variable_with_weight_loss(shape=[5, 5, 64, 64], stddev=5e-2, wl=0.0)
kernel2 = tf.nn.conv2d(norm1, weight2, [1, 1, 1, 1], padding='SAME')
bias2 = tf.Variable(tf.constant(0.1, shape=[64]))
conv2 = tf.nn.relu(tf.nn.bias_add(kernel2, bias2))
norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75)
pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
                   padding='SAME')
reshape = tf.reshape(pool2, [batch_size, -1])
dim = reshape.get_shape()[1].value
weight3 = variable_with_weight_loss(shape=[dim, 384], stddev=0.04, wl=0.004)
bias3 = tf.Variable(tf.constant(0.1, shape=[384]))
local3 = tf.nn.relu(tf.matmul(reshape, weight3) + bias3)
weight4 = variable_with_weight_loss(shape=[384, 192], stddev=0.04, wl=0.004)
bias4 = tf.Variable(tf.constant(0.1, shape=[192]))                                      
local4 = tf.nn.relu(tf.matmul(local3, weight4) + bias4)
weight5 = variable_with_weight_loss(shape=[192, 10], stddev=1/192.0, wl=0.0)
bias5 = tf.Variable(tf.constant(0.0, shape=[10]))
logits = tf.add(tf.matmul(local4, weight5), bias5)
loss = loss(logits, label_holder)
train_op = tf.train.AdamOptimizer(1e-3).minimize(loss) #0.72
top_k_op = tf.nn.in_top_k(logits, label_holder, 1)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
tf.train.start_queue_runners()
###
for step in range(max_steps):
    start_time = time.time()
    image_batch,label_batch = sess.run([images_train,labels_train])
    _, loss_value = sess.run([train_op, loss],feed_dict={image_holder: image_batch, 
                                                     label_holder:label_batch})
    duration = time.time() - start_time
    if step % 10 == 0:
        examples_per_sec = batch_size / duration
        sec_per_batch = float(duration)

        format_str = ('step %d, loss = %.2f (%.1f examples/sec; %.3f sec/batch)')
        print(format_str % (step, loss_value, examples_per_sec, sec_per_batch))

###
num_examples = 10000
import math
num_iter = int(math.ceil(num_examples / batch_size))
true_count = 0  
total_sample_count = num_iter * batch_size
step = 0
while step < num_iter:
    image_batch,label_batch = sess.run([images_test,labels_test])
    predictions = sess.run([top_k_op],feed_dict={image_holder: image_batch,
                                             label_holder:label_batch})
    true_count += np.sum(predictions)
    step += 1
precision = true_count / total_sample_count
print('precision @ 1 = %.3f' % precision)

参考資料:『TensorFlow実戦』
お金を払うコンサルティング(150元/時間)を歓迎して、私の微信:qingxingfengzi