• 文章總列表
  • 統計分析
    • R SAS All
      R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      統計分析

      [SAS] Ma…

      2026-01-21

      統計分析

      什麼是meta-…

      2024-11-05

      統計分析

      Test-ret…

      2024-06-07

      統計分析

      [SAS]傾向分…

      2020-10-28

  • SAS
    • SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      SAS

      [SAS]線性迴…

      2020-02-26

  • R
    • R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      R

      [SAS][R]…

      2019-07-08

  • 機器學習
    • 機器學習

      Unsuperv…

      2021-07-22

      機器學習

      Unsuperv…

      2021-07-12

      機器學習

      Unsuperv…

      2021-05-20

      機器學習

      Unsuperv…

      2021-05-12

      機器學習

      Matrix F…

      2021-04-30

  • 閱讀筆記
    • 閱讀筆記

      [閱讀心得 #2…

      2025-02-05

      閱讀筆記

      [閱讀心得#20…

      2024-10-25

      閱讀筆記

      [閱讀心得#19…

      2024-08-16

      閱讀筆記

      [閱讀心得#18…

      2024-05-10

      閱讀筆記

      [閱讀心得#17…

      2022-01-22

Wenwu's blog
wenwu's blog
  • 請我喝珍奶

Popular Posts

[R]散佈圖...

2019-12-31

[SAS]L...

2020-06-10

[SAS][...

2019-07-08

[R]Log...

2019-10-31

[SAS] ...

2020-01-22

[SAS]線...

2020-02-26

[SAS]存...

2019-12-18

[SAS]迴...

2020-02-28
SAS

[SAS]傾向分數配對(Propensity score matching)

by wenwu 2020-10-28

[SAS]傾向分數配對(Propensity score matching)

在做研究時,我們目標通常是比較實驗組和對照組,想知道兩者的差別或比較兩者的存活表現。
但是為了降低研究的偏差,我們希望兩組的差異不會影響我們的實驗結果,所以可以用傾向分數配對(propensity score matching)對干擾因子做適當的配對,使其影響降到最低。傾向分數配對能夠有效讓兩組的共變項更為均勻,使所有干擾因子都能控制的差不多。

今天就簡單介紹傾向分數配對(propensity score matching),以及如何在SAS上應用


傾向分數配對(Propensity score matching)的特色

傾向分數主要目的是讓治療組與非治療組在干擾變項(X)的分布大致相同。干擾變項,即治療與否受到哪些變數影響。通常會考慮常見的干擾因子,像是年齡、性別、共病症等等,可將這些視為解釋變項。

  1. 傾向分數分析的目的 : 降低混淆效果
  2. 主要有四種應用方法: 1. 配對,2.加權,3.分層,4.統計控制
  3. 傾向分數配對(propensity score matching): 經由將傾向分數相近的治療組與控制組配對起來,營造類似隨機試驗的環境(不包含未測量到的混淆因子)
  • 優點:
  1. 相較於分層分析與統計控制,PSM更能有效使兩組的共變項更均勻
  2. 很直覺的提供像隨機試驗那樣的報告。i.e.透明化呈現兩組的基本特性在表格中。
  • 劣勢: 
    由於PSM會剔除相當人數的治療組與許多控制組(一般控制組人數較多)
    會導致
  1. 由於損失許多人數的控制組,無法將結果推論到整個群體
  2. 由於人數下降,因此統計檢定力(Power)下降。i.e.會得到較不顯著之結果
  • 考慮、技術細節:
  1. 配對演算法的設定(optinal,greedy nearest neighbor matching)
  2. 是否容許配對後的置換
  3. 將資料排序予以隨機化

SAS example

接下來要進入SAS的實作。
首先,需要使用SAS提供的macro: %OneToManyMTCH,下載之後macro在附錄,可以直接複製貼上使用
檔案裡有很詳細的介紹,包含配對前後的卡方值比較等等….

而這個PSM是base on Logistic regression的,使用logistic regression可以幫我們依據每一位病人的變項,計算每一個病人的機率值(P)
使用logistic regression,可以幫我們得到P值,%OneToManyMTCH會依據這些P值,幫我們做傾向分數配對

所以在跑logistic regression,可以挑選需要配對的變項。比如: 我們希望下面五個變項使用配對,就必須寫在logistic regression上面(age_gp comorbidity_gp grade_gp diag_yr stage),而surgery就是我們的實驗組和對照組(01資料),下面的程式最重要的就是這一行

output out=P prob=prob;

在logistic regression上面加這一句,就會幫你計算每一個病人的機率值(Prob),並且存在 P

[SAS]Logistic regression 羅吉斯迴歸 複習

proc logistic data=X;
class
AGE_GP(param=ref ref='1.< 40')
COMORBIDITY_GP (param=ref ref='3.>=2')
GRADE_GP(param=ref ref='3 and 4')
DIAG_YR(param=ref ref='2004')
STAGE(param=ref ref='3')
;
model Surgery(event='1')=
AGE
COMORBIDITY_GP
GRADE_GP
DIAG_YR
STAGE
;                                             
output out=P prob=prob;
run;

可以發現跟平常跑的logistic regression 不太一樣,在work.P 可以發現每一位病人都有P值

最後跑%OneToManyMTCH的macro
第一個work是P檔案的位置
第二個P就是經過logistic regression後所計算的P值
第三個Surgery就是我們的實驗組和對照組(01資料)
第四個ID是病人的ID,幫助程式識別
第五個MM1,就是最後分類完要存檔的位置
第六個1,是設定要1:N的傾向分數配對,這裡設定是1:1,可以自己選擇

%OneToManyMTCH(work,P,Surgery, ID, MM1,1);

最後在MM1 就能看到程式所幫你挑好的新實驗組和對照組了

照理來說,經過傾向分數配對之後,兩個組別應該就不會有顯著性差異了,大家可以做一下卡方檢定檢查。當然也可以挑選需要控制的變數於logistic regression,這幾個變項在配對前有顯著性差異,在配對後就不太會有這個問題了

2020-10-28 0 comment
1 FacebookTwitterPinterestEmail
統計分析

健保資料庫介紹

by wenwu 2020-10-16

健保資料庫介紹

工作快一年半了,主要的工作內容都與健保資料庫離不開關係
今天想要依照我所使用健保資料庫的經驗與大家介紹

主要也是本身的記憶力太差,若是離開這份工作後,也就講不出健保資料的介紹了,所以趁著記憶猶、最有心得的時候來分享


如果想要知道健保資料庫提供什麼樣的資料的話,可以直接到衛服部統計處查詢,,網站中提供最完整的資料項目以及明細,但是今天不一一介紹每一個變項
今天分享的內容主要從我的經驗為主,分享的大綱如下:

  • 如何使用健保資料庫
  • 資料庫介紹
  • 資料使用實例分享
  • 使用健保資料庫的優缺點

如何使用健保資料庫

健保在台灣的普及率非常高,所以台灣的健保資料庫收集的也非常完全。
但是要如何取得這份資料呢? 是每一個人都能夠使用嗎?

首先,我們要知道資料的來源是來自衛服部統計處的資料科學中心。大約有八十幾個資料能夠使用(待會會介紹)。
當然資料不是隨便的人都能使用的,也不是在網路上的open data 可以給大家下載,使用資料是需要申請。
而且資料也不是申請之後就可以帶回家使用,需要在衛服部所屬的資料科學中心才能進行分析。

大多申請的案件是衛服部的計畫或是碩博士論文。其中申請流程包誇通過IRB(人體試驗委員會)核可等等相關的流程。

提供IRB核可後,可以向衛服部提出申請。在申請的過程中,需要填寫勾選表(也就是需要的欄位),填寫每個欄位需要申請的原因。初審過後繳費,並且等待資料處理。

簡短了介紹申請資料庫的流程,但申請是非常花時間的。記得今年在四月左右處理IRB文件,接續處理申請計畫書與研究計畫。五月中時將填寫好的文件送到衛服部,一來一往更改後大約四週後通過初審,再過四週後通過複審,進行繳費。流程大約花費兩個多月的時間。當然不是申請完就能夠馬上使用資料,資料處裡可能再花上2.5個月的時間。

所以前前後後從申請IRB到能夠使用資料,大約也要半年的時間,目前預計這個月底我可以使用新的資料。

剛剛有提到使用資料需要在衛服部所屬的資料科學中心才能進行分析。
進去資料中心是不能帶任何電子產品的,不能攜帶手機、USB、電腦等相關用品,必須兩手空空只帶頭腦進去,進行一切的分析。而且必須是國人才能進入加值中心。

當然,攜出資料也有相關的規定,不能攜帶小於三的統計結果等等。所以可以看得出來這份工作是蠻需要專業的,進去後只能靠自己一個人分析,有時間限制與專業的考驗。


資料庫介紹

再來就是介紹有甚麼資料可以使用了,但是這邊不一一贅述,資料庫有八十幾份資料可以選擇(一開始就需要依照資料檔與欄位選擇,並且計算費用)如果想知道有哪些資料可以到衛服部的統計處查看

最常用的資料庫為健保資料庫與癌症登記檔:

健保資料庫可以分為三個部分:

  1. 費用檔 
    全民健保處方及治療明細檔_門急診
    全民健保處方及治療明細檔_住院
    全民健保處方及治療明細檔_藥局
    全民健保承保檔
  2. 醫令檔
    全民健保處方及治療醫令明細檔_門急診
    全民健保處方及治療醫令明細檔_住院
    全民健保處方及治療醫令明細檔_藥局
  3. 基本資料檔
    醫事機構現況檔
    醫院醫療服務量檔
    醫事機構基本資料檔

整個健保資料庫的核心在於費用檔,它紀錄了就診病患、醫師、疾病、時間、院所,以及費用的相關資訊。
費用檔不但明列了就診的總費用,還記錄了根據不同檢查、診療,處置等項目。其中也包誇時間相關的變項:就診日期、申報日期、住院日期和急慢性病床天數。並且也記錄的病患就診的原因。

相較於費用檔,醫令檔所紀錄的變數相對簡單。除了串連費用檔所須變數外,就只有醫令類別、醫令代碼、醫令單價、醫令數量,以及總金額等變數。
但是醫令檔的數量大過費用檔。

整個健保資料庫最龐雜的應屬基本資料檔。基本資料檔共包括了六個和醫療院所相關,兩個和就診醫師相關,以及兩個和就診病人相關的十個檔案。


癌症登記檔

  1. 長表 Long Form (LF)
    子宮頸癌、乳癌、口腔癌、肺癌、肝癌、結直腸癌、攝護腺癌、胃癌、食道癌、膀胱癌、鼻咽癌、主唾液腺癌、子宮體癌、卵巢癌和血液腫瘤
    95年以前共有65個欄位,96年後共有95個欄位
  2. 短表 Short Form (SF)
    95年以前共有20個欄位,96年後共有33個欄位
  3. TCDB

癌症登記檔主要是由長表LF、短表SF以及TCDB組成。最常使用且最完整的為長表LF,總共收錄15種癌症,表示這十五種癌症的完整資料都在長表中。
而短表與TCDB的資料就沒有長表這麼齊全。

以下為長表的變項,其中紅色的部分是短表的變項,表示黑色這些項目短表都沒有。

在分析資料時時常會使用癌症的期別、TNM的期別,都無法使用。
所以若是想要分析的資料不是長表收錄的十五種癌症,就會發現有很多需要的資料卻沒有欄位。


資料使用實例分享

可以使用資料之後,你會發現無法馬上分析。因為資料都分散在各個檔案中,無法連結。

各個檔案中都有能夠連結的對照鑑值,像是連結醫療機構資料檔會使用Hosp_ID,醫令檔連結明細檔使用的對照鑑值有六項: FEE_YM、APPL_TYPE、APPL_DATE、CASE_TYPE、SEQ_NO、HOSP_ID,需要這些關鍵鑑值才能夠串聯這些檔案。


因為無法在網路上分享我目前分析過的資料,但是可以簡單敘述一下:

在做數據分析、統計檢定時,最重要的就是要篩選樣本。事實上篩選樣本的過程也是最花時間的,整理資料+資料串檔+篩選樣本可能就會花上80%的時間。

假設現在有興趣的是某個癌症(例如:乳癌),需要先篩選符合的病人(ICD : C50) ,另外可能因為病人的某種症狀會影響研究結果,所以在篩選樣本時也會先排除(比如希望能排除已經有癌症的病患 等等) 
(非常輕描淡寫的形容……)

接下來也要注意要使用的變項,比方性別、年齡、癌症期別、是否做過化學治療、放射線治療、賀爾蒙治療等等。
有時候變項並不是直接出現在資料庫中,有時候我們想知道病人的共病症分數(Charlson comorbidity index; CCI),就需要寫程式將計算每一位的CCI index。

接下來就可以進行分析了!


使用健保資料庫的優缺點

台灣有99.9%人使用健保,所以健保資料庫非常接近全台的醫療狀況。
健保資料庫的第一個優點就是 : 量大、並且貼近台灣的醫療情況

我們來看看下面一張圖,這是A組(紅色虛線)和B組(藍色實線)的五年overall survival 。
光用眼睛看,你覺得哪一個存活比較好呢?

若是光看圖的話,兩組的存活非常接近,可能分不出區別。

但是這兩組存活的 log-rank test的 p-value<0.0001,表示兩組是有顯著差異的,A組(紅色虛線)的存活好於B組,並且是有統計上的差異。

這就是使用健保資料庫的好處,當差異很小時,我們的統計檢驗是很重要的。因為資料庫的數據龐大,即使兩組的結果非常靠近,也能有統計上的顯著差異。


再來要提到缺點,在全國醫院的努力下,台灣擁有如此健全的資料庫
但是可能有些人(先說不是我)覺得資料不夠一致,這樣的資料需要經過太多人的手,定義上不夠完全,一定會有些出入

也就是所謂的 Garbage in, Garbage out

這我也曉得,當收集資料的質量不好時,當然無法有可信的研究結果

但是在健保資料庫上是有方法可以解決的,當我們的樣本夠多,就能夠進行篩選。比方再篩選樣本時挑選已經有癌症的病患或是各種會影響實驗結果的項目。所以…

只要做好正確的篩選,當我們能夠收集到足夠的樣本,就能幫助我們得到正確的研究結果。

健保資料庫是非常有利用價值的,就取決於你如何使用它。

2020-10-16 0 comment
0 FacebookTwitterPinterestEmail
機器學習

CNN的應用 What can CNN do? (Part3)

by wenwu 2020-09-02

CNN的應用 What can CNN do? (Part3)

今日的課程來自於: https://youtu.be/5BJDJd-dzzg (54分-79分)

前兩篇中分別介紹了 CNN如何使用、CNN是如何運作的
今天要來介紹幾種CNN的應用方法


Deep Dream

Deep Dream就是,如果你給machine一張image,他會在這image加上他看到的東西,將圖片丟到CNN裡面去,然後你把某一個convolution layer裡面的filter或 fully connected layer 裡的某一個 hidden layer 的output (vector)拿出來,把裡面的值調大(正的調大,負的調小),然後把它作為新的image的目標

調整好之後,然後用gradient descent 的方法找一張image X,讓他通過這個hidden layer後的output 就是你調整的target,這麼做的目的就是,讓CNN誇大化他看到的東西 — make CNN exaggerates what is sees

也就是說,如果某個filter有被activate,那你讓他被activate的更劇烈,CNN可能本來看到了某一樣東西,那現在你就讓他看起來更像原來看到的東西,這就是所謂的誇大化

將上面的image 拿去做Deep Dream 的話,你看到的結果就會像下面這個樣子

你會發現,圖片中有一些念獸,要仔細看才看得到,比方像右側的熊,他原本只是一個石頭,對機器來說,它在看這張圖片時,本來就覺得像一隻熊,所以你更強化這件事,讓他看起來真的就變成了一隻熊,這就是deep dream


Deep Style

Deep Dream還有一個進階的版本,就叫做Deep Style,如果今天你input 一張image,Deep Style 做的事情就是讓machine去修改這張圖,讓他有另外一張圖的風格,如下圖所示:

具體的做法參考reference: A Neural Algorithm of Artistic Style

可以發現將image餵給機器之後,出現了一張像吶喊的照片
Deep Style 的思路如下: 你把原本的image丟給CNN,得到CNN filter的 output,代表這樣image裡面有甚麼樣的content,然後你把吶喊也丟到CNN裡面得到filter的output
注意! 我們並不在乎一個filter output的value到底是什麼,一個單獨的數字並不能代表任何問題,我們真正在意的是,filter和filter的output之間的correlation,這個correlation代表一張image的style

接下來你就再用一個CNN去找一張image,這張image的content像左邊的圖片,比如這張的image的filter output的value像左邊的圖片;同時,讓這張image的style像右邊的圖片,所謂的style像右邊的圖片是說,這張image output的filter之間的correlation像右邊這張圖片

最終你用gradient descent找一張image,同時可以maximize左邊的content和右邊的style,他的樣子就像上圖左下角所示


CNN 使用於AlphaGo | What does CNN do in Playing Go

CNN 不只可以處理影像,還可以應用於其他東西上,比如出名的alphaGo

想讓machine來下圍棋,不見得要使用CNN,其實一般typical的neural network也可以幫我們做到這件事情

你只要learn一個network,也就是找一個function,他的input是棋盤當前的局勢,output是你下一步落子的位置,這樣其實就可以讓machine學會下圍棋了,所以用fully connected 的 feedforward network 也可以做到讓machine下圍棋這件事情

也就是說,你只要告訴她input是一個19*19的vector,vector的每一個dimension對應到棋盤上的某一個位置,如果有一個黑子就是1,如果有一個白子的話就是-1,沒有東西就是0。所以你若把棋盤描述成一個19*19的vector,丟到fully connected的feedforward network裡,output也是19*19個dimension,每一個dimension對應到棋盤上的一個位置,那machine就可以學習下圍棋了

但實際上,如果我們使用CNN的話,可以得到更好的performance,我們之前舉的例子都是把CNN應用在圖片上面,也就是input一個matrix,而棋盤也可以表達成一個19*19的matrix,那對CNN來說,就直接把他當成一個image來對待,然後再output下一步要落子的位置,具體的training process是這樣子的:

Why CNN for Playing Go

自從AlphaGo用了CNN之後,大家都覺得CNN很厲害,所以有時候如果你沒有用CNN處理問題,人家可能來問你,你怎麼沒有用CNN,他可能不知道CNN是什麼,但是他就會問你為甚麼沒有用CNN,CNN不是比較強嗎?

什麼時候可以用CNN呢? 你的image該有哪些特性,也是CNN(part 1)提到的三點:

  1. Some patterns are much smaller than the whole image
  2. The same patterns appear in different regions
  3. Subsampling the pixels will not change the object

CNN能夠用在AlphaGo上,因為圍棋有一些特性和圖像處裡是很相似的

在property 1, 有一些pattern是比整張image要小的,在圍棋上,可能也有同樣的現象。我們只需要偵測一部分就能知道是否白子處於被吃的狀態,我們不需要看一整張棋盤,這跟image有著同樣的性質;在AlphaGo裡面,他第一個layer其實就是用5*5的filter,顯然做這個設計的人,覺得圍棋上最基本的patten可能都是在5*5的範圍內可以被偵測出來

在property 2,同樣的pattern可能會出現在不同的region,在圍棋上可能也有這個現象,像這個叫吃的pattern。所以你可以用同一個detector,來處理這些在不同位置的pattern

所以對圍棋來說,他在第一個observation和第二個observaion是有image的特性的,但是沒有辦法想通的,就是第三點Max pooling

Max pooling for AlphaGo? — read alpha-go paper

我們可以對一個image做subsampling,拿掉奇數行、偶數列的pixel,把image變成原本的1/4也不會影像你看這個圖的樣子,基於這個觀察才有Max pooling這個layer;但是對圍棋來說,好像不適合作max pooling

我們來看AlphaGo的paper,他只說使用了CNN,卻沒有在正文裡面仔細苗訴他的CNN架構,但是在附錄中,其實是有描述neural network structure的,如下圖所示

他是這樣說的,input是一個19*19*48的image,其中19*19是棋盤的格局,對AlphaGo來說,每一個位置都用48個value來描述,因為加上了domain knowledge,他不只是描述某位置有沒有白子或黑子,他還會觀察這個位置是不是處於被吃得狀況等等

先用一個hidden layer對 image做 zero padding,也就是把原來19*19的image外圍捕0,讓她變成一張23*23的image,然後使用k個5*5的filter對該image做convolution,stride設為1,activation function 用的是ReLU,得到的output是21*21的image;接下來使用k個3*3的filter,stride=1,activation function 還是使用ReLU,……

你會發現這個AlphaGo的network structure 一直在用convolution,其實根本就沒有使用Max pooling,原因並不是疏失了甚麼,而是根據圍棋的特性,本來就不需要Maz pooling

Neural Network 架構的設計,是應用之道,存乎一心


More Application — Speech、Text

Speech

CNN不只可以應用在圍棋上,也可以使用於語音處裡,我們把一段聲音表示成spectrogram,spectrogram的橫軸是時間,縱軸是這段時間裡聲音的頻率

下圖是一段”你好”的音頻,偏紅色代表這段時間裡該頻率的energy是比較大的,也就對應著”你”和”好”這兩個字,也就是說spectrogram用顏色來描述某一個時刻不同頻率的能量

我們也可以讓機器把這個spectrogram當作一張image,然後讓CNN來判讀,input這張image對應著甚麼樣的聲音信號,那通常用來判斷結果的單位,比如phoneme,就是類似音標這樣的單位

這邊比較神奇的地方就是,當我們把一段spectrogram當作image丟到CNN裡面的時候,在語音上,我們通常只考慮在frequency(頻率)方向上移動的filter,我們的filter就像上圖這樣,是長方形的,他的寬跟image的寬是一樣的,並且filter只在Frequency即縱座標上移動,而不再時間的序列上移動

這是因為在語音裡面,CNN的output後面都還會在接別的東西,比如LSTM之類,他們都已經有考慮typical 的 information,所以你在CNN裡面再考慮一次時間的information其實沒什麼特別的幫助,但是為甚麼在音頻上的filter有幫助呢?

我們用CNN的目的是為了用同一個filter把相同的patten給detect 出來,在聲音訊號上,男女說同樣畫看起來這個spectrogram是非常不一樣的,但只是一個頻率的shift(位移)而已,其實pattern是相同的,比如pattern是spectrogram變化的情形,男女的聲音片化情況可能是一樣的,他的差別可能只是所在的範圍不同而已,所以filter在frequency的direction上移動是有效的

所以,這又是另一個例子,當你把CNN用在一個Application的時候呢,你永遠要想一想Application的特性是甚麼,根據這個特性你再去design network的structure,才會真正在理解的基礎上去解決問題


Text

CNN也可以用在文字處理上,假設你的input是一個word sequence,你要做的事情是讓machine偵測這個word sequence代表的意思是positive的還是negative的

首先你把這個word sequence裡面的每一個word都用一個vector來表示,vector代表的這個word本身的semantic(語意),那如果兩個word本身含意越接近的話,他們的vector在高維的空間上就越接近,這個東西就叫做word embedding

把一個sentence裡面所有word的vector牌再一起,它就變成了一張image,你把CNN套用這個image上,那filter的樣子就是上圖的藍色matrix,他的高和image的高是一樣的,然後把filter沿著句子裡詞彙的順序來移動,每一個filter移動完成之後都會得到一個由內積結果組成的vector,不同的filter就會得到不同的vector,接下來做max pooling,然後把max pooling的結果丟到fully connected layer裡面,你就會得到最後的output

與語音處理不同的是,在文字處理上,filter只在時間的序列(按照word的順序)上移動,而不在這個embedding的dimension上移動;因為在word embedding裡面,不同dimension是independent的,他們是互相獨立的,不會出現有兩個相同的pattern的情況,所以在這個方向上面移動的filter是沒有意義的

所以這又是另外一個例子,雖然大家覺得CNN很powerful,你可以用在各種不同的地方,但是當你應用到一個新的task的時候,你要想一想這個新的task在設計CNN架構的時候,到底要怎麼做


Conclusion

本篇的重點在於CNN 的theory base,也就是What is CNN? What does CNN do? Why CNN? 總結起來就是三個preperty,兩個架構和一個理念,這也是用CNN的基礎:

三個Property:

Some patterns are much smaller than the whole image (property1)

The same patterns appear in different regions (property2)

Subsampling the pixels will not change the object (property3)

兩個架構:

Convolution 架構: 針對 property 1 和 property 2

Max pooling 架構: 針對 property 3

一個理念:

針對不同的application要設計符合他特性的network structure,而不是生硬套用,這就是CNN架構的設計理念: 應用之道,存乎一心

2020-09-02 0 comment
0 FacebookTwitterPinterestEmail
統計分析

成本效益分析(Cost-benefit analysis)

by wenwu 2020-08-27

成本效益分析(Cost-benefit analysis)
成本效益分析用於醫療科技中

成本效果分析(Cost-effectiveness analysis, CEA)

成本效果分析同時考量成本及效果,常用於醫療之經濟評估方法。故成本常使用於醫療費用,效果單位為自然單位(natural units),例如可增加的存活年分、血壓、血糖等生理數值。

通常以”可以延長或拯救一年壽命之花費”來表示醫療成本。拯救一年生命年數之成本計算為,一年的醫療實際花費/拯救的生命年數。

若是從數個成本及效果不盡相同,但是值得施行的方案中,選擇一個最佳的方案,不論被評估的方案性質為何,只要效果測量的自然單位(ex: 可增加的存活年)是相同的,均可採行此方法。


遞增成本效果比值(Incremental cost-effectiveness ratio, ICER)

遞增成本效果比值(ICER)為成本效果分析(CEA)的主要統計指標,用於總結醫療保健干預措施的成本效益。成本效果分析(CEA)為單個方案的評估,而比較兩個方案間的成果與效果比值,可使用遞增成本效果比值(ICER)進行比較。
遞增成本效果比值(ICER)的公式如下:

C1 和 E1 分別表示實驗組的成本(Cost)及效果(Effect),而C0 和 E0 分別表示對照組的成本(Cost)及效果(Effect)。成本通常以貨幣單位來描述,而效果可以根據健康狀況或其他感興趣的結果進行衡量。

ICER 可以良好的表達成本效果,因為在同一個區間中,可以同時比較兩組人的增加成本以及增加效果。因此可以比較在某區間中,增加的花費及效果。(例如: 增加一年的存活,需要增加多少費用。)

其中,ACER(平均成本效果比值)將每個成本除以其效能,ACER因在決策上容易產生誤導,並不建議將ACER作為成本效益分析的指標。

因此為了利於不同研究間的結果比較,成本效用分析及成本效果分析仍應以遞增成本效果比值(ICER)為主要的成本效益分析指標


Example

圖中的X軸表示: Effect(E)效果(成功治療的病例數),Y軸表示: Cost(C)成本。

PPM DOTS in hospital 的成本與效果分別為(E=300, C=600000)
DOTS in community health center 的成本與效果分別為(E=200, C=200000)
可以發現,兩種方法的費用差了40萬,治癒的病例數差了100位。若我們使用ICER來表達的話:

ICER= (600000–200000)/(300–200)=4000

表示每增加一位成功治療的話,需要增加4000的成本。

而圖中提到ACER(Average cost-effectiveness ratio)則是分別計算兩組在每個成功治療的人的成本比值

ACER(PPM)=600000/300=2000
ACER(DOTS)=200000/200=1000

表示在PPM的方法中,每成功治療一個人需要花費2000元。
而DOTS表示,每成功治療一個人需要花費1000元。


Conclusion

或許你覺得有點奇怪,為什麼ICER告訴我 “每增加一位成功治療的話,需要增加4000的成本。” 但是看到ACER(PPM)=2000,治療一個人使用2000就好了啊,為甚麼要增加4000塊才能增加一位成功治療。

這是因為這裡ACER只單計算成功治療一位患者的花費,我們不知道背後兩種方法每一分錢使用的差異在哪裡? 
但是使用ICER比較這兩種方法,我們可以知道的是,如果我們希望從原本的DOTS方式改成PPM的方式,若增加4000的成本可以增加一位成功治療的患者。

2020-08-27 0 comment
1 FacebookTwitterPinterestEmail
機器學習

Deep-learning 是一個黑盒子? CNN是如何運作的呢? (part2)

by wenwu 2020-08-20

Deep-learning 是一個黑盒子? CNN是如何運作的呢? (part2)

今日的課程來自於: https://youtu.be/5BJDJd-dzzg (33-54分)

What does CNN learn?

What is intelligent?

今天我們要來分析CNN是如何運作的?

我們都知道如果若是有一個模型,他的方法我們可以輕易知道她如何運作的話,那我們自然也不會覺得這個方法 “intelleigent” 了! 
大家都說deep learning 就是一個黑盒子,我們根本就無法知道訓練的東西為甚麼是這樣子,有些人甚至無法相信他。但是其實我們還是可以分析的,今天就來看一下要如何分析CNN,看他到底學了甚麼?

今天本篇會提到三點,分別從 filter 、neuron 和output 來解釋。


就如前一篇提到的 Convolutional Neural network 卷積神經網路 的CNN的架構,重複數次的 Concolution和max pooling,再做Flatten 和 Fully connected network。

第一層的Convolution 的filter是比較容易的,在上一篇的講解提到,這一個3*3 matrix 的filter就是要在這3*3=9 個pixel內,找到特定的patten 。
接下來第二層的filter就開始很難解釋了,因為她的input是做完 convoluion 在做Max pooling 的結果,因此filter考慮的範圍並不是3*3的pixel,而是一個3*3*25的cubic,所以我們很難知道他是怎麼運作的。

那我們先來看filter如何運作


What does filter do?

我們要怎麼分析一個 filter 在做什麼呢? 我們可以這樣做:

我們知道在第二個convolution layer裡面的50個filter,每一個filter的output就是一個11*11的matrix, 假設我們把第 k 個filter的output拿出來,如下圖表示,這個matrix裡的每一個element,我們叫他a_ij^k,上標k表示這是第k個filter,下標i j 表示matrix 里第i個row和第j個column。

接下來定義a^k 叫做degree of the activation of the k-th filter,這個值表示現在的第k個filter,他有多被activate,有多被”啟動”(活躍),值觀來說就是描述現在input的東西跟第k個filter有多接近,他對filter的激活程度有多少,a^k的計算方式如下:

也就是說,我們input一張image,然後把這個filter和image進行捲積所output的11*11的值都加起來,當作現在這個filter被activate的程度

接下來我們要做的事情是這樣的,我們想要知道第 k 個filter的作用是什麼,那我們就找一張image,希望這張image可以讓第k個filter被activate的程度最大 ; 也就是現在要找一張image X ,它可以讓我們定義的activation的degree a^k最大,即:

之前我們求minimize用的是gradient descent,那現在我們求Maximum用gradient ascent(梯度上升法)就可以做到這件事了

仔細一想這個方法蠻奇妙的,因為我們現在是把input x做為要找的參數,他對去用gradient descent 或ascent 進行update,原來在train CNN時,input 是固定的,model的參數是要用gradient descent 去找出來的;但是現在相反,這個task裡面的model的參數是固定的,我們要用gradient ascent 去update 這個 X,讓他可以使degree of activation最大

上圖就是得到的結果,基本上幾個filter就可以分別找到幾張使對應的activation最大的圖,這裡只有12張作展示。

這些image 上有一個公同特徵,就是裡面都是依些反覆出現的某種texture(紋路)。像第三張布滿了小小的斜條紋,表示第三個filter就是detect圖上有沒有斜條紋。如果整張image上布滿這種斜條紋的話,這個時候他會最興奮,他的degree of activation 會最大,也就是filter的activation程度最大,相對應的output值也會達到最大

因此每個filter的工作就是去detect每一種patten,detect某一種線條,上圖所示的filter所detect的就是不同角度的線條,所以今天input有不同線條的話,某一個filter會去找到讓它興奮度最高的匹配对象,這個時候它的output就是最大的


What does neuron do?

第二個要討論neuron是怎麼運作的。

我們做完convolution 和 max pooling 之後,會將結果用Flatten展開,然後丟到Fully connected 的neural network 裡面去,之前已經搞清楚filter是作什麼的,那我們也想知道每一個neuron是作什麼的,所以就對剛才的做法如法炮製

我們定義第j個neuron的output就是a_ij,接下來用gradient ascent 的方法去找一張image X,把他丟到neural network裡面就可以讓 a_j的值被maximize,即:

找到的結果如上圖所示,這裡只有9張image作為展示,會發現這九張圖和之前的情況不一樣,剛才在filter上發現是紋路的東西;但是在做完Flatten以后,每一個neuron不再是只看整張圖的一小部分,它現在的工作是看整張圖,所以對每一個neuron來說,讓它最興奮的、activation最大的image,不再是texture,而是一個完整的圖形


What about output?

接下來我們來討論CNN的output,由於是手寫辨識的demo,因此這裡的ouptut就是10 維,我們把某一維拿出來,然後同樣去找一張image X ,使這個維度的output值最大,即

你可以想像說,既然現在每一個output的每一個dimension就對應到一個數字,那如果我們去找一張image X,它可以讓對應的數字1的那個output layer 的neuron 的 output值最大,那張紙image顯然應該看起來會像是數字1,你甚至可以期待,搞不好這個方法就可以讓machine自動畫出數字

但實際上,我們得到的結果是這樣子,如下圖所示

上面的圖片對應為0-8,你會發現這些圖片看起來一點都不像數字,就像是電視機壞掉的樣子。為了證實這個程序有沒有Bug,這裡做了一個實驗,就是把上述得到的圖片真的做testing data 丟到CNN裡面,結果classify的結果確實還是認為這些image就對到0-8

所以今天這個neural network,它所學到的東西跟我們人類一班的想像認知是不一樣的

那我們有沒有辦法,讓上面這個圖看起來更像數字呢? 想法是這樣,我們知道一張圖是不是一個數字,它會有一些基本的假設,比如這些image,你不知道他是什麼數字,你也會認為它顯然就不是一個digit,因為人類手寫出來的東西就不是長這樣子的,所以我們要對這個 X 做一些 regularization,我們要對找出來的X做一些constraint(限制約束),我們應該告訴 machine說,雖然有一些X 可以讓你的Y 很大,但他們不是數字

那我們應該加上什麼樣的constraint 呢? 最簡單的想法是說,畫圖的時候,白色代表有墨水的地方,而對一個digit 來說,整張 image 上塗白的區域是有限的,像上面整張都白白的一定不會是數字

假設image裡的每一個pixel都用x_ij表示,我們把所有pixel值取絕對值並求和,也就是之前提到 L1的regularization,再用y^i減去這一項,得到

這次我們希望再找一個input X,它可以讓y^i 最大的同時,也讓L1的regularization 越小越好,也就是說我們希望找出來的image,大部分的地方都是沒有塗色的

加上這個constraint以後,得到的結果會像下圖右側所示一樣,已經隱約有一點數字的樣子了

如果再加上一些額外的constraint ,比如你希望相鄰的pixel是同樣的顏色,你應該就可以得到更好的結果


今天就用三個方面 filter 、neuron 和output 來解釋CNN是如何運作的,下一篇會介紹CNN的一些應用

2020-08-20 0 comment
0 FacebookTwitterPinterestEmail
機器學習

Convolutional Neural network 卷積神經網路(part1)

by wenwu 2020-08-11

Convolutional Neural network 卷積神經網路(part1)

今日的課程來自於: https://youtu.be/5BJDJd-dzzg (0-33分)

為什麼要使用CNN 於影像處理?

CNN vs DNN

我們當然可以使用一般的neural network 來做影像處理,不一定要用CNN。但是我們會遇到一個問題,每一個就是在處理影像辨別時,使用fully connetcted 的 feedforward network來做圖像處裡時,往往需要太多數據。

舉例來說,一張100*100的彩色圖片,他的辨別率才100*100,將他拉成一個vector,他總共有100*100*3(彩色需要三個value)=三萬維了。如果input 是三萬為,假設hidden layer 有1000個neuron,那僅僅是第一層hidden layer的參數就已經有30000*1000個了,這樣太多了。

所以CNN做得事情其實是,用簡化這個neural network的架構,我們根據自己的知識和對圖像處裡的理解,一開始就把某些實際上用不到的參數給過濾掉,我們一開始就使用較少的參數來處理,所以CNN其實是比一般的DNN還要簡單的

雖然CNN看起來比較複雜,但事實上他的模型比DNN還要簡單,我們就是用prior knowledge,去把原來fully conected 的layer 裡面的一些參數拿掉,就變成CNN


Why can we discard some parameters?

為什麼可以減少一些參數呢? 為什麼可以減少參數還可以做圖像處裡?
下面有三點對影像處裡的觀察:

1. Some pattens are much smaller than the whole image

在影像處理中,如果在network的第一層hidden layer裡,那些neuron要做的就是偵測有沒有一種特定的patten出現。所以並不需要看整張image,只需要看這張image 的一小部分,就可以解決這件事情了

舉例來說,假設現在我們有一張鳥的圖片,那第一層的hidden layer的某一個neuron的工作是,偵測有沒有鳥嘴。其實不需要看整張圖片,只需要給neuron看重點就可以了。每一個neuron其實只要連接到一個小塊的區域就好,它不需要連接到整張完整的圖,因此也對應更少的參數

2. The same patterns appear in different regions

同樣的patten,可能會出現在image的不同部位,但是他們有同樣的形狀,因此可以用同樣的neuron,同樣的參數,被同一個detector檢測出來。

舉例來說,圖片中可能有一個處於圖左上角與中間的鳥嘴,這時不需要訓練兩個不同的detector去專門偵測左上角有沒有鳥嘴和中間有沒有鳥嘴,我們需要cost down(降低成本),所以我們可以要求這些功能幾乎一致的neuron共用一組參數,他們share同一組參數就可以減少參數的量

3. Subsampling the pixels will not change the object

我們可以對一張image 做subsampling( 二次抽樣),將image 抽掉奇數行、偶數列拿掉,變成原來的十分之一。這不會影響我們對圖片的理解,因此我們可以利用subsampling 這個概念把image 變小,從而減少需要用到的參數量


CNN的架構

整個CNN的架構是這樣的,收到一張圖片之後,重複 Concolution和max pooling (這兩個步驟可以進行多次,重複次數需要先決定),這個過程就是network的架構,就像network會有好幾層一樣。
之後要做的是Flatten(將矩陣拉直),在將flatten output丟到一般的Fully connected network,最終得到影像辨識的結果。

我們基於之前提到三個對影像處理的觀察:

  1. 偵測不需要整張image,只需要一部分
  2. 同樣的patten會出現在一張圖片的不同區域,可以使用同樣的參數
  3. 我們可以對整張image做subsampling

前面兩點的特性是用convolution 的layer來處理的,最後的特性是用max pooling 來處理


Convolution

假設現在我們network的input是一張6*6的image。圖片是黑白的,所以每個pixel只需要一個value來表示。而在convolution layer裡面,有一堆Filter,這裡的每一個Fliter,其實就等同於是Fully connected layer 裡的一個neuron

Property1

每一個Fliter 就是一個matrix ,這個matrix 裡面每一個element的值,就跟那些neuron的weight和bias一樣,是network的parameter,他們都是通過training data學出來的,而不是人去設計的

所以每個Fliter裡面的值是甚麼,要做什麼事情,都是自動學出來的,下圖中的filter是3*3的size,意味著他在偵測一個3*3的patten。當她偵測的時候,並不會去看整張image,他只看一個3*3裡的pixel,就可以判斷某一個patten有沒有出現,這就是考慮property 1 了

Property 2

這個filter是從image的左上角開始,做一個slide window,每次向右移動一個距離,這個距離就叫做stride,由你自己設定,每次filter停下來的是侯就跟對應的3*3matrix做一個內積。這裡設定stride=1 ,那麼我們的filter每次移動一格,到最右邊就從下一行最左邊重複進行上述操作,經過一整個convolution的process,最終得到下圖所示的4*4 matrix

觀察上圖的filter 1 ,它的斜對角是1,1,1,所以這個fliter的工作就是找出有沒有連續的從左上角到右下角的1,1,1出現在這個image裡面。 檢測到的結果已在上左圖用藍色標示出來,此時fliter得到的和積在左上和左下得到最大的值。這就是說,該fliter所要偵測的pattern出現在image的左上角和左下角

同一個pattern出現在image左上角的位置和左下角的位置,並不需要用到不同的filter,我們用filter1就可以偵測出來,這就考慮property 2

Feature map

在一個convolution的layer裡面,他會有一堆filter,每一個filter做完會得到一個4*4matrix,將所有的filter做完之後,就會得到很多個4*4matrix,將這些matrix合起來,就叫做Feature Map

CNN 對不同scale的相同pattern的處理上存在一定的困難,因為現在每一個filter size都是一樣的。這意味著,如果有同一個pattern,它有不同的size,但CNN並不夠自動處裡這個問題;DeepMind曾經發過一篇paper,上面提到當你input一張image的時候,他在CNN面前,再接到另一個network,這個network做的事情是,他會output一些scalar,告訴你這個image的裡面的那些位置要做旋轉or縮放,再丟到CNN裡面,這樣你其實會得到比較好的performance


Colorful image

剛剛的例子是黑白的image,所以你input的是一個matrix,如果今天是彩色的image就必須由RGB組成。所以彩色的image就是好幾個matrix疊再一起,是一個立方體,如果今天要處理彩色的image,要怎麼做呢?

這個時候你的filter 就不在是一個matrix了,他也會是一個立方體,如果你今天是RGB這三個顏色來表示一個pixel的話,那你的input就是6*6*3,你的filter 就是3*3*3,你的filter 的高就是3,你在做convolution的時候,就是把這個filter的9個值跟這個image裡面的9個值最內積,可以想像成filter的每一層都分別跟image的三層做內積,得到的也是一個三層的output,每一個filter同時就考慮了不同顏色所代表的channel


Convolution vs Fully Connected

filter 是特殊的 ”neuron”

convolution 跟 fully connected 有什麼關係。其實convolution就是一個neural network。
convolution這件事情,其實就是fully connected 的layer把一些weight拿掉而已,下圖的綠色方框標示出的feature map 的output ,其實就是hidden later 的 neuron的output ( 可以將矩陣拉直,沒有使用的weight 給零)

每個 “neuton” 只檢測 image的部分區域

比照fully connected 的neuron是必須連接到所有36個input上的,但是我們現在只用連接9 個input ,因為我們知道要detect一個patten,不用看整張image,看9個input pixel就夠了,所以當我們這麼做的時候,就用了比較少的參數

“neuton” 之間共享參數

在fully connected layer裡面,每一個neuron應該都有自己獨立的weight。但是當我們做這個convolution的時候,首先我們把每一個neuron前面連接的weight減少了,然後我們強迫某些neuron 要共享一組weight,雖然這兩個neuron連接到的pixel對象各不相同,但他們的weight都必須是一樣的,等於filter裡面的元素值,就叫做weight share。
當我們做這件事的時候,用的參數又比之前更少。


conclusion

因此我們可以這樣想,有這樣一些特殊的neuron,它們只連接著9條帶weight的線。當filter在image matrix上移動做convolution的時候,每次移動做的事情實際上是去檢測這個地方有沒有某一種pattern,對於Fully connected layer來說,它是對整張image做detection的,因此每次去檢
測image上不同地方有沒有pattern其實是不同的事情,所以這些neuron都必須連接到整張image的所有pixel上,並且不同neuron的連線上的weight都是相互獨立的。

那對於 convolution layer來說,首先它是對 image的一部分做 detection的,因此它的 neuron只需要連接到 image的部分 pixel上,對應連線所需要的 weight參數就會減少;其次由於是用同一個 filter去檢測不同位置的 pattern,所以這對 convolution layer來說,其實是同一件事情,因此不同的 neuron,雖然連接到的 pixel對象各不相同,但是在”做同一件事情”的前提下,也就是用同一個 filter的前提下,這些 neuron所使用的 weight參數都是相同的,通過這樣一張 weight share的方式,再次減少 network所需要用到的 weight參數

CNN的本質,就是減少參數的過程


Max pooling

operation of max pooling

相較於convolution,max pooling是比較簡單的,它就是做subsampling,根據filter 1,我們得到一個4*4的matrix,根據filter 2,你得到另外一個4*4的matrix,接下來,我們要做什麼事呢?

我們把output四個分為一組,每一組裡面通過選取平均值或最大值的方式,把原來4個value合成一個 value,這件事情相當於在image每相鄰的四塊區域內都挑出一塊來檢測,這種subsampling的方式就可以讓你的image縮小!

講到這裡你可能會有一個問題,如果取Maximum放到network裡面,不就沒法微分了嗎? max這個東西,感覺是沒有辦法對它微分的啊,其實是可以的,後面的章節會講到Maxout network,會告訴你怎麼用微分的方式來處理它


Convolution + Max pooling

做完一次convolution加一次max pooling,我們就把原來6*6的image,變成了一個2*2的image;至於這個2*2的image,它每一個pixel的深度,也就是每一個pixel用幾個value來表示,就取決於你有幾個filter。幾個filter 代表深度有幾維。
所以,這是一個新的比較小的image,它表示的是不同區域上提取到的特徵,實際上不同的filter檢測的是該image同一區域上的不同特徵屬性,所以每一層channel(通道)代表的是一種屬性,一塊區域有一種不同的屬性,就有一層不同的channel,對應的就會有一個不同的filter對其進行convolution操作。

這件事情可以重複很多次,可以把得到的這個比較小的image,再次進行convolution 和 max pooling ,得到更小的image ,以此類推

這裡有一個問題: 假設我第一個convolution有25個filter ,通過這些filter得到25個feature map ,然後repeat的時候第二個convolution也有25個filter,那麼做完之後是不是會得到25² 個feature map ?

其實不是這樣的,你這邊做完一次convolution,得到25個feature map 之後再做一次convolution,還是會得到25個feature map,因為convolution在考慮input的時候,是會考慮深度的,他並不是每一個channel分開考慮,而是一次考慮所有的channel,所以你 convolution這邊有多少個 filter,再次output就會有多少個 channel

因此你這邊有25個 channel,經過含有25個 filter 的 convolution之後 output還會是25個 channel,只是這邊的每一個 channel,他都是一個cubic,他的高有25個 value這麼高


Flatten

做完convolution 和 max pooling 之後,就是Flattne 和 Fully connected Feedforward 的部分

Flatten 的意思是,把左邊的feature map 拉直,然後丟進一個 Fully connected Feedforward network,然後就結束了。也就是說,我們之前通過CNN提出了image的feature,他相較於原先一整個image的vector,少了很大一部分的內容,因此需要的參數也大量的減少了,但最終,也還是要丟到一個Fully connected 的network中去做最後的分類工作


CNN in Keras

內容簡介

接下來就來講一下,如何用Keras來implement CNN,實際上在compile、training和fitting的部分,內容和DNN是一樣的。對CNN來說,唯一需要改變的是network structure,以及input的format

本來在DNN裡,input是一個由image拉直展開而成的vector,但現在如果是CNN的話,他會考慮input image的幾何空間的,所以不能直接input一個vector,而是imput一個tensor給他(tensor就是高維的vector),這裡你要給他一個三維的vector,一個image的長寬各式一維,如果是彩色的話,RGB就是第三維,所以你要assign一個三維的matrix,這個高維的matrix就叫做tensor

怎麼implement一個convolution的layer呢?

model12.add( Convolution2D (25,3,3, input_shape=(28,28,1)))

還是用model.add增加CNN的layer,將原先的Dense改成Convolution2D,參數25代表你有25個 filter,參數3,3代表你的filter都是3*3的matrix,此外你還需要告訴model,你input的image的shape是什麼樣的,假設我現在要做手寫數字識別,input就是28*28的image,又因為它的每一個pixel都只有單一顏色,因此input_shape的值就是(28,28,1),如果是RGB的話,1就要改成3
然後增加一層Max Pooling的layer

model12.add( Maxpooling2D(2,2))

這裡參數(2,2)指的是,我們把通過convolution得到的feature map,按照2*2的方式分割成一個個區域,每次選取最大的那個值,並將這些值組成一個新的比較小的image,作為subsampling的結果

過程描述

  • 假設我們input是一個1*28*28的image
  • 通過25個filter的convolution layer以後你得到的output,會有25個channel,又因為filter的size是3*3,因此如果不考慮image邊緣處的處理的話,得到的channel會是26*26的,因此通過第一個convolution得到25*26*26的cubic image(這裡把這張image想像成長寬為26,高為25的cubic)
  • 接下來就是做Max pooling,把2*2的pixel分為一組,然後從裡面選一個最大的組成新的image,大小為25*13*13(cubic長寬各被砍掉一半)
  • 再做一次convolution,假設這次選擇50個filter,每個filter size是3*3的話,output的channel就變成有50個,那13*13的image,通過3*3的filter,就會變成11*11,因此通過第二個convolution得到50*11*11的image(得到一個新的長寬為11,高為50的cubic)
  • 再做一次Max Pooling,變成50*5*5

在第一個convolution裡面,每一個filter都有9個參數,它就是一個3*3的matrix;但是在第一個convolution layer裡面,雖然每一個filter都是3*3,但它其實不是3*3個參數,因為它的input是一個
25*13*13的cubic,這個cubic的channel有25個,所以要用同樣高度的cubic filter對它進行卷積,於是我們的filter實際上是一個25*3*3的cubic,所以這邊每個filter共有225個參數(225=3*3*25

通過兩次convolution和max pooling的組合,最終的image變成了50*5*5的size,然後使用Flatten將這個image拉直,變成一個1250維的vector,再把它丟到一個Fully Connected Feedforward network
裡面,network structure就搭建完成了


一個重要的問題

看到這裡,你可能會有一個疑惑,第一次convolution的input是25*13*13的cubic,且50個3*3的filter卷積後,得到的輸出時應該是50個cubic,且每個cubic的尺寸為25*11*11,那麼max pooling把長寬各砍掉一半後就是50層25*5*5的cubic,那flatten後不應該就是50*25*5*5嗎?

其實不是這樣的,在第一次做convolution的時候,我們是用25*3*3的cubic filter對25*13*13的cubic input進行卷積操作的,filter的每一層和input cubic中對應的每一層(也就是每一個channel),它們進行內積後,還要把cubic的25個channel的內積值進行求和,作為這個“neuron”的output,它是一個scalar,這個cubic filter對整個cubic input做完一遍卷積操作後,得到的是一層scalar,然後有50個cubic filter,對應著50層scalar,因此最終得到的output是一個50*11*11的cubic!

這裡的關鍵是filter和image都是cubic,每個cubic filter有25層高,它和同樣有25層高的cubic image做卷積,並不是單單把每個cubic對應的channel進行內積,還會把這些內積求和! ! !最終變為1層,因此兩個矩陣或者tensor做了卷積後,不管之前的維數如何,都會變為一個scalor! ,故如果有50個Filter,無論input是什麼樣子的,最終的output還會是50層

2020-08-11 0 comment
0 FacebookTwitterPinterestEmail
Load More Posts

近期文章

  • [SAS] Macro Language 基礎內容
  • ccClub 讀書會推薦,免費學python
  • [閱讀心得 #21]你願意,人生就會值得
  • 理想生活,該長怎麼樣子?
  • 多益330 → 多益785 多益成績棕色到藍色證書

近期留言

  • 「peter」於〈多益330 → 多益785 多益成績棕色到藍色證書〉發佈留言
  • 「wenwu」於〈[SAS]存活分析(2) COX regression model〉發佈留言
  • 「joey53111」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言
  • 「丁柏仁」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言
  • 「peter」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言

免費訂閱

不定期更新文章,點一下追蹤就能夠收到最新文章!

一起加入其他 19 位訂閱者的行列

Statistics

  • 11,201
  • 592,884
  • 73
R 線上課程參考

@2019 - All Right Reserved. Designed and Developed by PenciDesign

Wenwu's blog
  • 文章總列表
  • 統計分析
    • R SAS All
      R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      統計分析

      [SAS] Ma…

      2026-01-21

      統計分析

      什麼是meta-…

      2024-11-05

      統計分析

      Test-ret…

      2024-06-07

      統計分析

      [SAS]傾向分…

      2020-10-28

  • SAS
    • SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      SAS

      [SAS]線性迴…

      2020-02-26

  • R
    • R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      R

      [SAS][R]…

      2019-07-08

  • 機器學習
    • 機器學習

      Unsuperv…

      2021-07-22

      機器學習

      Unsuperv…

      2021-07-12

      機器學習

      Unsuperv…

      2021-05-20

      機器學習

      Unsuperv…

      2021-05-12

      機器學習

      Matrix F…

      2021-04-30

  • 閱讀筆記
    • 閱讀筆記

      [閱讀心得 #2…

      2025-02-05

      閱讀筆記

      [閱讀心得#20…

      2024-10-25

      閱讀筆記

      [閱讀心得#19…

      2024-08-16

      閱讀筆記

      [閱讀心得#18…

      2024-05-10

      閱讀筆記

      [閱讀心得#17…

      2022-01-22