Tensorflow実戦-CNNネットワークMnist識別

3016 ワード

このノートはTensorflowの中国語のドキュメントを読む時に作ったノートで、私が記録する必要があると思うところだけを記録して、その他の問題はみんなが評論することができて、私たちは共同で検討します.
1、重み初期化このモデルの重みは、初期化時に対称性を破り、0勾配を避けるために少量のノイズを加えるべきである.対称性を破り、0勾配を避ける.ReLUニューロンを用いているので,ニューロンノード出力が0に一定であるという問題(dead neurons)を回避するために,より小さな正数でバイアス項を初期化するのが好ましい.
#w , 0.1
def weight_variable(shape): 
	initial = tf.truncated_normal(shape, stddev=0.1) 
	return tf.Variable(initial)
#b 0.1
def bias_variable(shape): 
	initial = tf.constant(0.1, shape=shape) 
	return tf.Variable(initial)

2、各層の実現
2.1、畳み込み層+プール化層
各層には、具体的な状況に応じて、ボリューム層、プール化層、dropout層などが含まれる.
例:ボリューム+プール化+フル接続+softmax
W_conv1 = weight_variable([5, 5, 1, 32]) 
b_conv1 = bias_variable([32])

[5,5,1,32]:ボリュームコアのサイズが5*5、深さが1、数が32、すなわち第1層出力が32 feature mapであることを示す.(32):対応するb値も32個である.
入力したピクチャがこれらのパラメータと演算できるように,入力に対してreshapeを行う必要がある.
x_image = tf.reshape(x, [-1,28,28,1])

[-1,28,28,1]:最初の-1は管理されず、初期値を付与するだけで、ピクチャのサイズが28*28(height*width)であることを示し、最後に入力ピクチャの深さを示す.このとき,入力ピクチャとボリュームコアの準備ができており,次にボリューム計算を行う.
def conv2d(x, W): 
	return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x): 
	return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

この文はtensorflowのconv 2 d関数を実際に呼び出し,データとボリュームコアを入力し,通常のニューラルネットワークにおけるmatmul関数と同様にバイアスを加えて活性化関数に入る.
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

前のステップの出力に対してpoolling操作を行います.
h_pool1 = max_pool_2x2(h_conv1)

第2層:依然としてボリューム層+プール化層
W_conv2 = weight_variable([5, 5, 32, 64]) 
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2)

2.2、全接続層は2回のボリュームプール化を経て、画像サイズは:28*28-』32枚14*14-』64枚7*7になり、サイズ変化を引き起こしたのはすべてプール化過程であり、ボリューム化過程でpadding属性がSAMEであるため、つまりボリューム前後の画像サイズを一定に保つ.このとき、1024ニューロンの全接続層を導入しました.この層は7*7*64要素を接続する必要がある場合、初期化パラメータは次のとおりです.
W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
b_fc1 = bias_variable([1024])

ここで、前のプール化層から出力されたデータにはreshapeが必要であることに注意してください.
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) 

次に計算を行います
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

2.3.Dropout層モデルのオーバーフィットを減らすために、トレーニング中にdropoutを開き、テスト中に閉じ、placeholderを宣言してdropoutの程度を制御する.注:TensorFlowのtf.n n n.dropout操作はニューロンの出力を遮断するほか,ニューロン出力値のscaleを自動的に処理する.だからdropoutを使うときはscaleを考えなくてもいいです.
keep_prob = tf.placeholder("float") 

上階(全接続層)、dropout層に入ります
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

2.4、出力層、ソフトmax
W_fc2 = weight_variable([1024, 10]) 
b_fc2 = bias_variable([10]) 
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

心得:実は深さの学习の原理を理解するだけで、フレームワークは异なって、ただ各フレームワークの下の関数を熟知するだけで、上手になります.