色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CNN大致框架!如何組裝構成CNN?

深度學習自然語言處理 ? 來源:深度學習自然語言處理 ? 作者:云不見 ? 2020-08-28 09:44 ? 次閱讀

本文重點知識點:

CNN的大致框架

卷積層

池化層

卷積層和池化層的實現

CNN的實現

CNN可視化介紹

如有細節處沒有寫到的,請繼續精讀《深度學習入門:基于Python的理論與實現》,對小白來說真的是非常好的深度學習的入門書籍,通俗易懂。(書中的例子主要是基于CV的)
一、CNN大致框架

神經網絡:就是組裝層的過程。

CNN出現了新的層:卷積層、池化層。

Q:如何組裝構成CNN?

全連接層:用Affine實現的:Affine-ReLU (Affine仿射變換 y = xw+b),如下為基于全連接層的5層神經網絡。

ReLU也可替換成Sigmoid層,這里由4層Affine-ReLU組成,最后由Affine-Softmax輸出最終結果(概率) 常見的CNN:Affine-ReLU 變 Conv-ReLU-(Pooling),如下為基于CNN的五層神經網絡。

Q:全連接層有什么問題嘛?為什么要改進為Conv層?

全連接層“忽視”了數據的形狀,3維數據被拉平為1維數據;形狀因含有重要的空間信息:①空間臨近的像素為相似的值,相距較遠的像素沒什么關系;②RBG的各個通道之間分別有密切的關聯性等;③3維形狀中可能隱藏有值得提取的本質模式。

而卷積層可以保持形狀不變。可以正確理解圖像等具有形狀的數據。

特征圖:輸入、輸出數據
二、卷積層 2.1 卷積運算

輸入特征圖與卷積核作乘積累加運算,窗口以一定的步長滑動,得到輸出特征圖,也可以加偏置(1*1)

卷積核(濾波器)相當于全連接層中的權重。 卷積完后,偏置將應用于所有數據

2.2 填充(padding)
向輸入數據的周圍填入固定的數據(比如0等) 填充的目的:調整輸出的大小。擴大輸入特征圖,得到大一些的輸出。一般填充為0。 為什么要調整輸出的大小?因為比如輸入(4×4),卷積核為(3×3),得到輸出為(2×2),隨著層的加深,卷積完的輸出越來越小,直到輸出變1以后將無法再進行卷積運行。為了避免這樣的情況發生,需要用到填充,使輸出至少不會減小。

2.3 步幅(stride) 用途:指定濾波器的間隔。 步幅增大,輸出減小;填充增大,輸出增大。 計算輸出的大小:

其中:

(OH,OW) 輸出大小

(H,W) 輸入大小

(FH,FW) 濾波器大小

P 填充

S 步幅

注:式(7.1)中最好可以除盡。if無法除盡,需報錯。或者向最接近的整數四舍五入,不進行報錯而繼續運行。 2.4 三維數據的卷積運算 (通道方向,高,長):比二維數據多了一個:通道方向,特征圖增加了 (Channel,height,width) (C,H,W)

方塊思維,上下兩張圖是一個意思。

輸入數據和濾波器的通道數是保持一致的。 每個通道分別卷積計算出值,再將各通道的值相加得到最終的一個輸出值。 這樣只能得到一個通道數的輸出,怎樣使得輸出也多通道訥?

應用多個濾波器(權重),比如FN個。如下圖所示。

濾波器變四維,一個濾波器對應一個輸出特征圖。還可追加偏置(FN,1,1) 作為4維數據,濾波器按(output_channel, input_channel, height, width) 的順序書寫。 比如,通道數為 3、大小為 5 × 5 的濾波器有20個時,可以寫成(20, 3, 5, 5)。 不同形狀的方塊相加時,可以基于NumPy的廣播功能輕松實現(1.5.5節)。 2.5 批處理

目的:實現數據的高效化,打包N個數據一起處理。即將N次處理匯總為一次

3維——> 4維,即(C,H,W) ——> (N,C,H,W)


三、池化層

目的:縮小H,W方向上的空間的運算。比如將2 × 2區域集約成1個元素來處理,縮小空間大小。

Max池化:獲取最大值的運算 一般設置:池化的窗口大小和步幅設定成相同的值。比如這里都是2。 在圖像識別中,主要用Max池化。 池化層的特征:

沒有要學習的參數

通道數不發生變化,輸入3張,輸出也是3張;

對微小的位置變化具有魯棒性(健壯),即輸入數據發生微小偏差時,池化也可以返回相同的結果;即池化能吸收輸入數據的偏差。


四、Conv層和Pooling層的實現 4.1 4維數組

例如:隨機生成一個四維數據(10,1,28,28) 10個通道數為1,高長為28的數據

>>> x = np.random.rand(10, 1, 28, 28) # 隨機生成10個通道數為1,高長為28的輸入數據>>> x.shape(10,1,28,28)

>>> x[0].shape # (1, 28, 28) x[0]:第一個數據(第一個方塊)>>> x[1].shape # (1, 28, 28) x[1]:第二個數據>>> x[0, 0] # 或者x[0][0] 第一個數據的第一個通道>>>x[1,0]#或者x[1][0]第二個數據的第一個通道 4.2 基于im2col的展開

問題:實現卷積運行,需要重復好幾層for,麻煩,而且numPy訪問元素最好不要用 for(慢)

解決:用im2col函數(image to column 從圖像到矩陣):將輸入數據展開以合適濾波器(權重)

將4維數據 ——> 2維數據

(N,C,H,W),即(批處理器,通道數,高,長)

使用im2col更消耗內存,但轉換為矩陣運算更高效,可有效利用線性代數庫。

4.3 卷積層的實現

im2col函數:將4維數據輸入——> 2維數據輸入

x 輸入 4維——> 2維矩陣

W 濾波器 4維——> 2維矩陣

矩陣乘積 X*W + b ——> 輸出2維 —(reshape)—> 輸出4維

im2col(input_data,filter_h,filter_w,stride=1,pad=0)

卷積層forward的代碼實現

import sys, ossys.path.append(os.pardir)from common.util import im2col x1 = np.random.rand(1, 3, 7, 7) # 批大小為1、通道為3的7 × 7的數據col1 = im2col(x1, 5, 5, stride=1, pad=0)print(col1.shape) # (9, 75) x2 = np.random.rand(10, 3, 7, 7) # 批大小為10、通道為3的7 × 7的數據col2 = im2col(x2, 5, 5, stride=1, pad=0)print(col2.shape) # (90, 75) # 卷積層類class Convolution: def __init__(self, W, b, stride=1, pad=0): self.W = W self.b = b self.stride = stride self.pad = pad # 正向傳播 def forward(self, x): FN, C, FH, FW = self.W.shape N, C, H, W = x.shape out_h = int(1 + (H + 2*self.pad - FH) / self.stride) out_w = int(1 + (W + 2*self.pad - FW) / self.stride) col = im2col(x, FH, FW, self.stride, self.pad) col_W = self.W.reshape(FN, -1).T # 濾波器的展開 out = np.dot(col, col_W) + self.b out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) return out #反向傳播在common/layer.py中,必須進行im2col的逆處理——>col2im(矩陣轉圖像)

4.4 池化層的實現

使用im2col函數

在通道方向獨立,按通道單獨展開(卷積層是最后各個通道相加)

池化層的forward實現代碼

class Pooling: def __init__(self, pool_h, pool_w, stride=1, pad=0): self.pool_h = pool_h self.pool_w = pool_w self.stride = stride self.pad = pad def forward(self, x): N, C, H, W = x.shape # 計算輸出大小 out_h = int(1 + (H - self.pool_h) / self.stride) out_w = int(1 + (W - self.pool_w) / self.stride) # 展開(1) 1.展開輸入數據 col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad) col = col.reshape(-1, self.pool_h*self.pool_w) # 最大值(2) 2.求各行的最大值 out = np.max(col, axis=1) # 轉換(3) 3.轉換為合適的輸出大小 out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2) return out

池化層的實現按下面3個階段進行:

展開輸入數據

求各行的最大值

轉換為合適的輸出大小


四、CNN實現

class SimpleConvNet: """簡單的ConvNet conv - relu - pool - affine - relu - affine - softmax Parameters ---------- input_size : 輸入大小(MNIST的情況下為784,三維(1, 28, 28)) hidden_size_list : 隱藏層的神經元數量的列表(e.g. [100, 100, 100]) output_size : 輸出大小(MNIST的情況下為10,十種輸出可能) activation : 'relu' or 'sigmoid' weight_init_std : 指定權重的標準差(e.g. 0.01) 指定'relu'或'he'的情況下設定“He的初始值” 指定'sigmoid'或'xavier'的情況下設定“Xavier的初始值” """ def __init__(self, input_dim=(1, 28, 28), conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, hidden_size=100, output_size=10, weight_init_std=0.01): # 30個5*5的濾波器 # 取濾波器參數到conv_param字典中,備用 filter_num = conv_param['filter_num'] filter_size = conv_param['filter_size'] filter_pad = conv_param['pad'] filter_stride = conv_param['stride'] input_size = input_dim[1] # 28 conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride + 1 pool_output_size = int(filter_num * (conv_output_size/2) * (conv_output_size/2)) # 池化層輸出,H,W減半 # 初始化權重,三層 self.params = {} # 濾波器就是第一層的權重 W1 = (30,1,5,5)(四維數據),即30個高、長為5,通道數為1的數據 self.params['W1'] = weight_init_std * np.random.randn(filter_num, input_dim[0], filter_size, filter_size) # 每一個濾波器都加一個偏置b1,有30個 self.params['b1'] = np.zeros(filter_num) self.params['W2'] = weight_init_std * np.random.randn(pool_output_size, hidden_size) self.params['b2'] = np.zeros(hidden_size) self.params['W3'] = weight_init_std * np.random.randn(hidden_size, output_size) self.params['b3'] = np.zeros(output_size) # 生成層,用以調用 self.layers = OrderedDict() # 有序字典 self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'], conv_param['stride'], conv_param['pad']) self.layers['Relu1'] = Relu() self.layers['Pool1'] = Pooling(pool_h=2, pool_w=2, stride=2) self.layers['Affine1'] = Affine(self.params['W2'], self.params['b2']) self.layers['Relu2'] = Relu() self.layers['Affine2'] = Affine(self.params['W3'], self.params['b3']) self.last_layer = SoftmaxWithLoss() # 前向傳播,從頭開始依次調用層,并將結果傳給下一層 def predict(self, x): for layer in self.layers.values(): x = layer.forward(x) return x # 除了使用predict,還要進行forward,直到到達最后的SoftmaxWithLoss層 def loss(self, x, t): """求損失函數 參數x是輸入數據、t是教師標簽 """ y = self.predict(x) return self.last_layer.forward(y, t) def accuracy(self, x, t, batch_size=100): if t.ndim != 1 : t = np.argmax(t, axis=1) acc = 0.0 for i in range(int(x.shape[0] / batch_size)): tx = x[i*batch_size:(i+1)*batch_size] tt = t[i*batch_size:(i+1)*batch_size] y = self.predict(tx) y = np.argmax(y, axis=1) acc += np.sum(y == tt) return acc / x.shape[0] def numerical_gradient(self, x, t): """求梯度(數值微分) Parameters ---------- x : 輸入數據 t : 教師標簽 Returns ------- 具有各層的梯度的字典變量 grads['W1']、grads['W2']、...是各層的權重 grads['b1']、grads['b2']、...是各層的偏置 """ loss_w = lambda w: self.loss(x, t) grads = {} for idx in (1, 2, 3): grads['W' + str(idx)] = numerical_gradient(loss_w, self.params['W' + str(idx)]) grads['b' + str(idx)] = numerical_gradient(loss_w, self.params['b' + str(idx)]) return grads # 調用各層的backward,并把權重參數的梯度存到grads字典中 def gradient(self, x, t): """求梯度(誤差反向傳播法)(二選一) Parameters ---------- x : 輸入數據 t : 教師標簽 Returns ------- 具有各層的梯度的字典變量 grads['W1']、grads['W2']、...是各層的權重 grads['b1']、grads['b2']、...是各層的偏置 """ # forward self.loss(x, t) # backward dout = 1 dout = self.last_layer.backward(dout) layers = list(self.layers.values()) layers.reverse() for layer in layers: dout = layer.backward(dout) # 設定 grads = {} grads['W1'], grads['b1'] = self.layers['Conv1'].dW, self.layers['Conv1'].db grads['W2'], grads['b2'] = self.layers['Affine1'].dW, self.layers['Affine1'].db grads['W3'], grads['b3'] = self.layers['Affine2'].dW, self.layers['Affine2'].db
五、CNN可視化


濾波器會提取邊緣或斑塊等原始信息。隨著層的加深,提取的信息也愈加復雜。

提取信息愈加復雜:

邊緣——> 紋理——> 物體部件——> 分類

1998年,CNN元祖:LeNet——> 比如手寫數字識別

2012年:深度學習 AlexNet

他們都是疊加多個卷積層,池化層,最后經由全連接層輸出

LeNet:

激活函數用sigmoid (現主要使用ReLU )

通過子采樣來縮小數據(現主要使用Max池化)

AlexNet:

激活函數用ReLU

使用進行局部正規化的LRN層(local responce normalization)

使用dropout

關于網絡結構,LeNet和AlexNet沒太大差別,現如今大數據和GPU的快速發展推動了深度學習的發展。 注:如有細節處沒有寫到的,請繼續精讀《深度學習入門》,對小白來說真的是非常通俗易懂的深度學習入門書籍。(書中的例子主要是基于CV的)

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4771

    瀏覽量

    100715
  • 深度學習
    +關注

    關注

    73

    文章

    5500

    瀏覽量

    121113
  • cnn
    cnn
    +關注

    關注

    3

    文章

    352

    瀏覽量

    22203

原文標題:【基礎詳解】手磕實現 CNN卷積神經網絡!

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    TF之CNNCNN實現mnist數據集預測

    TF之CNNCNN實現mnist數據集預測 96%采用placeholder用法+2層C及其max_pool法+隱藏層dropout法+輸出層softmax法+目標函數cross_entropy法+
    發表于 12-19 17:02

    TF之CNN:Tensorflow構建卷積神經網絡CNN的嘻嘻哈哈事之詳細攻略

    TF之CNN:Tensorflow構建卷積神經網絡CNN的嘻嘻哈哈事之詳細攻略
    發表于 12-19 17:03

    大家是怎么壓榨CNN模型的

    【技術綜述】為了壓榨CNN模型,這幾年大家都干了什么
    發表于 05-29 14:49

    TensorFlow的CNN文本分類

    在TensorFlow中實現CNN進行文本分類(譯)
    發表于 10-31 09:27

    卷積神經網絡CNN介紹

    【深度學習】卷積神經網絡CNN
    發表于 06-14 18:55

    如何利用PyTorch API構建CNN?

      很多人對于卷積神經網絡(CNN)并不了解,卷積神經網絡是一種前饋神經網絡,它包括卷積計算并具有很深的結構,卷積神經網絡是深度學習的代表性算法之一。那么如何利用PyTorch API構建CNN
    發表于 07-16 18:13

    如何在嵌入式平臺實現CNN

    單片機(Cortex-M內核,無操作系統)可以跑深度學習嗎? ——Read Air 2019.8.20Xu_CNN框架待處理:1.需要設計一個可讀寫的消息棧 ()2.函數的類型參數使用結構體傳入 (已實現)3.動態...
    發表于 12-09 08:02

    如何將DS_CNN_S.pb轉換為ds_cnn_s.tflite?

    MIMRTX1064(SDK2.13.0)的KWS demo中放置了ds_cnn_s.tflite文件,提供demo中使用的模型示例。在 read.me 中,聲明我可以找到腳本,但是,該文檔中的腳本
    發表于 04-19 06:11

    一文詳解CNN

    1 CNN簡介 CNN即卷積神經網絡(Convolutional Neural Networks),是一類包含卷積計算的神經網絡,是深度學習(deep learning)的代表算法之一,在圖像識別
    發表于 08-18 06:56

    基于FPGA的通用CNN加速設計

    基于FPGA的通用CNN加速器整體框架如下,通過Caffe/Tensorflow/Mxnet等框架訓練出來的CNN模型,通過編譯器的一系列優化生成模型對應的指令;同時,圖片數據和模型權
    發表于 10-27 14:09 ?1w次閱讀
    基于FPGA的通用<b class='flag-5'>CNN</b>加速設計

    手把手教你操作Faster R-CNN和Mask R-CNN

    Mask R-CNN是承繼于Faster R-CNN,Mask R-CNN只是在Faster R-CNN上面增加了一個Mask Prediction Branch(Mask預測分支),
    的頭像 發表于 04-04 16:32 ?1.3w次閱讀

    自己動手寫CNN Inference框架之 (三) dense

    之前我們介紹過CNN inference框架的基本結構,如何從tensorflow的graph中提取conv2d的權重,隨后利用該權重進行對應的卷積操作。本文我...
    發表于 02-07 11:47 ?0次下載
    自己動手寫<b class='flag-5'>CNN</b> Inference<b class='flag-5'>框架</b>之 (三) dense

    自己動手寫CNN Inference框架之 (一) 開篇

    服務器上的CNN訓練框架很多,如tensorflow、pytorch、keras、caffe等等。該類框架在PC及服務器中的顯卡、高性能CPU中都有不錯的性能表現...
    發表于 02-07 11:53 ?0次下載
    自己動手寫<b class='flag-5'>CNN</b> Inference<b class='flag-5'>框架</b>之 (一) 開篇

    PyTorch教程14.8之基于區域的CNN(R-CNN)

    電子發燒友網站提供《PyTorch教程14.8之基于區域的CNN(R-CNN).pdf》資料免費下載
    發表于 06-05 11:09 ?0次下載
    PyTorch教程14.8之基于區域的<b class='flag-5'>CNN</b>(R-<b class='flag-5'>CNN</b>)

    PyTorch教程-14.8。基于區域的 CNN (R-CNN)

    14.8。基于區域的 CNN (R-CNN)? Colab [火炬]在 Colab 中打開筆記本 Colab [mxnet] Open the notebook in Colab
    的頭像 發表于 06-05 15:44 ?645次閱讀
    PyTorch教程-14.8。基于區域的 <b class='flag-5'>CNN</b> (R-<b class='flag-5'>CNN</b>)
    主站蜘蛛池模板: 日本妈妈xxxx| 在线看片福利无码网址| 成人片免费看| 美女内射少妇一区二区四区| 亚洲国产精品天堂在线播放| 高H各种PLAY全肉NP| 女人精69xxxxx| 在线观看国产高清免费不卡| 欧美囗交xx bbb视频| 在线自拍综合亚洲欧美| 亚洲精品日韩在线观看视频| 高H黄暴NP辣H一女多男| 日本高清不卡码无码v亚洲| 99视频免视看| 男生脱美女内裤内衣动态图| 在线天天看片免费视频观看| 久久99精品视频| 野花韩国中文版免费观看| 国产在线观看免费观看| 同时被两个男人轮流舔| 夫妻主vk| 视频一区国产精戏刘婷30| 动漫AV纯肉无码AV电影网| 日本一卡二卡三卡四卡无卡免费播放| 无限资源日本2019版| 国产精品资源在线观看网站 | 东日韩二三区| 日韩高清毛片| 成视频高清| 涩涩999| 国产国语在线播放视频| 兔费看少妇性L交大片免费| 国产成人小视频在线观看| 双性被疯狂灌满精NP| 国产精品成人影院| 无限资源在线观看高清| 国产自产视频在线观看香蕉| 亚洲精品123区| 久久re视频这里精品免费1| 在线中文字幕| 棉签和冰块怎么弄出牛奶视频|