CNNは手書きで0-9の数字認識を実現する.

4009 ワード

CNNが手書きで識別する
このネットワークは、2つの畳み込み層、2つの全連結層、畳み込み層で使用される活性化関数は、レlu関数であり、第1層の全接続層はレlu関数を使用して活性化され、第2層の神経ネットワークはソフトマックス関数を使用して活性化される.まずコードを貼り付けてください.
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("abc",one_hot=True)

X=tf.placeholder(dtype=tf.float32,shape=[None,784])
Y=tf.placeholder(dtype=tf.float32,shape=[None,10])

#Conv1
W_conv1=tf.Variable(tf.truncated_normal(shape=[5, 5, 1, 32],stddev=0.1))
X_image=tf.reshape(X,shape=[-1,28,28,1])

h_conv1=tf.nn.relu(tf.nn.conv2d(X_image,W_conv1,strides=[1, 1, 1, 1],padding="SAME"))
h_pool1=tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

#Conv2
W_Conv2=tf.Variable(tf.truncated_normal(shape=[5, 5, 32, 64],stddev=0.1))
h_conv2=tf.nn.relu(tf.nn.conv2d(h_pool1,W_Conv2,strides=[1, 1, 1, 1],padding="SAME"))
h_pool2=tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

#DenseLayer1
W_fc1=tf.Variable(tf.truncated_normal(shape=[7 * 7 * 64, 1024],stddev=0.1))
h_pool2=tf.reshape(h_pool2,shape=[-1,7*7*64])
h_fc1=tf.nn.relu(tf.matmul(h_pool2,W_fc1))

#      dropout
keep_drop=tf.placeholder(dtype=tf.float32)
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob=keep_drop)

#DenseLayer2
W_fc2=tf.Variable(tf.truncated_normal(shape=[1024,10],stddev=0.1))
h_fc2=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2))

cross_entropy = -tf.reduce_sum(Y * tf.log(h_fc2))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(h_fc2, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "double"))

init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(10000):
        batch_xs,batch_ys=mnist.train.next_batch(100)
        sess.run(train_step,feed_dict={X:batch_xs,Y:batch_ys,keep_drop:0.5})
        if i % 100 == 0:
            train_accuracy = sess.run(accuracy,feed_dict={X: batch_xs, Y: batch_ys, keep_drop: 1.0})
            print("step %d, training accuracy %f" % (i, train_accuracy))
データセットは私達が使っているのはやはりtenssorflowが持っているmnistデータセットです.損失関数交差エントロピー-y*log(y_)yはラベル内の値を表します.y_予測の値を表します.最適化器`で使用されているAdamOptimizer()最適化器は、これまでとは違って、今回のネットワークではいくつかの過当適合の知識と、どのようにフィッティングを予防するかという意味が必要です.主な関数tf.nn.co.1 nv 2 d(input,filter,stride s,padding,useudunn=None,name=None)
最初のパラメータinput:畳み込みの入力画像が必要であることを指します.これはTensorであり、「batch、inuheight、inuwidth、inuchanels」というshopを持っています.具体的な意味は「トレーニング時のbatchの写真の数、写真の幅、画像のチャンネル数」です.
第二のパラメータfilter:CNN中の畳み込み核に相当し、Tensorであることが要求されています.「filteruheight,filter_width,inuchanels,outCannels」というshopを持っています.チャンネルとは、パラメータinputの第四次元のことです.
3番目のパラメータstrides:畳み込み時の画像の1次元毎のステップサイズは、1次元のベクトルであり、長さ4
第四のパラメータpadding:stringタイプの量は、「SAME」しかないです.「VALLID」の一つは、この値が異なる畳み方を決定しました.
5番目のパラメータ:use_クドゥンうむgpu:bookタイプは、cudnnを使って加速しますか?デフォルトはtrueです.
結果はTensorに戻ります.この出力はfeature mapと言います.shopは相変わらず「batch、height、width、chanels」という形です.
paddingには二つの異なる値があります.「SAME」"Vaild"は、簡単に言うと、strideの下では、画像は十分なペースではないかもしれません.SAMEは0を追加しています.情報を失わないようにします.Vaildは一部の情報を廃棄します.filterのパラメータの中でout_chanelsはあなたを代表して何枚のfeature mapを出力しますか?chanelsは前の階の出力と関係があります.例えば、私のW_です.conv 1私のin_chanelsは1です.私のinputは2次元の写真です.conv 2のin_chanelsは32です.私の第1層の畳み込み出力は32枚の特徴図ですか?だから私の写真は2段の畳込み層に進んだ後に64枚の特徴図になります.私は全接続の第一層を定義する時、私のマトリックス次元は[7*7*64,1024]です.私は1024の神経ユニットを持つ全接続です.64枚の7*7のfeature mapを接続しています.もう一つのポイントは、tf.reshpe()の中で、ある次元の大きさの上に-1と書いてありますが、その次元は-1ではなく、これは計算された大きさを意味します.例えば、x.shape=[1024,1]y.shape=tf.reshape(x、[-1,512])というように、-1は2.y.shape=[2,512]を表しています.
第1層のConvを経て積算した後、28 x 28のfeature map 32枚を出力します.pool層を経て14 x 14になるfeature map 32枚
2層目のConvを通して畳み込んだ後、14 x 14のfeature map 64枚を出力します.pool層を経て7 x 7になるfeature map 64枚
tf.nn.dropoutという関数は正規化を実現するという意味で、深さ学習ではフィッティング現象が発生した可能性があります.簡単に言えばフィッティングの関数がいいです.しかし、このようにフィッティングした素晴らしい関数は一般化できません.だから私のコードの中で、正規化を使ってフィッティングを防止しました.簡単に言えば、いくつかのニューロンをランダムに消去して、ネットに接続するパラメータを少なくして、こうすればフィッティングを予防することができます.