生活随笔
收集整理的這篇文章主要介紹了
卷积神经网络原理及实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
卷積神經網絡的主要結構是卷積層+池化層,該算法在圖像上有較好的效果
小知識:圖片有彩色圖片和黑白圖片,顏色都是有RGB三種顏色調和而成,所以彩色圖片有三層通道,黑白圖片有一層通道
咱們拿黑白圖片說事:
簡單來講一個圖片可以看作是一個矩陣24*24的,來一個卷積核( 這個是自己指定大小數值隨機的小矩陣,假如2*2),與前面那個24*24的相乘,先與24*24左上角2*2的小矩陣相乘,得出一個數值作為這個過程結果矩陣的左上角數值,之后卷積和往右移動(移動的不長stride自己設置一般設置1或2),不斷重復之間操作(卷積核小矩陣從圖片的左上角一直滑動到右下角),這個過程叫做一次卷積過程,這個過程得到的結果是一個矩陣,為了降低維度,采用池化操作,一般采用均值池化或最大池化,假如你采取2*2平均池化,前面的卷積結果為4*4 ,2*2池化的意思就是在4*4的左上角2*2當中取均值當作結果的左上角結果,右上角2*2矩陣的均值作為結果的右上角值,左下角和右下角同理,如果采用最大值池化就是取最大值不是取均值;假如池化得到的結果是2*2,之后用tf.reshape給它變成flat,就是變成1維的( 原來是2*2,這回編程1*4),之后作為全連接神經網絡的輸入得到分類結果
這里面主要學習的參數就是卷積核,不斷通過反向傳遞學習卷積核里面參數,知道結果收斂或達到實現設定好的閾值,上面說的只是進行一個卷積池化操作而已,還可以在后面再添加卷積池化操作,之后連接全連接層
比較詳細的解釋可以參考帖子:
https://blog.csdn.net/laingliang/article/details/53073591
https://blog.csdn.net/laingliang/article/details/53073591
https://blog.csdn.net/qq_33414271/article/details/79337141
代碼:
#encoding='utf-8'????"""?????????Description:以cifar10_input數據為例,?????????cifar數據和代碼下載地址:git?clone?https://github.com/tensorflow/model.git?????????代碼下載/model/tutorials/image/CIFAR10文件夾即是操作區域,建一個.py文件?????????.py文件里面代碼寫上:?????????#encoding='utf-8'?????????import?cifar10?????????cifar10.maybe_download_and_extract()?????????運行文件,即可獲取數據?"""????import?cifar10_input??import?tensorflow?as?tf??import?numpy?as?np????batch_size?=?128??data_dir?=?'/tmp/cifar10_data/cifar-10-batches-bin'??print("begin")????images_train,labels_train?=?cifar10_input.inputs(eval_data?=?False,???????????????????????????????????????????????????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)??print("begin?data")????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):??????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')????def?avg_pool_6x6(x):??????return?tf.nn.avg_pool(x,ksize=[1,6,6,1],strides=[1,6,6,1],padding='SAME')????x?=?tf.placeholder(tf.float32,[None,24,24,3])??y?=?tf.placeholder(tf.float32,[None,10])????w_conv1?=?weight_variable([5,5,3,64])??b_conv1?=?bias_variable([64])????x_image?=?tf.reshape(x,[-1,24,24,3])????h_pool1?=?max_pool_2x2(tf.nn.relu(conv2d(x_image,w_conv1))+b_conv1)????w_conv2?=?weight_variable([5,5,64,64])??b_conv2?=?bias_variable([64])????h_pool2?=?max_pool_2x2(tf.nn.relu(conv2d(h_pool1,w_conv2))+b_conv2)????w_conv3?=?weight_variable([5,5,64,10])??b_conv3?=?bias_variable([10])????h_conv3?=?max_pool_2x2(tf.nn.relu(conv2d(h_pool2,w_conv3))+b_conv3)????h_pool3?=?avg_pool_6x6(h_conv3)??h_pool3_flat?=?tf.reshape(h_pool3,[-1,10])??y_conv?=?tf.nn.softmax(h_pool3_flat)????cross_entropy?=?-tf.reduce_sum(y*tf.log(y_conv))??train_step?=?tf.trainable_variables.AdamOptimizer(1e-4).minimize(cross_entropy)????correct_prediction?=?tf.equal(tf.argmax(y_conv,1),tf.argmax(y,1))??accuracy?=?tf.reduce_mean(tf.cast(correct_prediction,"float"))????sess?=?tf.Session()??sess.run(tf.global_variables_initializer())??tf.train.start_queue_runners(sess=sess)????for?i?in?range(15000):??????image_batch,label_batch?=?sess.run([images_train,labels_train])??????label_b?=?np.eye(10,dtype=float)[label_batch]????????train_step.run(feed_dict={x:image_batch,y:label_b},session=sess)????????if?i%200?==?0:??????????train_accuracy?=?accuracy.eval(feed_dict={x:image_batch,y:label_b},session=sess)????????print("step?%d,training?accuracy?%g"%(i,train_accuracy))??
總結
以上是生活随笔為你收集整理的卷积神经网络原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。