1. 程式人生 > >CNN 簡史與 Keras 增量實現(一)—— Softmax 分類器

CNN 簡史與 Keras 增量實現(一)—— Softmax 分類器

準備知識

資料庫

我們基於幾個基本資料庫來驗證演算法:MNIST 手寫字型資料集,CIFAR10 與 CIFAR100 影象分類資料集。

使用 keras 的 datasets 模組來方便地匯入資料庫:

from keras.datasets import mnist, cifar10, cifar100

# mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

# cifar100
(X_train, y_train), (X_test, y_test) = cifar100.load_data(label_mode='fine'
)

第一次執行時會自動從網站下載資料庫到本地的 ~/.keras/datasets 路徑下。匯入的資料為 numpy array 型別。可以看看它們的尺寸和資料型別:

print X_train.shape, y_train.shape, X_test.shape, y_test.shape
print X_train.dtype, y_train.dtype, X_test.dtype, y_test.dtype

MNIST 圖片大小為 28x28,共有 10 個類別(數字 0 到 9 的手寫字型),訓練集共有 60000 張圖片,測試集共有 10000 張圖片。

CIFAR10 共有 10 類影象,每個影象大小為 32x32x3,訓練集有 50000 幅圖片,測試集有 10000 幅圖片。

CIFAR100 影象數目與大小和 CIFAR10 相同,但它的影象包括 100 個類別(所以平均每個類別只有 500+100 幅圖)。

三種資料庫的資料型別都是 uint8,標籤(y_train 和 y_test)的資料型別為 int64。

機器學習演算法結構

機器學習演算法通常由三部分組成:得分函式(score function)、損失函式(loss function)和優化演算法(optimization)

得分函式定義了模型結構,例如線性分類器、核分類器和神經網路就屬於完全不同的模型結構。

相同的模型結構,不同的損失函式也可能定義截然不同的演算法模型。例如,線性迴歸和支援向量機(SVM)的得分函式都是 y

=wTx+b,但線性迴歸的損失函式是最小平方誤差(MSE),而支援向量機的損失函式是合頁損失(hinge loss),二者的作用和效果完全不同。

常見演算法的得分函式、損失函式和優化演算法如下:

演算法名稱 得分函式 損失函式 優化演算法
線性迴歸 y=wTx+b MSE: i(yi(wTx+b))2 LS 閉合解
SVM y=wTx+b hinge loss: imax(0,1tyi) SMO, QP, LS
邏輯迴歸 y=11+exp(wTx) cross entropy loss: ipilog(qi) 梯度下降,L-BFGS
MLP 多層神經網路 cross entropy loss: ipilog(qi) 反向傳播

其中 MLP 的得分函式為:y=σ(WL...σ(W2σ(W1x+b1)+b2)...+bL)

CNN、RNN 等複雜模型同樣由以上三部分組成,但它們的得分函式(亦即其網路結構)更為複雜。它們的損失函式通常包括交叉熵(cross entropy)、MSE 等,其優化演算法主要是反向傳播。

所以要實現一個機器學習演算法,主要需要實現三部分內容:定義得分函式,定義損失函式,實現優化演算法。

下面開始進入正題。

Softmax 分類器

在學習 CNN 之前,我們先實現一個 Softmax 多類分類器,作為 baseline。

實現 Softmax 過程中涉及的引數初始化、梯度下降和一些實驗觀察有助於後面對神經網路的理解。Softmax 屬於多類分類器,輸入為樣本特徵,輸出為樣本屬於各個類別的概率。

上一節我們提到,機器學習演算法通常由三部分組成:得分函式、損失函式和優化演算法。我們逐一實現 Softmax 的這幾個部分。

得分函式

Softmax 的得分函式輸出樣本屬於不同類別的概率,通過如下公式計算:

pk=exp(wTkx)jexp(wTjx)

pk 表示樣本 x 屬於第 k 個類別的概率,jwTjx 是歸一化項,為了使概率之和為 1。完整的 pC×1 的向量(C 是類別個數)。

程式碼實現如下:

def softmax_score(X, W):
    p = np.exp(W.T.dot(X))
    p = p / np.sum(p, axis=0)
    return p

這裡用矩陣乘法同時計算出所有樣本屬於所有類別的概率。

寫下各個變數的維度有助於理解。假設有 N 個樣本,特徵為 D 維,C 個類別,則各變數的維度如下:

XD×N,WD×C,pC×1

損失函式

Softmax 以交叉熵(cross entropy)定義損失函式。假設樣本 x 屬於各個類別的真實概率為 q=[0,,1,,0] (在真實類別位置概率為 1,其餘位置為 0),估計概率為 p,則 p 與 q 之間的交叉熵定義為:

h=k=1Cqklog(pk)

損失函式定義為所有樣本的交叉熵之和:

J=1Ni,kN,Cq(i)klog(p(i)k)

注意到 q(i) 僅在類別 y(i)=k 處才為 1,所以損失函式可以寫為:

J=1Ni,kN,Csgn(yi==k)log(p(i)k)

可以這麼直觀地理解:Softmax 的損失函式就是所有樣本在正確類別上概率的 log 和的相反數。

程式碼實現如下:

def softmax_loss(X, y, W):
    N = X.shape[1]
    C = len(np.unique(y))

    p = softmax_score(X, W)

    loss = 0
    for k in range(C):
        loss += - np.sum(np.log(p[k,y==k])) / N

    return loss

優化演算法

損失函式 J 是凸函式,我們使用梯度下降來求得引數 W 的最優解。

首先看看梯度怎麼計算。

梯度計算

損失函式 J 是所有樣本正確分類的概率的 log 和的相反數,我們可以把它展開為:

這裡寫圖片描述

其中 δk=

相關推薦

CNN 簡史 Keras 增量實現—— Softmax 分類

準備知識 資料庫 我們基於幾個基本資料庫來驗證演算法:MNIST 手寫字型資料集,CIFAR10 與 CIFAR100 影象分類資料集。 使用 keras 的 datasets 模組來方便地匯入資料庫: from keras.datasets im

hadoop雲盤client的設計實現

white 下一跳 -c 文件 。。 edi track ++ ava 近期在hadoop雲盤client項目。在做這個項目曾經對hadoop是一點都不了解呀,在網

中小型園區網路的設計實現

在職本科臨近畢業,論文是躲不掉的。 謹此來記錄畢業論文的完成過程。 論文大綱 部分雖然已經交上去很多日了。但是個人覺得有必要寫到第一篇裡,以示論文過程的完整。 先聊一下寫論文大綱的思路。 第一,首先論文是需要有專案背景的,就像做一件事情要有個目的。說仔細點就是某項工作需要交

Java常用的八種排序演算法程式碼實現:氣泡排序法、插入排序法、選擇排序法

這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

深度學習框架Keras學習系列:線性代數基礎numpy使用Linear Algebra Basis and Numpy

又開一個新坑~~ 因為確實很有必要好好地趁著這個熱潮來研究一下深度學習,畢竟現在深度學習因為其效果突出,熱潮保持高漲不退,上面的政策方面現在也在向人工智慧領域傾斜,但是也有無數一知半解的人跟風吹捧,於是希望藉此教程,讓自己和讀者一起藉助keras,從上到下逐漸

Hyper-v虛擬機器備份還原實現

前言        人生中的第一篇部落格,寫的不當之處,歡迎糾正。     小編最近做了一個關於Hyper-v虛擬機器備份的專案,網上有很多關於Hyper-v備份的文章,大都是寫管理方面的,用的都是官方自帶的功能,小編在這介紹的備份與還原方法是基於開發的角度,在寫完部落格後會

使用Unity3D編寫ARPG遊戲——角色屬性的定義實現

今天考完了大學最後一門考試,是瞬間感覺輕鬆了一點,花了一天多的時間預習一本書,馬上就去考試了,就結果而言還是不錯的。但是不知道是一種解脫,還是馬上要戴上的一種新的枷鎖。總歸還是不錯的。好了,閒話少扯,繼續談談如何製作一款ARPG遊戲,sunset在上兩篇部落格中

DeepLearning深度學習原理實現

       經過三年的狂刷理論,覺得是時候停下來做些有用的東西了,因此決定開博把他們寫下來,一是為了整理學過的理論,二是監督自己並和大家分享。先從DeepLearning談起吧,因為這個有一定的實用性(大家口頭傳的“和錢靠的很近”),國內各個大牛也都談了不少,我儘量從其他

OpenStack設計實現虛擬化

雲端計算的一個核心思想就是在伺服器端提供集中的物理計算資源,這些計算資源可以被分解成更小的單位去獨立地服務於不同的使用者,也就是在共享物理資源的同時,為每個使用者提供隔離、安全、可信的虛擬工作環境,

Java代理模式實現原理詳解

關於Java中的代理,我們首先需要了解的是一種常用的設計模式——代理模式,而對於代理,可根據代理類建立的時間點,分為靜態代理和動態代理。今天我們先來了解一下Java中的靜態代理。 1 代理模式 代理模式是一種常用的設計模式,百度百科中對其定義為:為其他物件提供一個代理以控制對某個物件的訪問。

併發程式設計—— Java 執行緒池 實現原理原始碼深度解析

史上最清晰的執行緒池原始碼分析 鼎鼎大名的執行緒池。不需要多說!!!!! 這篇部落格深入分析 Java 中執行緒池的實現。 總覽 下圖是 java 執行緒池幾個相關類的繼承結構:    先簡單說說這個繼承結構,Executor 位於最頂層,也是最簡單的,就一個 execute(

ssm許可權管理的設計實現

介紹:          畢業設計要做一個許可權管理系統,自己查了些資料,看了些不同的前臺框架,選單的同異步載入,資料庫設計也大不相同。蕩了兩個相關的專案,一直在讀程式碼。不知道怎麼下手,現在基本明白程式碼流程,自己前後臺略懂,這個模組又不大,說的不詳細的可以搜一下,很容

紅黑樹演算法的思想實現

紅黑樹 是一顆二叉搜尋樹:樹中每一個節點不是黑色就是紅色。可以把一顆紅黑樹視為一顆擴充二叉樹,用外部節點表示空指標。。。 有如下特性: 1.根節點和所有外部節點的顏色是黑色。 2.從根節點到外部節點的途中沒有連續兩個節點的顏色是紅色。 3.所有從根節點到外部節點的路徑上都有

認證鑑權API許可權控制在微服務架構中的設計實現

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第一篇,本系列預計四篇文章講解微服務下的認證鑑權與API許可權控制的實現。 1. 背景 最近在做許可權相關服務的開發,在系統微服務化後,原有的單體應用是基於Session的安全許可權方式,不能滿足現有的微服務架構的認證

資料結構算法系列陣列實現

## 資料結構與算法系列(一)陣列實現 注:`這是一個新的系列,主要是由於資料結構與演算法是程式設計師以後立身的根本,我以前在大學也學過,但是很快就忘記了,現在想把它撿起來,通過寫一個系列文章,加深自己的理解,其實我寫這個系列主要是想先通過預熱,然後去刷leetcode。刷演算法本身是想鍛鍊自己寫程式的思維,

系統分析設計學習筆記

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

異步線程池的實現-------具體實現方法

fun format 測試 路徑 線程池。 用戶體驗 deb tar clas 本篇是這個內容的第一篇,主要是寫:遇到的問題,和自己摸索實現的方法。後面還會有一篇是總結性地寫線程池的相關內容(偏理論的)。 一、背景介紹 朋友的項目開發到一定程度之後,又遇到

多種排序算法的思路和簡單代碼的實現

insert i++ 前後端 分享 size quicksort 執行 判斷 clas 就自己簡單的理解了一些排序算法(JAVA)思路和代碼分享給大家:歡迎大家進行交流。 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2

Dji Mobile SDK 基礎實現

n-1 app lba ger print ttl touch事件 釋放 bsp Dji Mobile SDK 基礎實現(一) 本文簡要介紹如何通過調用DJI Mobile SDK,實現獲取和釋放無人機的控制權限、模擬遙控器按鈕控制無人機的飛行、獲取無人機的回傳視頻、獲取無

part01.03 委托 Lambda 表達式:委托

調用 rem internal 字符 運算符 通過 string lag lambda delegate 是表示對具有特定參數列表和返回類型的方法的引用類型。 委托最大的作用就是為 類的事件 綁定 事件處理程序 可將任何可訪問類或結構中與委托類型匹配的任何方法分配給委托。該