1. 程式人生 > >OpenCL與CNN篇四:CNN從入門到使用

OpenCL與CNN篇四:CNN從入門到使用

  1. 文中比較重要的引用了幾個篇部落格,開篇給與博主感謝
  2. 記錄我從零到實現一個具體CNN網路中最有用的知識乾貨
  3. 以細節為切入點,分享我對CNN網路的簡潔
  4. 本文致力於讓你一篇文章理解CNN的具體實現與訓練方法
  5. 涉及理論不一一追述背景,主要講解其如何應用
  6. 開源的優秀CNN程式碼很多,我選擇的入門可能不是最棒的,但對我是最容易理解的

開始

一、神經網路與卷積

1、如果你不瞭解神經網路,這篇 CNN筆記:通俗理解卷積神經網路 夠了。
2、如果你不瞭解神經網路,這篇 CNN筆記:通俗理解卷積神經網路 也夠了。
3、看黑板標重點,看完文章請確保理解:卷積、池化(取樣)、全連線
4、這一條只是單純地給上文的博主點10個贊。。。。。。。。。

二、一個簡單的CNN結構

1、首先我們需要了解一個數據集MINST,剛去搜了一篇介紹比較詳細的部落格MNIST資料集解析,不過程式碼是Python如果不懂請選擇忽略,看他關於MINST的介紹就好。不過你也可以先跳過這步,這只是輸入資料,並不關乎我們的CNN構架。
2、如果上文你瞭解了卷積,那麼現在可以給你介紹一個簡單的CNN手寫識別網路了。這也有一篇很好的部落格編寫C語言版本的卷積神經網路CNN之網路的總體結構,篇末有一份博主的C語言程式碼連線,純C語言的自己注意修改一下程式碼中載入的檔案路徑,執行起來不是很難。不過文章的配圖,和公式說明比較複雜,所以就只建議閱讀tostq的專欄的篇二(就是上一個連線)。
3、在此送一張我自己畫的圖,姑且稱為圖一


簡單的CNN網路

三、根據圖一而來的 正向計算

先說明一下本文采用的啟用函式Sigmoid(),表示式S(x)=1/[1+exp(x)]。它有一個很好的特性其導函式與其輸出有關,即S~(x)=S(x)[1S(x)]
在之後的文章裡我們用f(y)=y(1y)=S(x)[1S(x)]=S~(x) 表示啟用函式的導函式,文章內引用不再重複說明。

3.1、卷積層C1、C3的計算

ym(x,y)表示第m張輸出圖位置(x,y)的畫素資訊,bm表示偏置,Xp(x,y)示第p張輸入圖,Kpm(j,i)表示當前輸入圖與輸出圖之間的卷積核,W、H分別表示卷積核的寬、高。可以得到輸出圖每個畫素值的計算公式,如下:

ym(x,y)=S([pNiHjWXp(x+j,y+i)Kpm(j,i)]+bm)

這裡解釋多說一下卷積一般來說有三種:1、種卷積操作之後影象變大(原圖補充mapSize-1圈畫素);2、種卷積操作之後影象不變(原圖補充(mapSize-1)/2圈畫素);3、一種卷積操作之後影象減小(原影象大小不變)。
這裡採用第三種,上式中(i,j)範圍是[0,0]~[4,4],那麼(x+j,y+i)的範圍是[0,0]~[x+4,y+4]。所以如果輸入影象大小是12*12,那麼得到的輸出圖只有8*8 (inputSize-mapSize+1)。這也就是為什麼會有前兩種卷積拓展畫素的做法。

3.2、取樣層S2、S4的計算

如果看到這你已經知道了取樣的含義,那麼這將是最簡單的一部分實現。我想偷懶原諒我。在本文中的做法是每次從前一層互不重疊的取2*2矩陣並計算平均值。所以本文采樣層較之前一層邊界會縮小一半。

3.3、輸出層O5

由3.1和3.2得到取樣層S4以後,我們將S4的12張圖展開,可以得到12*4*4 =192個數據,由於資料規模相對較小,這裡採用全連線方式與輸出層O5連線。如圖一所示計算公式如下:

ym=S([pNXS4pWO5pm]+bm)

四、根據圖一而來的 誤差反向傳播

訓練時先有網路的輸出結果與輸入圖片的標籤對比,用一個合適的損失函式來度量訓練樣本的輸出損失,接著對這個損失函式進行優化求最小化的極值。損失函式優化極值求解的過程最常見的一般是通過梯度下降法來一步步迭代完成的。計算輸出誤差;得到輸出層O5的誤差,再經神經網路反向傳遞到各層,用於更新權值。用W表示權重,E表示損失函式,n表示第n輪更新迭代,η表示學習引數(可用來控制單次學習速率),u表示啟用函式的輸入,δ表示局域梯度。梯度下降法更新權重更新公式如下,姑且標記一下叫做公式一

Wn+1=WnΔWnun=WnXn+bΔWn=ηEnWn=ηEnununWn=ηδnXn

這裡我們採用平方誤差代價函式,誤差能量定義為實際輸出與理想輸出的差,我們討論的多類問題,共c類,N個訓練樣本:

EN=12n=1Nk=1c(tnkynk)2

這裡tnk表示第n個樣本對應標籤的第k維。ynk表示第n個樣本對應的網路輸出的第k個輸出。
值得說明的是所有層的δ,無論是單個值矩陣,其資料規模是和對應層的輸出大小相同的。比如O5層有10個,C3層有12*8*8個,S2層有6*24*24個。這一點在之後的計算中你會很容易明白。

4.1、輸出層O5的δ計算

因為在全部訓練集上的誤差只是每個訓練樣本的誤差的總和,所以這裡我們先考慮對於一個樣本的BP。對於第n個樣本的誤差,表示為:

En=12k=1c(tn

相關推薦

OpenCLCNNCNN入門到使用

文中比較重要的引用了幾個篇部落格,開篇給與博主感謝 記錄我從零到實現一個具體CNN網路中最有用的知識乾貨 以細節為切入點,分享我對CNN網路的簡潔 本文致力於讓你一篇文章理解CNN的具體實現與訓練方法 涉及理論不一一追述背景,主要講解其如何應用 開源的優秀CN

OpenCLCNNOpenCL基礎API介紹

本篇介紹幾個OpenCL基礎API,涉及平臺、裝置等初始化必備函式 其次介紹幾個關於緩衝區操作以及工作空間劃分的API 建議閱讀參考書籍,我的推薦是《OpenCL程式設計指南》和《OpenCL異構計算》,尤其是後者從實踐出發,更是適合上手。 本章節函式使用舉

springAOP源碼分析之適配器模式

voc extend frame odin work ava turned intercept @override MethodInterceptor AdvisorAdapter和Advice之間實現了適配器模式首先增加方法的執行時通過攔截器鏈進行執行的,而配置文件配置的

群暉(黑) 申請免費SSL證書以及用群暉套件搭建郵件服務器(可以收藏的)

智能 等待 默認項目 家用路由器 asq 地方 服務器搭建 復制 for 轉載的文章 群暉(黑) 篇四:申請免費SSL證書以及用群暉套件搭建郵件服務器 前言這個系列是關於群暉常用套件的使用記錄,前兩篇討論了監控中心,虛擬機,

JS 基礎()JS中的函式

目錄: 簡單介紹下關於JS函式使用過程中的一些情況。 一、函式的引數 1、呼叫函式時沒有提供足夠的引數,缺少的引數將會被underfined替代。 function add(a,b){ console.log("a:"+a); // a:1 c

效能調優之MySQLMySQL配置定位以及優化

一、CPU最大效能模式 cpu利用特點 5.1 最高可用4個核 5.5 最高可用24核 5.6 最高可用64核心 一次query對應一個邏輯CPU 你仔細檢查的話,有些伺服器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發現CPU的頻率竟然跟它標

Spark效能優化shuffle調優

Spark效能優化篇四:shuffle調優 shuffle調優 調優概述       大多數Spark作業的效能主要就是消耗在了shuffle環節,因為該環節包含了大量的磁碟IO、序列化、網路資料

SpringMVC4+thymeleaf3的一個簡單例項(form表單資料驗證)

關於表單資料驗證有很多中方法,這裡我僅介紹JSR303註解驗證。 注意在spring的配置檔案spring-mvc.xml中要有這句程式碼:<mvc:annotation-driven/>

【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之關於OneNote入庫處理以及稽核

namespace OnenoteOCRDemo { /// <summary> /// falg.xaml 的互動邏輯 /// </summary> public partial class falg : Window {

編寫C語言版本的卷積神經網路CNN之二CNN網路的總體結構

      上一節我們總體介紹專案並說明Minst手寫數字資料庫的使用,這一節我們將重點介紹CNN網路總體結構。 上圖我們已經非常熟悉,其為Yann在1998年介紹的LeNet-5網路的結構,其剛被提出,就在學術和工業領域上得到廣泛應用,而本文的CNN卷積網路卻是如下

演算法資料結構+一點點ACM入門到進階吐血整理推薦書單(珍藏版)

轉載自某大佬部落格 https://pymlovelyq.github.io/2018/10/06/Algorithm/ 前言:技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總

【AC軍團週報(第四周)第一】線段樹入門到入土【4】(未完成)

本文章連載AC軍團週報 -> 線段樹 : 從入門到入土【4】 前言 從前有一位遠古神犇,他彙集各大資料結構之精華,經過艱苦卓絕的研究,終於煉製成了一種新的,更簡潔的,更快的線段樹——zkw線段樹 (大霧) 四、zkw線段樹基礎 我們已經學過了線段樹的基礎了,相信大家已經熟練掌握線段樹大概的樣

演算法資料結構+一點點ACM入門到進階吐血整理推薦書單pdf附網盤下載連結

前言: 技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

gtk學習總結GTK入門到放棄,三天包教包會

今天花了一些時間複習之前學習過的gtk,感覺東西光學不用忘得好快啊,在這做個之前學過的內容的備份,希望對大家有用,也希望大家不要從入門到放棄。文中有些程式碼例子可能來自《GTK從入門到精通》吧,我不記得了,或者叫《GTK中文教程》,忘記了,總之,這是一個學習筆記,希望不觸及任何人的利益,起到共享

推薦 Xilinx 工程師實用教程 Vivado 入門到精通

更多精彩內容,請微信搜尋“FPGAer俱樂部”關注我們Vivado 設計套件賽靈思面向未來十年可程式設計器件而打造的以IP和系統為中心的SoC 增強型新一代開發環境,該環境從頭開始構建,致力於解決系統級整合和實現過程中的生產力瓶頸問題關 於 本 課 程本課程由賽靈思高階戰略應

目標檢測演算法理解R-CNN到Mask R-CNN

  因為工作了以後時間比較瑣碎,所以更多的時候使用onenote記錄知識點,但是對於一些演算法層面的東西,個人的理解畢竟是有侷限的。我一直做的都是影象分類方向,最近開始接觸了目標檢測,也看了一些大牛的論文,雖然網上已經有很多相關的演算法講解,但是每個人對同一個問題的理解都不太一樣,本文主

由淺入深CNN中卷積層轉置卷積層的關系

更多 deep 每次 展開 大禮包 位移 入門 ssg 得出 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由forrestlin發表於雲+社區專欄 導語:轉置卷積層(Transpose Convolution Layer)又稱反卷積層或分數卷積層,在

CNN經典模型GoogLeNet(Inception v1到v4的演進)

2014年,GoogLeNet和VGG是當年ImageNet挑戰賽(ILSVRC14)的雙雄,GoogLeNet獲得了第一名、VGG獲得了第二名,這兩類模型結構的共同特點是層次更深了。VGG繼承了LeNet以及AlexNet的一些框架結構(詳見  大話CNN經典模型:VG

由淺入深CNN中卷積層轉置卷積層的關係

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 導語:轉置卷積層(Transpose Convolution Layer)又稱反捲積層或分數卷積層,在最近提出的卷積神經網路中越來越常見了,特別是在對抗生成神經網路(GAN)中,生成器網路中上取樣部分就出現了轉置卷積層,用於恢復減少的維數。那麼,轉

【深度學習】8CNN卷積神經網路sklearn資料集實現數字識別

前言:這個程式碼是自己閒暇無事時候寫的。 因為CNN卷積神經網路用MNIST資料集、sklearn資料集程式碼很多部分都很相似,這一篇就不附詳細說明,原始碼最下。CNN卷積神經網路的工作原理,請詳情參考——【深度學習】5:CNN卷積神經網路原理、MNIST資料