TensorFlow 深度學習筆記 卷積神經網絡


Convolutional Networks

轉載請注明作者:夢里風林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star,有問題可以到Issue區討論
官方教程地址
視頻/字幕下載

deep dive into images and convolutional models

Convnet

BackGround

  • 人眼在識別圖像時,往往從局部到全局
  • 局部與局部之間聯系往往不太緊密
  • 我們不需要神經網絡中的每個結點都掌握全局的知識,因此可以從這里減少需要學習的參數數量

Weight share

  • 但這樣參數其實還是挺多的,所以有了另一種方法:權值共享

Share Parameters across space

  • 取圖片的一小塊,在上面做神經網絡分析,會得到一些預測

  • 將切片做好的神經網絡作用於圖片的每個區域,得到一系列輸出

  • 可以增加切片個數提取更多特征

  • 在這個過程中,梯度的計算跟之前是一樣的

Concept

  • Patch/Kernel:一個局部切片
  • Depth: 數據的深度,圖像數據是三維的,長寬和RGB,神經網絡的預測輸出也屬於一維
  • Feature Map:每層Conv網絡,因為它們將前一層的feature映射到后一層(Output map)

  • Stride: 移動切片的步長,影響取樣的數量
  • 在邊緣上的取樣影響Conv層的面積,由於移動步長不一定能整除整張圖的像素寬度,不越過邊緣取樣會得到Valid Padding, 越過邊緣取樣會得到Same Padding
  • Example

  • 用一個3x3的網格在一個28x28的圖像上做切片並移動
  • 移動到邊緣上的時候,如果不超出邊緣,3x3的中心就到不了邊界
  • 因此得到的內容就會缺乏邊界的一圈像素點,只能得到26x26的結果
  • 而可以越過邊界的情況下,就可以讓3x3的中心到達邊界的像素點
  • 超出部分的矩陣補零就行

Deep Convnet

在Convnet上套Convnet,就可以一層一層綜合局部得到的信息

OutPut

將一個deep and narrow的feature層作為輸入,傳給一個Regular神經網絡

Optimization

Pooling

將不同Stride的卷積用某種方式合並起來,節省卷積層的空間復雜度。

  • Max Pooling
    在一個卷積層的輸出層上取一個切片,取其中最大值代表這個切片
  • 優點
    • 不增加需要調整的參數
    • 通常比其他方法准確
  • 缺點:更多Hyper Parameter,包括要取最值的切片大小,以及去切片的步長

LENET-5, ALEXNET

  • Average Pooling
    在卷積層輸出中,取切片,取平均值代表這個切片

1x1 Convolutions

在一個卷積層的輸出層上,加一個1x1的卷積層,這樣就形成了一個小型的神經網絡。

  • cheap for deeper model
  • 結合Average Pooling食用效果更加

Inception

對同一個卷積層輸出,執行各種二次計算,將各種結果堆疊到新輸出的depth方向上

TensorFlow卷積神經網絡實踐

數據處理

  • dataset處理成四維的,label仍然作為one-hot encoding
def reformat(dataset, labels, image_size, num_labels, num_channels):
    dataset = dataset.reshape(
        (-1, image_size, image_size, num_channels)).astype(np.float32)
    labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)
    return dataset, labels
  • 將lesson2的dnn轉為cnn很簡單,只要把WX+b改為conv2d(X)+b即可
  • 關鍵在於conv2d

`conv2d

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

給定四維的inputfilter tensor,計算一個二維卷積

Args:
  • input: A Tensor. type必須是以下幾種類型之一: half, float32, float64.
  • filter: A Tensor. type和input必須相同
  • strides: A list of ints.一維,長度4, 在input上切片采樣時,每個方向上的滑窗步長,必須和format指定的維度同階
  • padding: A string from: "SAME", "VALID". padding 算法的類型
  • use_cudnn_on_gpu: An optional bool. Defaults to True.
  • data_format: An optional string from: "NHWC", "NCHW", 默認為"NHWC"
    指定輸入輸出數據格式,默認格式為"NHWC", 數據按這樣的順序存儲:
    [batch, in_height, in_width, in_channels]
    也可以用這種方式:"NCHW", 數據按這樣的順序存儲:
    [batch, in_channels, in_height, in_width]
  • name: 操作名,可選.
Returns:

A Tensor. type與input相同

Given an input tensor of shape [batch, in_height, in_width, in_channels]
and a filter / kernel tensor of shape
[filter_height, filter_width, in_channels, out_channels]

conv2d實際上執行了以下操作:

  1. 將filter轉為二維矩陣,shape為
    [filter_height * filter_width * in_channels, output_channels].
  2. 從input tensor中提取image patches,每個patch是一個virtual tensor,shape[batch, out_height, out_width, filter_height * filter_width * in_channels].
  3. 將每個filter矩陣和image patch向量相乘

具體來講,當data_format為NHWC時:

output[b, i, j, k] =
    sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
                    filter[di, dj, q, k]

input 中的每個patch都作用於filter,每個patch都能獲得其他patch對filter的訓練
需要滿足strides[0] = strides[3] = 1. 大多數水平步長和垂直步長相同的情況下:strides = [1, stride, stride, 1].


  • 然后再接一個WX+b連Relu連WX+b的全連接神經網絡即可

Max Pooling

在tf.nn.conv2d后面接tf.nn.max_pool,將卷積層輸出減小,從而減少要調整的參數

max_pool

tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)

Performs the max pooling on the input.

Args:
  • value: A 4-D Tensor with shape [batch, height, width, channels] and
    type tf.float32.
  • ksize: A list of ints that has length >= 4. 要執行取最值的切片在各個維度上的尺寸
  • strides: A list of ints that has length >= 4. 取切片的步長
  • padding: A string, either 'VALID' or 'SAME'. padding算法
  • data_format: A string. 'NHWC' and 'NCHW' are supported.
  • name: 操作名,可選
Returns:

A Tensor with type tf.float32. The max pooled output tensor.


優化

仿照lesson2,添加learning rate decay 和 drop out,可以將准確率提高到90.6%

參考鏈接

覺得我的文章對您有幫助的話,給個star可好?

土豪可以打賞支持,一分也是愛:

圖片名稱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM