本文根據最近學習TensorFlow書籍網絡文章的情況,特將一些學習心得做了總結,詳情如下.如有不當之處,請各位大拿多多指點,在此謝過。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、虛擬空間、營銷軟件、網站建設、東海網站維護、網站推廣。一、相關性概念
1、卷積神經網絡(ConvolutionNeural Network,CNN)
19世紀60年代科學家最早提出感受野(ReceptiveField)。當時通過對貓視覺皮層細胞研究,科學家發現每一個視覺神經元只會處理一小塊區域的視覺圖像,即感受野。20世紀80年代,日本科學家提出神經認知機(Neocognitron)的概念,被視為卷積神經網絡最初的實現原型。神經認知機中包含兩類神經元:S-cells和C-cells。S-cells用來抽取特征,對應我們現在主流卷積神經網絡中的卷積核濾波操作;C-cells用來抗形變,對應現在的激活函數、大池化(Max-Pooling)等操作。
一般情況下,卷積神經網絡由多個卷積層構成,每個卷積層通常會進行如下操作:
(1) 圖像通過多個不同的卷積核的濾波,并加偏置(bias),提取出局部特征,每一個卷積核會映射出一個新的2D圖像。
(2) 將前面卷積核的濾波處理結果,進行非線性的激活函數處理。目前最常見的是使用ReLU函數,之前Sigmoid函數應用較多。
(3)多激活函數處理的結果再進行池化操作(即降采樣,例如:將4*4的圖片降為1*1的圖片),一般會使用大池化,保留最顯著特征,并提升模型畸變容忍能力。
這幾個步驟就構成了最常見的卷積層,也可以再加上一個LRN(LocalResponse Normalization,局部響應歸一化層)層,現在非常流行的Trick還有BatchNormalization等。
2、池化層
3、卷積核尺寸
4、神經網絡算法相關特性
4.1、優點
(1)可以高效提取特征。
當我們面對一個分類任務時,傳統的機器學習算法,一般要首先明確feature和label,然后拿數據取“喂”訓練模型并保存,最后測試模型的準確性。這就需要我們確定好特征,當特征數目很少就無法精確進行分類而引起欠擬合;當特征數目很多,又會在分類過程中太過于看重某個特征引起分類錯誤,產生過擬合。而神經網絡則不需要做大量的特征工程,可以直接把數據“灌”進去而讓其自身訓練,自我“修正”,即可達到預期效果。 (2)數據格式更加簡易
利用傳統的機器學習解決分類問題時,數據不能直接“灌”進去的,需要對數據進行一些處理,譬如量綱的歸一化,格式的轉化等等,然而在神經網絡里卻不需要額外對數據做過多的處理。
(3) 參數數目的少量性
同樣在面對一個分類問題時,利用傳統機器學習SVM來做的話,需要涉及核函數,懲罰因子,松弛變量等等參數,而這些不同的參數組合會對模型效果產生不一樣的影響,想要迅速而又準確的得到最適合模型的參數,需要對相關理論知識有深入研究,但對于一個基本的三層神經網絡來說(輸入-隱含-輸出),只需要初始化時給每一個神經元上隨機的賦予一個權重w和偏置項b,在訓練過程中,這兩個參數就會不斷的修正,調整到最優質,使模型的誤差最小。所以從這個角度來看,我們的工作效率會更佳。 4.2、缺點
如果我們加深我網絡層,每一個網絡層都增加神經元數量,則參數的個數將是M*N(m為網絡層數,N為每層神經元個數),這樣一來參數很多,引起模型復雜化,就更加不好調參,進而會更加容易導致過擬合。另外,從神經網絡的反向傳播的過程來看,梯度在反向傳播時,不斷的迭代會導致梯度越來越小,引起梯度趨近于0(梯度消失),梯度消失就使得權值無法更新,這個神經元的存在就毫無意義,很難導致收斂。尤其是在圖像領域,直接使用最基本的神經網絡,是不合理的。
二、卷積神經網絡基本原理
1、基本闡述
現在有一圖像,其尺寸大小是1000像素*1000像素且設定為黑白圖像,也就是只有一個顏色通道,則一張圖片就要100萬個像素點,輸入數據維度也是100萬維。如果連接的現在隱含層大小也是同樣大小(100萬個隱含節點),最后將產生100萬*100萬即一億萬個連接。僅僅一個全連接(FullConnected Layer),就有一萬億連接的權重需要去訓練,目前看,顯然是不劃算不現實。
通過局部連接(LocalConnect)方法優化解決:由于每一個感受野只接受一小塊區域的信號,且這一小塊區域內的像素是互相關聯的,每一個神經元不需要接收全部像素點的信息,只需要接收局部的像素點作為輸入,而后將所有這些神經元收到的局部信息綜合起來,就可以得到全局信息。假設局部感受野大小是10*10,即每個隱含節點只與10*10個像素點相連,現在只需要10*100萬即1億個連接。
現在隱含層每一個節點都與10*10的像素相連,即每一個隱含層節點都擁有100個參數。假設我們的局部連接方式是卷積操作,即默認每一個隱含節點的參數都完全一樣,這樣參數從1億降為100。不管圖像大小是多大,一律都是這個10*10=100個參數,即卷積核尺寸,顯然卷積核對縮小參數數量貢獻非常大、意義非凡。因此,此時,我們不需要再擔心有多少隱含節點或者圖片多大,參數量只跟卷積核的大小有關,即所謂的權值共享。
總結:卷積神經網絡要素是局部連接(LocalConnection)、權值共享(WeightSharing)和池化層(Pooling)中的降采樣(Down-Sampling)。其中,局部連接和權值共享降低了參數量,訓練復雜度被大大下降、過擬合被減輕。同時,權值共享還賦予了卷積網絡對平移的容忍性,而池化層降采樣則進一步降低了輸出參數量,并賦予模型對輕度形變的容忍性,提供了模型的泛化能力。
2、LeNet5
1994年,大名鼎鼎的LeNet5誕生,作為最早的深層卷積神經網絡之一,推動了深度學習的發展。自1998年開始,在多次成功迭代之后,由Yann LeCun完成的開拓性成果被命名為LeNet5。LeCun認為,可訓練參數的卷積層是一種利用少量參數在圖像的多個位置上提取相似特征的有效方式,這和直接把每個像素作為多層神經網絡的輸入不一樣。像素不應該被使用在輸入層,因為圖像具有很強的空間相關性,而使用圖像中獨立的像素直接作為輸入則利用不到這些相關性。筆者認為,這些內容比較重要。
在當時,LeNet5的特性如下:
(1)每個卷積層包含三個部分:卷積、池化和非線性激活函數;
(2)使用卷積提取空間特征;
(3)降采樣(Subsample)的平均池化層(AveragePooling);
(4)雙曲正切(Tanh)或S型(Sigmoid)的激活函數;
(5)MLP作為最后的分類器;
(6)層與層之間的稀疏性連接減少計算復雜度。
三、TensorFlow 實現簡單的卷積網絡
1、簡要說明
這里使用的數據集依然是MNIST,使用兩個卷積層加一個全連接層構建一個簡單但非常有代表性的卷積神經網絡,預計準確率約為99.2%左右。
2、實現過程
#載入MNIST數據集,創建默認的Interactive Session。 from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) sess = tf.InteractiveSession() #定義初始化函數,以便重復使用創建權重、偏置、卷積層、池化層。 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') #在設計卷積神經網絡結構之前,定義輸入的placeholder,x是特征,y_是真實Label。 #由于卷積神經網絡會使用到空間結構信息,所以,需要將1D的輸入向量轉為2D圖片結構,即從1*784的形式轉換為原始的28*28結構。 #因為只有一個顏色通道,所以最終尺寸為[-1,28,28,1],其中‘-1'代表樣本數量不固定,'1'代表顏色通道數量。 x = tf.placeholder(tf.float32, [None, 784]) y_ = tf.placeholder(tf.float32, [None, 10]) x_image = tf.reshape(x, [-1,28,28,1]) #定義第一個卷積層。 #先使用前面函數進行初始化,包括weights和bias。其中[5,5,1,32]代表卷積核尺寸為5**5,1個顏色通道,32個不同的卷積核。 W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) h_pool1 = max_pool_2x2(h_conv1) #定義第二個卷積層。 #基本與第一個卷積層一樣,只是其中的卷積核數量變成64. W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) h_pool2 = max_pool_2x2(h_conv2) 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.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) #為了減輕過擬合,使用一個Dropout層,其用法是通過一個placeholder傳入keep_prob比率來控制。 keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 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) #定義損失函數cross_entropy,這里選擇Adam優化器。 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) #繼續定義評測準確率操作。 correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #開始訓練過程。 tf.global_variables_initializer().run() 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.0}) print("step %d, training accuracy %g"%(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}))
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章名稱:TensorFlow實戰之實現卷積神經網絡的實例講解-創新互聯
地址分享:http://vcdvsql.cn/article18/csiedp.html
成都網站建設公司_創新互聯,為您提供手機網站建設、微信公眾號、微信小程序、虛擬主機、定制網站、企業網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯