算法工程師修仙之路:Keras(六)

深度學習基礎

神經網絡的數學基礎


神經網絡的數據表示

在 Numpy 中操作張量

  • 我們可以使用語法 train_images[i] 來選擇沿着第一個軸的特定數字,選擇張量的特定元素叫作張量切片(tensor slicing)。

  • 我們來看一下 Numpy 數組上的張量切片運算:

    選擇第10~100個數字(不包括第100個),並將其放在形狀爲(90, 28, 28) 的數組中。
    >>> my_slice = train_images[10:100]
    >>> print(my_slice.shape)
    (90, 28, 28)
    
  • 它等同於下面這個更復雜的寫法,給出了切片沿着每個張量軸的起始索引和結束索引, : 等同於選擇整個軸

    # 等同於前面的例子
    >>> my_slice = train_images[10:100, :, :]
    >>> my_slice.shape
    (90, 28, 28)
    # 也等同於前面的例子
    >>> my_slice = train_images[10:100, 0:28, 0:28]
    >>> my_slice.shape
    (90, 28, 28)
    
  • 一般來說,你可以沿着每個張量軸在任意兩個索引之間進行選擇。

    • 例如,你可以在所有圖像的右下角選出14像素×14像素的區域:

      my_slice = train_images[:, 14:, 14:]
      
    • 也可以使用負數索引,與 Python 列表中的負數索引類似,它表示與當前軸終點的相對位置。你可以在圖像中心裁剪出14像素×14像素的區域:

      my_slice = train_images[:, 7:-7, 7:-7]
      

數據批量的概念

  • 深度學習中所有數據張量的第一個軸(0 軸,因爲索引從0開始)都是樣本軸(samples axis,有時也叫樣本維度)。 在 MNIST 的例子中,樣本就是數字圖像。

  • 深度學習模型不會同時處理整個數據集,而是將數據拆分成小批量。

    • 具體來看,下面是 MNIST 數據集的一個批量,批量大小爲128:

      batch = train_images[:128]
      
    • 然後是下一個批量:

      batch = train_images[128:256]
      
    • 然後是第 n 個批量:

      batch = train_images[128 * n:128 * (n + 1)]
      
    • 對於這種批量張量,第一個軸(0軸)叫作批量軸(batch axis)或批量維度(batch dimension)。

現實世界中的數據張量

  • 向量數據:2D 張量,形狀爲 (samples, features)。

  • 時間序列數據或序列數據:3D 張量,形狀爲 (samples, timesteps, features)。

  • 圖像:4D 張量,形狀爲 (samples, height, width, channels) 或 (samples, channels, height, width)。

  • 視頻:5D 張量,形狀爲 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width)。

向量數據

  • 對於這種數據集,每個數據點都被編碼爲一個向量,因此一個數據批量就被編碼爲2D張量(即向量組成的數組),其中第一個軸是樣本軸,第二個軸是特徵軸。

  • 人口統計數據集

    • 其中包括每個人的年齡、郵編和收入。
    • 每個人可以表示爲包含3個值的向量,而整個數據集包含100000個人,因此可以存儲在形狀爲 (100000, 3) 的 2D 張量中。
  • 文本文檔數據集

    • 我們將每個文檔表示爲每個單詞在其中出現的次數(字典中包含20000個常見單詞)。
    • 每個文檔可以被編碼爲包含20000個值的向量(每個值對應於字典中每個單詞的出現次數),整個數據集包含500個文檔,因此可以存儲在形狀爲(500, 20000)的張量中。

時間序列數據或序列數據

  • 當時間(或序列順序)對於數據很重要時,應該將數據存儲在帶有時間軸的 3D 張量中。每個樣本可以被編碼爲一個向量序列(即 2D 張量),因此一個數據批量就被編碼爲一個 3D 張量。根據慣例,時間軸始終是第2個軸(索引爲1的軸)。
    在這裏插入圖片描述

  • 股票價格數據集

    • 每一分鐘,我們將股票的當前價格、前一分鐘的最高價格和前一分鐘的最低價格保存下來。
    • 因此每分鐘被編碼爲一個 3D 向量,整個交易日被編碼爲一個形狀爲(390, 3)的 2D 張量(一個交易日有390分鐘),而250天的數據則可以保存在一個形狀爲(250, 390, 3)的 3D 張量中。
    • 這裏每個樣本是一天的股票數據。
  • 推文數據集

    • 我們將每條推文編碼爲280個字符組成的序列,而每個字符又來自於128個字符組成的字母表。
    • 在這種情況下,每個字符可以被編碼爲大小爲128的二進制向量(只有在該字符對應的索引位置取值爲1,其他元素都爲0)。
    • 那麼每條推文可以被編碼爲一個形狀爲 (280, 128) 的 2D 張量,而包含100萬條推文的數據集則可以存儲在一個形狀爲(1000000, 280, 128)的張量中。

圖像數據

  • 圖像通常具有三個維度:高度、寬度和顏色深度。

  • 雖然灰度圖像(比如 MNIST 數字圖像)只有一個顏色通道,因此可以保存在 2D 張量中,但按照慣例,圖像張量始終都是 3D 張量,灰度圖像的彩色通道只有一維。因此,如果圖像大小爲256×256,那麼128張灰度圖像組成的批量可以保存在一個形狀爲(128, 256, 256, 1)的張量中,而128張彩色圖像組成的批量則可以保存在一個形狀爲(128, 256, 256, 3) 的張量中。
    在這裏插入圖片描述

  • 圖像張量的形狀有兩種約定:通道在後(channels-last)的約定(在 TensorFlow 中使用)和通道在前(channels-first)的約定(在 Theano 中使用)。

  • Google 的 TensorFlow 機器學習框架將顏色深度軸放在最後:(samples, height, width, color_depth)。與此相反,Theano 將圖像深度軸放在批量軸之後:(samples, color_depth, height, width)。Keras 框架同時支持這兩種格式。

視頻數據

  • 視頻數據是現實生活中需要用到 5D 張量的少數數據類型之一。

  • 視頻可以看作一系列幀,每一幀都是一張彩色圖像。由於每一幀都可以保存在一個形狀爲 (height, width, color_depth) 的 3D 張量中,因此一系列幀可以保存在一個形狀爲(frames, height, width, color_depth) 的 4D 張量中,而不同視頻組成的批量則可以保存在一個 5D 張量中,其形狀爲(samples, frames, height, width, color_depth)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章