about 3 years ago

在使用caffe的過程中,不管是做visualization或是將某層的feature拿出來用SVM做training,常常會需要將我們的CNN中的某層Layer的activation拿出來看看,所以如何將model中的某層feature取出來便是十分的重要了。

要將某層的feature萃取出來,必須要用到caffe中幫我們寫好的一個tool,就放在$CAFFE_DIR/build/tools裡。

$CAFFE_DIR/build/tools/extract_features.bin

要怎麼用這個executable呢,可參照caffe官方網站的教學: http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html

其中要注意的是,教學中的下面這行

build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10

其中的fc7是我們要抽的那層layer的名字,10這邊是代表mini batch的數字,mini batch的意義是,每次會extract batch_szie(在imagenet_val.prototxt中定義的)乘上mini batch這麼多張image的feature。

而最後萃取出來的feature會以leveldb的形式儲存,需要透過一些方法將他拿出來,下面是個用python寫成的簡單sample。

readDB.py
#!/usr/bin/env python

import leveldb
import binascii
import numpy as np
import caffe
import sys
from caffe.proto import caffe_pb2

// parse input argument
dbName = sys.argv[1]

# open leveldb files

db = leveldb.LevelDB(dbName)

# get db iterator

it = db.RangeIter()

for key,value in it:
    # convert string to datum

    datum = caffe_pb2.Datum.FromString(db.Get(key))
    
    # convert datum to numpy string

    arr = caffe.io.datum_to_array(datum)[0]
    
    i = 0
    tmpS = ''
    
    # convert to svm format

    for i in range(0, len(arr)):
        tmpS += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
    print tmpS

 
about 3 years ago

Django是近來一個非常熱門的Web Framework,感覺適合作為web development的入門,於是決定要來嘗試一下。
System requirement: python 2.x or higher, python 2.7 is recommended.

本次是透過pip安裝,首先電腦上要有pip,沒有的話可透過sudo apt-get install pip先安裝,
之後只要透過pip install Django安裝即可。

安裝完成後可透過 python -c "import django; print(django.getversion())" 來測試,
如果有成功出現版本號,沒有任何error就是成功啦。

 
about 3 years ago

本篇Paper主要是介紹了LLE(locally linear embedding)這個方法,能夠同時結合了PCA和MDS的優點,能夠在符合global的structure的同時,也保有local的特性。

LLE主要是架構在幾個簡單的觀察上: 當distance大到一個尺度後,距離的大小就變得沒有意義,所以我們找出的新的representation只要還能維持住原本的topological的順序就好,不一定要preserve住原本的距離長短差異。
另外一個觀察是,因為LLE是用與鄰居的linear combination去表示一個地方,所以也能夠preserve locality。

1) 找出每個data point的鄰居(例如用KNN找出)
2) 用鄰居們的linear combination去組出原本的data point(用min-square error)
3) 找出一個降維過的representaiton,一樣用min-square error)

透過上述步驟,我們就知道該如何去計算LLE了,而LLE也可以跟其他的方法一起使用,讓效果更好。
如此簡單又有效的方法,實在相當難得。

 
about 3 years ago

本篇是個將近年來DNN運用在語音辨識上的各種發展整理得相當好的review paper,

 
about 3 years ago

本篇paper主要是提出了一個benchmark,能評估在巨量的dataset中做分類問題的結果好壞。
她們同樣的也提出了一些他們在過程中找到的許多有趣的現象,像是rank-based的algorithm並不如我們想像中的,贏過one-vs-rest的方法。同樣的,當dataset的size愈來愈大的時候,不同的演算法間的差距會愈縮愈小,以及在one-vs-rest時,如果在切folds時有先對positive和negtive的數量做控管,會有很大的影響。最後就是,如果使用early stopping這個技巧,可以讓SGD(Stochastic Gradient Descent)時變得很有效率。

而上圖是這篇的作者所提出的,對於想在巨量的dataset上做分類問題時所需要注意的一些問題與建議。

作者也做了一系列的實驗去證明他所說的事項,如下圖為reweighting對OVR(One-Vs-Rest),尤其是在dimension較小時,會有巨大的影響。

下圖則是顯示出early stopping的好處,在dataset愈來愈大時,regularization其實反而是限制了他的發展空間,所以可以知道隨著dataset的size來調整regularization的term會讓performance好上許多。

 
about 3 years ago

本篇Paper對feature learning的一些方法和本質都有做出深入的探討,分享了一些他的觀察,並對unsupervised feature learning,deep learning,auto-encoders,manifold learning與deep networks等領域上近年來的進展都有個大概的介紹。

其中我覺得很實用的就是作者所分享的,怎樣才是一個好的representation該有的特質這部分,如下:

1. Smoothness & the curse of dimensionality
2. Distributed representation
3. Feature reuse
4. Disentangling factors of variation
5. Simplicity of factor dependencies
6. A hierarchical organization of explanatory factors

Learning的方法中,RBM(Restricted Boltzmann Machine)和Auto-encoder與Sparse coding的概念其實我覺得都很類似,雖然方法各異,不過都是有種透過encode成codeword的representation,再利用codeword重新reconstruct input,並將error minimize,藉此來學到好的codeword representation。

 
about 3 years ago

Spectral Hashing想做到的事情其實很簡單,他想對每個dataset都學出一個好的codeword representation,並且希望能符合下列三項條件: (1)easily computer for a novel input、(2) requires a small number of bits (3) maps similar items to similar binary codewords

要達到這些事情,可以先從下面的方程式看起:

因為minimize上面這個function,加上下面的限制後,可以想成各有一半的bit是1,一半是-1。
其相當於,balanced graph partitioning,而這個問題就是已知的NP-Hard Problem.

所以可以繼續對這個問題做些Relaxation,把Y(i, j)屬於{-1,1}這個限制拿掉,並把他變成vector的形式,讓解變成eigen vector的型式。

再經過一連串激烈的優化後,可以得出最後的Spectral hasing algorithm:

given a training set of points {xi} and a desired number of bits k
1. Finding the principal components of the data using PCA.
2. Calculating the k smallest single-dimension analytical eigenfunctions of Lp using a rectangular approximation along every PCA direction. This is done by evaluating the k smallest eigenvalues for each direction using (eigenfunctions Φk(x)), thus creating a list of dk eigenvalues, and then sorting this list to find the k smallest eigenvalues.
3. Thresholding the analytical eigenfunctions at zero, to obtain binary codes.

如此這般,就知道如何在semantic hashing中找到好的codeword的方法,簡單卻有效,實在是篇好paper。

 
over 3 years ago

這篇主要是提出一個方法,去解決傳統的dimension reduction的方法,如PCA(Principal component analysis),與MDS(multidimensional scaling),在nonlinear的dataset上做得並不好的缺點。

上面的table1是整個演算法的流程,其實看起來複雜但idea並不難,分成下列幾步來說明。

1. 建出neighborhood graph,方法有兩種,一種是對每個data point,找附近k個的nearest neighbor當成鄰近的node,或是找一定的距離內的data point當鄰近的node
2. 找出all pair shortest path,方法是有相連的兩個node會給定一個相同的weight,反之則是無限大的weight,每個回合都去找dij = min{dij,dik+dkj}。
3. 重建d-dimentional embeddings,類似approximation。

如此這般,isomap就同時有了PCA和MDS的優點們,在nonlinear的dataset上也可以有效率而準確的去學到那個manifold。

 
over 3 years ago

這篇paper是篇傳統的survey paper,完整的把Transfer learning這個idea的動機、歷史,乃至於各家流派的方法都講得很清楚,如果想了解transfer learning的話是個很好入門的必讀刊物。

首先我們必須要先知道,什麼是transfer learning呢?
Transfer Learning想達到的目標其實很簡單,就是能利用之前已經有的知識,來對新的data的問題,產生一些幫助。


如上圖所示,左邊是傳統的learning流程,右邊則是Transfer Learning,將Source Task變成Knowledge後去幫助我們新的想達到的Target Task。

Transfer Learning根據Source Task與Target Task的不同,Transfer Learning也分成兩種。
下面這個table,是Transfer Learning簡單的分類。

由上圖可知,傳統的Machine Learning的Task,Source和Target的Domain和Task是相同的,如果兩者Domain相同但Task不同,就稱作Inductive Transfer Learning,反之則稱為Transductive Transfer Learning

知道簡單的分類法則後,就可以對這兩種Transfer Learning來作探討:

Transductive Learning: 簡單的idea就是,因為Source和Target之間的Domain不相同,但卻有相關性,所以Transductive就是要想辦法去學其中的相關性。如下列的方程式,加上了P(Dt)/P(Ds)這個penalty的term,來達到我們想要的目的。

 
over 3 years ago

Sparse coding想做到的事情很簡單,就是希望用一些basis的linear combination去試圖組回原本(error最小)的signal,但跟一些類似的方法,如eigen vector跟PCA有些不同,像是他的basis不一定要是orthogonal的,這讓他能更有彈性的去fit data。

而online dictionary learning,與一般的learning不同的自然是data是incremental增加的,那自然dictionary的basis也必須要隨著新加進的data做調整,本篇paper主要就是提出一套systematically的方法去完成這件事情,並且效能比之前的方法還來得好上許多。

如何做online dictionary learning呢? 演算法如下圖所示

對Dictionary做update的演算法則是如下圖: