1. 程式人生 > >tensorflow多層CNN代碼分析

tensorflow多層CNN代碼分析

其中 correct flow 表示 models input app 最大值 blog

tf,reshape(tensor,shape,name=None)
#其中shape為一個列表形式,特殊的一點是列表中可以存在-1。-1代表的含義是不用我們自己#指定這一維的大小,函數會自動計算,但列表中只能存在一個-1。
#思想:將矩陣t變為一維矩陣,然後再對矩陣的形式更改

2.

c = tf.truncated_normal(shape=[10,10], mean=0, stddev=1)  
#shape表示生成張量的維度,mean是均值,stddev是標準差,產生正態分布
#這個函數產生的隨機數與均值的差距不會超過標準差的兩倍

3.

from __future__ import
absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf import numpy as np import math import gzip import os import tempfile from tensorflow.examples.tutorials.mnist import input_data flags = tf.app.flags FLAGS = flags.FLAGS flags.DEFINE_string(
data_dir, /Users/guoym/Desktop/models-master, Directory for storing data) mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) x = tf.placeholder(tf.float32, [None, 784]) # 占位符 x_image=tf.reshape(x,[-1,28,28,1]) sess=tf.InteractiveSession() # 第一層 # 卷積核(filter)的尺寸是5*5, 通道數為1,輸出通道為32,即feature map 數目為32
# 又因為strides=[1,1,1,1] 所以單個通道的輸出尺寸應該跟輸入圖像一樣。即總的卷積輸出應該為?*28*28*32 # 也就是單個通道輸出為28*28,共有32個通道,共有?個批次 # 在池化階段,ksize=[1,2,2,1] 那麽卷積結果經過池化以後的結果,其尺寸應該是?*14*14*32 def weight_variable(shape): initial=tf.truncated_normal(shape,stddev=0.1) return tf.Variable(initial) def bias_variable(shape): initial=tf.constant(0.1,shape=shape) return tf.Variable(initial) def conv2d(x,w): ‘‘‘ tf.nn.conv2d的功能:給定4維的input和filter,計算出一個2維的卷積結果。 參數: input:[batch,in_height,in_width,in_channel] filter:[filter_height,filter_width,in_channel,out_channel] strides :一個長為4的list,表示每次卷積之後在input中滑動的距離 padding: SAME保留不完全卷積的部分,VALID ‘‘‘ return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding=SAME) def max_pool_2x2(x): ‘‘‘ tf.nn.max_pool進行最大值池化操作,avg_pool進行平均值池化操作 value:4d張量[batch,height,width,channels] ksize: 長為4的list,表示池化窗口的尺寸 strides:窗口的滑動值 padding: ‘‘‘ return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding=SAME) w_conv1=weight_variable([5,5,1,32])#卷積核的大小,輸入通道的數目,輸出通道的數目 b_conv1=bias_variable([32]) h_conv1=tf.nn.elu(conv2d(x_image,w_conv1)+b_conv1) h_pool1=max_pool_2x2(h_conv1) #第二層 #卷積核5*5,輸入通道為32,輸出通道為64 #卷積前為?*14*14*32 卷積後為?*14*14*64 #池化後,輸出的圖像尺寸為?*7*7*64 w_conv2=weight_variable([5,5,32,64])#卷積核的大小,輸入通道的數目,輸出通道的數目 b_conv2=bias_variable([64]) h_conv2=tf.nn.elu(conv2d(h_pool1,w_conv2)+b_conv2) h_pool2=max_pool_2x2(h_conv2) #第三層,全連接層,輸入維數是7*7*64,輸出維數是1024 w_fc1=weight_variable([7*7*64,1024]) b_fc1=bias_variable([1024]) h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64]) h_fc1=tf.nn.elu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1) keep_prob=tf.placeholder(tf.float32)#這裏使用了dropout,即隨機安排一些cell輸出值為0 h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob) #第四層 輸入1024維,輸出10維 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) y_=tf.placeholder(tf.float32,[None,10]) cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1])) train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)#使用adam優化 correct_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))#計算準確度 accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) sess.run(tf.initialize_all_variables()) for i in range(20000): batch=mnist.train.next_batch(50) if i%100==0: train_accuracy=accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1}) print (i,train_accuracy) train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5}) print("test accuracy %g"%accuracy.eval(feed_dict={ x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

tensorflow多層CNN代碼分析