《Tensorflow實戰》 cifar10進階卷積神經網路
阿新 • • 發佈:2019-01-10
#1.cifar10 資料集
CIFAR-10資料集包含10個類的60000張32x32的彩色影象,每個類有6000張影象.有50000張訓練影象和10000張測試影象.
圖如下:
#2.模型訓練
import cifar10 import cifar10_input import tensorflow as tf import numpy as np import time tf.reset_default_graph() max_steps = 3000 batch_size =128 data_dir ="/tmp/cifar10_data/cifar-10-batches-bin" def variable_with_weight_loss(shape,stddev,w1): var = tf.Variable(tf.truncated_normal(shape,stddev=stddev)) if w1 is not None: weight_loss = tf.multiply(tf.nn.l2_loss(var),w1,name="weight_loss") tf.add_to_collection("losses",weight_loss) return var ## 第一層卷積 步長為[1,1,1,1],掃過每一個畫素,然後通過池化層進行圖片縮小, ##得到灰度值最大的,特徵值最明顯的 #### 第一層卷積 #### weight1 = variable_with_weight_loss(shape=[5,5,3,64],stddev=5e-2,w1=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") #lRN層可以多個filter中挑選出最大的反饋,在區域性中建立競爭條件,增大反應較大值 norm1 = tf.nn.lrn(pool1,4,bias=0.1,alpha=0.001/9.0,beta=0.75) ##用封裝好的類distored_inputs產生所需要的資料和label tf.app.flags.DEFINE_string('f', '', 'kernel') 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) image_holder = tf.placeholder(tf.float32,[128,24,24,3]) label_holder = tf.placeholder(tf.int32,[128]) ##第二層卷積 weight2 = variable_with_weight_loss(shape=[5,5,64,64],stddev=5e-2,w1=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") ###全連線層,將卷積層flatten reshape = tf.reshape(pool2,[batch_size,-1]) dim = reshape.get_shape()[1].value weight3 = variable_with_weight_loss(shape=[dim,384],stddev=0.04,w1=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,w1=0.004) bias4 = tf.Variable(tf.constant(0.1,shape=[192])) local4 = tf.nn.relu(tf.matmul(local3,weight4)+bias4) ###logits weight5 = variable_with_weight_loss(shape=[192,10],stddev=1/192.0,w1=0.0) bias5 = tf.Variable(tf.constant(0.0,shape=[10])) logits = tf.add(tf.matmul(local4,weight5),bias5) # 計算損失函式 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") loss = loss(logits,label_holder) #優化器 train_op = tf.train.AdamOptimizer(1e-3).minimize(loss) 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)