日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensorflow学习(5.实际图片的读取以及lenet-5的搭建)

發布時間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow学习(5.实际图片的读取以及lenet-5的搭建) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前幾篇學習了常用的一些東西,今天這篇主要說明實際圖片讀入,以及網絡結構的搭建。在學習新的網絡時,一般都希望對網絡用于自己的項目,甚至于重新搭建一個網絡。今天看到一個不錯的文章,是lenet5的實現,而且使用的是MNIST的png圖片,很適合直觀的進行學習。網址鏈接是https://blog.csdn.net/Enchanted_ZhouH/article/details/76855108

本文先分析了LeNet-5模型的結構,然后基于LeNet-5模型寫了TensorFlow代碼實現mnist數字識別,代碼部分進行了詳細注解,目前也在學習階段,有錯誤歡迎指出,大家一起學習。

? ? ? ?LeNet-5模型結構圖如下圖:

? ? ? ?

? ? ? ?LeNet-5模型總共有7層。

? ? ? ?第一層:卷積層

? ? ? ?第一層卷積層的輸入為原始的圖像,原始圖像的尺寸為32×32×1。卷積層的過濾器尺寸為5×5,深度為6,不使用全0補充,步長為1。由于沒有使用全0補充,所以這一層的輸出的尺寸為32-5+1=28,深度為6。這一個卷積層總共有5×5×1×6+6=156個參數,其中6為偏置項參數個數,卷積層的參數個數只和過濾器的尺寸,深度以及當前層節點矩陣的深度有關。因為下一層節點矩陣有28×28×6=4704個節點,每個節點和5×5=25個當前層節點相連,所以本層卷積層總共有4704×(25+1)=122304個連接。

? ? ? ?第二層:池化層

? ? ? ?這一層的輸入為第一層的輸出,是一個28×28×6的節點矩陣。本層采用的過濾器大小為2×2,步長為2,所以本層的輸出矩陣大小為14×14×6。

? ? ? ?第三層:卷積層

? ? ? ?本層的輸入矩陣大小為14×14×6,采用的過濾器大小為5×5,深度為16,不使用全0補充,步長為1。這一層的輸出的尺寸為14-5+1=10,深度為16,即輸出矩陣大小為10×10×16。本層參數有5×5×6×16+16=2416個,連接有10×10×16×(5×5+1)=41600個。

? ? ? ?第四層:池化層

? ? ? ?本層的輸入矩陣大小為10×10×16,采用的過濾器大小為2×2,步長為2,本層的輸出矩陣大小為5×5×16。

? ? ? ?第五層:全連接層

? ? ? ?本層的輸入矩陣大小為5×5×16,在LeNet-5模型的論文中將這一層稱為卷積層,但是因為過濾器的大小就是5×5,所以和全連接層沒有區別,這里直接看成全連接層。本層輸入為5×5×16矩陣,將其拉直為一個長度為5×5×16的向量,即將一個三維矩陣拉直到一維空間以向量的形式表示,這樣才可以進入全連接層進行訓練。本層的輸出節點個數為120,所以總共有5×5×16×120+120=48120個參數。

? ? ? ?第六層:全連接層

? ? ? ?本層的輸入節點個數為120個,輸出節點個數為84個,總共有120×84+84=10164個參數。

? ? ? ?第七層:全連接層

? ? ? ?本層的輸入節點個數為84個,輸出節點個數為10個,總共有84×10+10=850個參數。

數據集的下載:http://pan.baidu.com/s/1eRG6TqU?密碼:uf4m

代碼方面我加了更多的注釋:

from skimage import io,transform import os import glob import numpy as np import tensorflow as tf#將所有的圖片重新設置尺寸為32*32 w = 32 h = 32 c = 1#mnist數據集中訓練數據和測試數據保存地址 train_path = "mnist/train/" test_path = "mnist/test/"#讀取圖片及其標簽函數 def read_image(path):label_dir = [path+x for x in os.listdir(path) if os.path.isdir(path+x)]#子文件目錄images = []labels = []for index,folder in enumerate(label_dir):#enumerate() 函數用于將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。for img in glob.glob(folder+'/*.png'):#獲取指定目錄下的所有圖片print("reading the image:%s"%img)image = io.imread(img)image = transform.resize(image,(w,h,c))images.append(image)labels.append(index)return np.asarray(images,dtype=np.float32),np.asarray(labels,dtype=np.int32)#array和asarray都可以將結構數據轉化為ndarray,但是主要區別就是當數據源是ndarray時,array仍然會copy出一個副本,占用新的內存,但asarray不會#讀取訓練數據及測試數據 train_data,train_label = read_image(train_path) test_data,test_label = read_image(test_path)#打亂訓練數據及測試數據 train_image_num = len(train_data) train_image_index = np.arange(train_image_num)#arange(start,stop, step, dtype=None)根據start與stop指定的范圍以及step設定的步長,生成一個 ndarray。 np.random.shuffle(train_image_index)#亂序函數,多維時只對一維亂序,說明見https://blog.csdn.net/jasonzzj/article/details/53932645 train_data = train_data[train_image_index]#亂序后的數據 train_label = train_label[train_image_index]test_image_num = len(test_data) test_image_index = np.arange(test_image_num) np.random.shuffle(test_image_index) test_data = test_data[test_image_index] test_label = test_label[test_image_index]#搭建CNN x = tf.placeholder(tf.float32,[None,w,h,c],name='x') y_ = tf.placeholder(tf.int32,[None],name='y_')def inference(input_tensor,train,regularizer):#第一層:卷積層,過濾器的尺寸為5×5,深度為6,不使用全0補充,步長為1。#尺寸變化:32×32×1->28×28×6with tf.variable_scope('layer1-conv1'):conv1_weights = tf.get_variable('weight',[5,5,c,6],initializer=tf.truncated_normal_initializer(stddev=0.1))conv1_biases = tf.get_variable('bias',[6],initializer=tf.constant_initializer(0.0))conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding='VALID')relu1 = tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases))#第二層:池化層,過濾器的尺寸為2×2,使用全0補充,步長為2。#尺寸變化:28×28×6->14×14×6with tf.name_scope('layer2-pool1'):pool1 = tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')#第三層:卷積層,過濾器的尺寸為5×5,深度為16,不使用全0補充,步長為1。#尺寸變化:14×14×6->10×10×16with tf.variable_scope('layer3-conv2'):conv2_weights = tf.get_variable('weight',[5,5,6,16],initializer=tf.truncated_normal_initializer(stddev=0.1))conv2_biases = tf.get_variable('bias',[16],initializer=tf.constant_initializer(0.0))conv2 = tf.nn.conv2d(pool1,conv2_weights,strides=[1,1,1,1],padding='VALID')relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases))#第四層:池化層,過濾器的尺寸為2×2,使用全0補充,步長為2。#尺寸變化:10×10×6->5×5×16with tf.variable_scope('layer4-pool2'):pool2 = tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')#將第四層池化層的輸出轉化為第五層全連接層的輸入格式。第四層的輸出為5×5×16的矩陣,然而第五層全連接層需要的輸入格式#為向量,所以我們需要把代表每張圖片的尺寸為5×5×16的矩陣拉直成一個長度為5×5×16的向量。#舉例說,每次訓練64張圖片,那么第四層池化層的輸出的size為(64,5,5,16),拉直為向量,nodes=5×5×16=400,尺寸size變為(64,400)pool_shape = pool2.get_shape().as_list()nodes = pool_shape[1]*pool_shape[2]*pool_shape[3]reshaped = tf.reshape(pool2,[-1,nodes])#第五層:全連接層,nodes=5×5×16=400,400->120的全連接#尺寸變化:比如一組訓練樣本為64,那么尺寸變化為64×400->64×120#訓練時,引入dropout,dropout在訓練時會隨機將部分節點的輸出改為0,dropout可以避免過擬合問題。#這和模型越簡單越不容易過擬合思想一致,和正則化限制權重的大小,使得模型不能任意擬合訓練數據中的隨機噪聲,以此達到避免過擬合思想一致。#本文最后訓練時沒有采用dropout,dropout項傳入參數設置成了False,因為訓練和測試寫在了一起沒有分離,不過大家可以嘗試。with tf.variable_scope('layer5-fc1'):fc1_weights = tf.get_variable('weight',[nodes,120],initializer=tf.truncated_normal_initializer(stddev=0.1))if regularizer != None:tf.add_to_collection('losses',regularizer(fc1_weights))fc1_biases = tf.get_variable('bias',[120],initializer=tf.constant_initializer(0.1))fc1 = tf.nn.relu(tf.matmul(reshaped,fc1_weights) + fc1_biases)if train:fc1 = tf.nn.dropout(fc1,0.5)#第六層:全連接層,120->84的全連接#尺寸變化:比如一組訓練樣本為64,那么尺寸變化為64×120->64×84with tf.variable_scope('layer6-fc2'):fc2_weights = tf.get_variable('weight',[120,84],initializer=tf.truncated_normal_initializer(stddev=0.1))if regularizer != None:tf.add_to_collection('losses',regularizer(fc2_weights))fc2_biases = tf.get_variable('bias',[84],initializer=tf.truncated_normal_initializer(stddev=0.1))fc2 = tf.nn.relu(tf.matmul(fc1,fc2_weights) + fc2_biases)if train:fc2 = tf.nn.dropout(fc2,0.5)#第七層:全連接層(近似表示),84->10的全連接#尺寸變化:比如一組訓練樣本為64,那么尺寸變化為64×84->64×10。最后,64×10的矩陣經過softmax之后就得出了64張圖片分類于每種數字的概率,#即得到最后的分類結果。with tf.variable_scope('layer7-fc3'):fc3_weights = tf.get_variable('weight',[84,10],initializer=tf.truncated_normal_initializer(stddev=0.1))if regularizer != None:tf.add_to_collection('losses',regularizer(fc3_weights))fc3_biases = tf.get_variable('bias',[10],initializer=tf.truncated_normal_initializer(stddev=0.1))logit = tf.matmul(fc2,fc3_weights) + fc3_biasesreturn logit#正則化,交叉熵,平均交叉熵,損失函數,最小化損失函數,預測和實際equal比較,tf.equal函數會得到True或False, #accuracy首先將tf.equal比較得到的布爾值轉為float型,即True轉為1.,False轉為0,最后求平均值,即一組樣本的正確率。 #比如:一組5個樣本,tf.equal比較為[True False True False False],轉化為float型為[1. 0 1. 0 0],準確率為2./5=40%。 regularizer = tf.contrib.layers.l2_regularizer(0.001) y = inference(x,True,regularizer) cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=y_) cross_entropy_mean = tf.reduce_mean(cross_entropy) loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses')) train_op = tf.train.AdamOptimizer(0.001).minimize(loss) correct_prediction = tf.equal(tf.cast(tf.argmax(y,1),tf.int32),y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#每次獲取batch_size個樣本進行訓練或測試 def get_batch(data,label,batch_size):for start_index in range(0,len(data)-batch_size+1,batch_size):slice_index = slice(start_index,start_index+batch_size)yield data[slice_index],label[slice_index]#創建Session會話 with tf.Session() as sess:#初始化所有變量(權值,偏置等)sess.run(tf.global_variables_initializer())#將所有樣本訓練10次,每次訓練中以64個為一組訓練完所有樣本。#train_num可以設置大一些。train_num = 10batch_size = 64for i in range(train_num):train_loss,train_acc,batch_num = 0, 0, 0for train_data_batch,train_label_batch in get_batch(train_data,train_label,batch_size):_,err,acc = sess.run([train_op,loss,accuracy],feed_dict={x:train_data_batch,y_:train_label_batch})train_loss+=err;train_acc+=acc;batch_num+=1print("train loss:",train_loss/batch_num)print("train acc:",train_acc/batch_num)test_loss,test_acc,batch_num = 0, 0, 0for test_data_batch,test_label_batch in get_batch(test_data,test_label,batch_size):err,acc = sess.run([loss,accuracy],feed_dict={x:test_data_batch,y_:test_label_batch})test_loss+=err;test_acc+=acc;batch_num+=1print("test loss:",test_loss/batch_num)print("test acc:",test_acc/batch_num)

這里和原博客中區別在于啟用了dropout,大家可以在代碼里找一下。

啟用dropout代碼結果如下:

其實沒有啟用的結果test accuracy在98.83%,應該是數據相對較多,dropout的啟用的神經元數過少的原因。如有錯誤望大家指正。這里還有一篇實現lenet5的文章,結構更加清晰,結果也更好:https://blog.csdn.net/qq_26499769/article/details/82917994

總結

以上是生活随笔為你收集整理的tensorflow学习(5.实际图片的读取以及lenet-5的搭建)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久久91 | 红桃视频网站 | 日本国产亚洲 | 乱色熟女综合一区二区三区 | mm1313亚洲国产精品无码试看 | 2018中文字幕在线观看 | 国产美女视频一区 | 成人午夜视频网站 | 午夜不卡视频 | 亚洲人成高清 | 秋霞在线观看秋 | 天天爽夜夜爽一区二区三区 | 亚洲综合性 | 区一区二区三 | 乌克兰少妇性做爰 | 成人啪啪18免费游戏链接 | 一区二区精品免费 | 丰满少妇在线观看bd | 国产精品区一区二区三 | 四虎影库在线播放 | 日韩欧美国产中文字幕 | 欧美一区二区三区激情 | 久久久久久久亚洲精品 | 特黄视频 | 亚洲精品中文字幕乱码三区91 | 狠狠欧美 | 在线日韩三级 | 色播五月激情五月 | 青娱乐自拍视频 | 日本不卡二区 | 91精品在线免费观看 | 日韩av在线一区二区 | 色丁香久久 | 精品日韩| 欧美性受xxxx| 小嫩嫩12欧美| 伊人夜色 | 精品爆乳一区二区三区无码av | 樱花影院电视剧免费 | 巨物撞击尤物少妇呻吟 | 久色婷婷| 免费啪| 日韩经典中文字幕 | 伊人一级片 | 一道本在线视频 | 国产高清在线观看视频 | 不卡的av在线播放 | 波多野结衣中文字幕在线 | 亚洲欧美另类国产 | 麻豆三级在线观看 | 这里只有精品视频 | 婷婷久久精品 | 老头把女人躁得呻吟 | 国产成人精品一区二区三区免费 | 日本大乳奶做爰 | 欧美视频一区二区在线观看 | 韩日中文字幕 | 成人在线免费高清视频 | 国产欧美日韩中文字幕 | 欧美高清不卡 | 91无套直看片红桃 | 少妇专区| 欧美区日韩区 | 91极品视频| 午夜免费片 | 日本αv| 欧美成人h | 啪视频网站 | 成人午夜电影网站 | 777米奇影视第四色 五月丁香久久婷婷 | 51国产在线 | 欧美激情精品久久 | 视色网站| 制服.丝袜.亚洲.另类.中文 | 国产超级av在线 | 在线中文字幕视频 | 国产1区2区3区中文字幕 | 中文字幕无线码 | 久草天堂 | 国模大胆一区二区三区 | 一级在线免费观看 | 成年视频在线播放 | 久久精品中文 | 日本一区二区三区在线视频 | 欧美激情网 | 日本美女视频一区 | 男女午夜啪啪 | 国产精品国产三级国产aⅴ无密码 | 制服丝袜中文字幕在线 | 狠狠爱天天干 | 午夜欧美在线 | 亚洲天堂自拍 | 国产精品视频在线播放 | 91成品人影院 | 理论片高清免费理伦片 | 国产精品免 | 亚洲黄色小视频 | 国产精品久久久 | 日本黄色不卡视频 |