2019年4月29日 星期一

[AI 探討] AI︑Machine Learning︑Deep Learning簡單介紹

前言


由於接下來工作內容要開始玩電腦視覺(Computer Vision, CV)

在開始摸CV之前來好好研究一下幾個常見名詞: AI︑ Machine Learning ︑Deep Learning

以前完全沒碰過這個技術... ...等於是從0開始

前兩年因為AlphaGo在圍棋上不斷擊敗職業棋士,因此AI才開始變成熱門話題

因為早期電腦硬體的效能和限制只能用來解決一些簡單的問題,無法實際用在解決現實生活

的問題,所以變成只有在發展理論,但是卻一直不是熱門話題。

台大李琳山教授便是語音辨識先驅,很多華語語音辨識都參考到他的研究。

另外,有興趣學machine learning卻不知從何開始,可以考慮台大林軒田教授的開放課程,只

能說強者一個~

coursera 連結如下:

https://zh-tw.coursera.org/instructor/htlin

ptt鄉民也整理出來學習路線:
https://www.ptt.cc/bbs/DataScience/M.1518514290.A.816.html




正文


人工智慧(AI)


指由人類製造出來能夠表現出智慧的技術。通常是指電腦模擬或模擬人類思維過程的行為能力。

在電影裡看到機器人像人類一樣有自我意識,可以做很多非特定任務的工作,這就是人工智慧。

基本上擁有一個rule-based的系統也是屬於AI範疇下。

所謂的rule-based就是指根據經驗設定判斷依據,例如: ⌈狗只會汪汪叫︑貓只會喵喵叫⌋︑⌈貓不太理人︑狗很黏人⌋

不過現在可以實現的人工智慧還侷限於⌈弱人工智慧(Narrow AI)⌋,這些技術只能完成特定任務。


機器學習(Machine Learning)


一種實現人工智慧的方法,使用演算法來分析資料並學習,然後對已發生或未發生的事件做出決定或預測。

通常透過大量的資料和演算法來⌈訓練⌋,給予它學習如何執行任務的能力。

機器學習流程大概如下: 資料輸入  → 特徵擷取 → 建立模型  → 答案輸出







透過大量資訊輸入來訓練並且不斷更正提高正確率,並且建立出一個誤差低︑準確度高的模型。

常見演算法包括: 決策數學習︑歸納邏輯程式設計︑聚類︑強化學習等等。

而現在熱門應用領域則是電腦視覺(CV),可以很快速找辨識出物體
















深度學習(Deep Learning)


一種實現機器學習的技術,使用神經網路(Neural Network, NN)做分析的機器學習方法。

深度學習流程大概如下: 資料輸入→ 建立模型 → 答案輸出




神經網路的靈感來自於我們對人類大腦生物學的理解,所有的神經元之間相互聯繫。

神經網路就是一堆函數的集合,我們丟進去一堆數值,整個網路就輸出一堆數值,並且從裡

面找出一個最好的結果。

大概長成這個樣子:




















結語

未來會用GPU跑caffe演算法,到時再來發心得文






2019年4月26日 星期五

[ JPEG 系列 ] JPEG圖片格式探討 (一)

前言


由於工作上常常碰到Jpeg, Exif等名詞,雖然大學有修過多媒體概論,有基本介紹一般常見的

儲存格式,但是總體來說還是只是為了考試,實際上對這些內容完全沒有概念。

在不斷解issue過程也開始對JPEG有比較深刻的體會,也不得不整理一些資料。

*想到就加入內容,有查到更多資料可以分享再來更新


正文


平常聽到JPEG檔案其實是一種針對相片影像而廣泛使用的失真壓縮標準方法
並且透過JFIFJPEG File Interchange Format,JPEG檔案交換格式) 詳細說明如何從一個JPEG串流,產出一個適合於電腦儲存和傳輸(像是在網際網路上)的檔案。
請參考維基百科介紹。


因此,可以知道JPEG是一種壓縮標準,而JFIF是一種檔案格式。

JPEG是第一個國際圖像壓縮標準,其特性如下:

  • 圖像壓縮演算法提供良好的壓縮率,並且可以在解壓縮後獲得較高的還原率
  • 廣泛使用於圖像︑影像領域
  • PEG的壓縮方式通常是失真壓縮(lossy compression),即在壓縮過程中圖像的品質會遭受到可見的破壞

JIFF是一個圖檔格式標準,其特性如下:

  • 使用JPEG圖像壓縮技術儲存圖片的方式
  • 方便用戶在不同的裝置之間傳輸JPEG圖像
  • 定義圖片長寬︑解析度︑色彩空間等基本訊息,這些訊息在JPEG壓縮標準沒有定義
  • 由系列標記(marker)或標記段(marker segments)組成

2019年4月25日 星期四

[UVa][ Volume V ] 579 - Clock Hands

UVa Volume V  579 - Clock Hands




題目來源 : Clock Hands



解題 :


此題在判斷某時的分針和時針角度差。

首先,資料輸入方面這次直接用scanf()來抓取資料省去麻煩。

接著,在處理角度差時,我處理方式如下 :

將hour乘以30minute乘以6來換算成角度。
需要注意的是,當分針不是指向00時候,還需要將時針加上些微的移動
因為每個小時的角度為30度,所以將30除以60(每個小時60分),
便可以得到 :
每過一分鐘時針移動角度為0.5度

最後整理出公式為 : h * 30 + m * 0.5 - m * 6


參考解答(C++)


[UVa][ Volume IV ] 406 - Prime Cuts

UVa Volume IV  406 - Prime Cuts


題目來源 : Prime Cuts


解題 :


常見的質數題目,一般來說都會用到埃氏篩法(Sieve of Eratosthenes)來找出質數。

首先,我建立一個prime -- 大小為n的一維boolean陣列,代表某數字是否為質數。

埃氏篩法(Sieve of Eratosthenes)作法如下 :

若一個正整數為另一個正整數的倍數,則這個整數必定不是質數。
所以,從最小質數2開始,將所有2的倍數(不包含2)標記為⌈非質數⌋。
接著,往下下一個沒有被標記成質數的數字3,再將3的倍數(不包含3)標記為⌈非質數⌋。
以此類推下去,直到找出所有小於等於n的質數。

找出所有質數後,只要根據質數的數量,並且依找題目要求輸出中間2*C (或是 2*C - 1)個質數



參考解答(C++)


[UVa][ Volume I ] 103 - Stacking Boxes

UVa Volume I  103 - Stacking Boxes



題目來源 : Stacking Boxes



解題 :


看到問題描述,我們需要判斷一個盒子能不能放入另一個盒子中。

也就是兩種序列組合d, e的某一種重排,使得di > ej 恆成立

因為不可能一直不斷重排然後測試,因此在測試前我們先統一將序列內容從小排到大

接著,再使用一個boolean陣列nest[i][j],判斷序列j是否可以放入序列i之中。

由於序列都是由小到大排列好,因此直接用loop去一一比對。

最後,就是分別選擇不同的盒子當最外層,使用遞迴的方式。

每遞迴一層就相當於在盒子最內層再塞進一個盒子。接著只要找出能套入最多盒子的組合,

並且將組合的串列輸出。


參考解答(C++)


[UVa][ Volume I ] 102 - Ecological Bin Packing

[UVa][ Volume I ] 102 - Ecological Bin Packing



題目來源 : Ecological Bin Packing


解題 :


一開始想法是 :
先找出這9個數字的最大值,再找出被選擇的顏色與桶子中的最大值
接著同樣找出未被選擇的顏色與桶子中的最大值
然後瓶子總和減掉這三個數字就是移動的最小值了。

不過後來再看一次題目Output敘述以及顏色順序是B-G-C,顯然這個方法行不通,因為最後一定會出現順序錯誤的問題
"If more than one order of brown, green, and clear bins yields the minimum number of movements then the alphabetically first string representing a minimal configuration should be printed. "

後來更改想法,直接根據顏色順序來選。也就是說,直接照個字母順序
先選Clear要使用哪個桶子,再選Brown要使用哪個桶子,最後那個桶子就是Green的

此題使用暴力法求出所有可能,再得到裡面最小值。由於已經是依照字母順序選擇,所以即便出現相同的最小值,則後得到的字典順序也會小於先得到的。


參考解答(C++)


[UVa][ Volume I ] 101 - The Blocks Problem

UVa Volume I  101 - The Blocks Problem



題目來源 : The Blocks Problem



解題 :


這一題不會太難,只是很麻煩,相當麻煩:(

首先,使用一個二維n*n的陣列去存整個資料內容

然後再宣告兩個大小為n的陣列儲存編號 i (0 ≦ i < n )的積木在第幾行第幾列

另外,還有一個陣列表示每一堆的頂端。

接著分析指令時,只要有"move"與"onto"這兩種指令,就需要把其上的積木歸位

歸位功能透過returned函式實作

接著只是將a上的積木移動到b上面或者當 a == b 或是 a 與b在同一堆中不能執行動作



參考解答(C++)








[UVa][ Volume I ] 100 - The 3n + 1 problem


UVa Volume I  100 - The 3n + 1 problem



題目來源: The 3n+1 problem


解題:


這題在UVa 題目中算是簡單題。

直接跟著題目的虛擬碼照做就可以了,也就是:

n = 3n + 1  , if n is odd

n = n / 2  , if n is even

使用一個計數器計算一共執行多少次


另外,這一題要注意的一點是 : 如果使用long型態則會有overflow問題

因此變數都使用了unsigned型態



參考解答(C++)


2019年4月23日 星期二

GNU / Linux 各種壓縮與解壓縮指令


GNU / Linux 各種壓縮與解壓縮指令


*記錄在工作上常用解壓縮的linux 指令。


.tar (僅打包,無壓縮)

  • 套件名稱:tar
  • 打包: $ tar cvf  FileName.tar DirName
  • 解包:$ tar xvf  FileName.tar


.gz

  • 套件名稱:gzip
  • 壓縮 : $ gzip FileName
  • 解壓縮 1$ gunzip FileName.gz
  • 解壓縮 2$ gzip -d FileName.gz


.tar.gz

  • 套件名稱:gzip
  • 壓縮:$ tar zcvf  FileName.tar.gz  DirName
  • 解壓縮:$ tar zxvf  FileName.tar.gz


.bz

  • 壓縮:unkown
  • 解壓縮 1$ bzip2 -d FileName.bz
  • 解壓縮 2$ bunzip2 FileName.bz



.tar.bz

  • 壓縮:unkown
  • 解壓縮:$ tar jxvf  FileName.tar.bz



.bz2

  • 套件名稱:bzip2
  • 壓縮:$ bzip2 -z FileName
  • 解壓縮 1$ bzip2 -d FileName.bz2
  • 解壓縮 2$ bunzip2 FileName.bz2


.tar.bz2

  • 套件名稱:bzip2
  • 壓縮:$ tar jcvf  FileName.tar.bz2  DirName
  • 解壓縮:$ tar jxvf  FileName.tar.bz2

.tar.bz2 (parallel)

  • 套件名稱:lbzip2
  • 壓縮:$ tar -I lbzip2 -cvf  FileName.tar.bz2  DirName



.xz

  • 套件名稱:xz-utils
  • 壓縮:$ xz -z FileName
  • 解壓縮:$ xz -d FileName.xz



.tar.xz

  • 套件名稱:xz-utils
  • 壓縮:$ tar Jcvf  FileName.tar.xz  DirName
  • 解壓縮:$ tar Jxvf  FileName.tar.xz


.Z

  • 壓縮:$ compress FileName
  • 解壓縮:$ uncompress FileName.Z


.tar.Z

  • 壓縮:$ tar Zcvf  FileName.tar.Z  DirName
  • 解壓縮:$ tar Zxvf  FileName.tar.Z


.tgz

  • 套件名稱:gzip
  • 壓縮:$ tar zcvf  FileName.tgz  FileName
  • 解壓縮:$ tar zxvf  FileName.tgz


.tar.tgz

  • 套件名稱:gzip
  • 壓縮:$ tar zcvf  FileName.tar.tgz  FileName
  • 解壓縮:$ tar zxvf  FileName.tar.tgz


.7z

  • 套件名稱:p7zip-full
  • 壓縮:$ 7z a FileName.7z FileName
  • 使用密碼 (PASSWORD) 壓縮:$ 7z a FileName.7z FileName -pPASSWORD
  • 解壓縮:$ 7z x FileName.7z


.zip

  • 套件名稱:zip
  • 壓縮:$ zip -r FileName.zip DirName
  • 解壓縮:$ unzip FileName.zip


.rar

  • 套件名稱:rar, unrar
  • 壓縮:$ rar a FileName.rar DirName
  • 解壓縮 1$ rar e FileName.rar
  • 解壓縮 2$ unrar e FileName.rar
  • 解壓縮 3:在指定目錄內解壓縮。
          $ rar x FileName.rar DirName


.lha

  • 套件名稱:lha
  • 壓縮:$ lha -a FileName.lha FileName
  • 解壓縮:$ lha -e FileName.lha






[Interview] Cadence Software Engineer

前言

3月底收到Cadence面試邀約,雖然結果不盡理想,還是做紀錄以便之後參考 !!
整個面試流程讓人覺得很舒服,相當尊重面試者

正文開始

整個面試流程如下:

收到HR發信interview invitation  --> 第一關phone interview  --> 第二關程式筆試  --> 第三關遠端和美國主管interview


以下開始介紹大概內容:

【第一關phone interview】
HR會問你方便的時間,即便是中午或者傍晚都可以,他們很願意利用面試者有空的時間跟你面試。

談論內容包含 現在工作內容寫過哪些功能遇過那些棘手問題以及如何解決
為什麼想換工作

後半段就開始介紹主要工作內容以及需要那些技能,主要都是以C++為主

此階段需要複習類別(Class), 樣板(Template)等觀念

面試官會突然來一個問題問你知不知道這個觀念



【第二關程式筆試】
考很多程式設計語法觀念,包含類別(Class)的繼承(Inheritance)和建構子(Constructor)以及解構子(Destructor)、指標(pointer)、快速排序實作(Quick Sort)數位系統設計

這一關只能拿書出來複習容易忘記的觀念
程式設計考題印象中有:
A.    給你一段程式碼,問你會不會有問題,如果有會發生什麼事
B.     const char* ptrA 和 char* const ptrB   差在哪裡以及怎樣會有問題
C.  Signle Linked-list翻轉實作
D. 給你一個有很多node但是edge很少的圖,請設計一個Structure來表示
     如果想要搜尋nodeA,要怎麼印出經過的所有nodes
E.  實作Quick sort
F.  給你一個一維陣列,裡面的元素已經由小排到大,而且元素可以重複
     問要如何篩透過In-Place方式選出不重複的元素之陣列,並且在O(n)時間內

數位系統考題大概有:
A.  布林代數化簡,並且證明
B.   給你一個數位電路,問你: Margin Setup time / Margin Hold time


題目大致上來說不難,介於Easy~Medium
我只有那一題問到Margin Setup time / Margin Hold time 不知道,其他都有寫出來而且答案都很肯定。
不知道為什麼要考到這個,畢竟這個只有大二修數位系統設計有碰過,工作後就沒再碰這個
而且這個應該是放在HW面試題才對



【第三關遠端和美國主管interview】
考完筆試後隔兩天就被安排跟美國主管遠端面試,面試時間是台灣時間早上7:00左右
全程英文面試,沒有一點中文

繼續考程式設計,考了Graph相關和Hash table
因為工作上沒用過Graph和Hash table相關,所以這一方面特弱
我連Minimal Spanning Tree都忘了...
如果是大三的我來面試一定沒問題,當時一直都有在寫OJ,對資料結構和演算法都有在碰

後來面試情況不是很好就提早結束,面試官還給我一句話
"I think it's not your best performance this time. Please prepare well before interview next time."



以上是我的Cadence面試經驗


2019年4月22日 星期一

Leetcode --- 905. Sort Array By Parit

Description





Difficulty : Easy


Solution:






































Leetcode --- 771. Jewels and Stones

Description









Difficulty : Easy

Solution


























C++ STL 導讀(目錄) -- 使用C++標準庫學習教本與參考工具 第二版

前言

本篇是【C++ STL導讀】的目錄,所有文章進度都會在此頁面顯示進度。

STL主要由六大塊組成 : container 容器 , algorithm 演算法 , iterator 迭代器 , adapter 配接器 , functor object 函式物件 , allocator 分配器

* 將自己閱讀的過程記錄下來,之後再來慢慢整理


第三章  ---  語言新特性

第四章  ---  一般概念

第五章  ---  通用工具

第六章  --- 標準模板庫

第七章  ---  STL容器

第八章  --- 細探STL容器成員

第九章  --- STL迭代器

第十章  --- STL函式物件及Lamdas

第十一章  --- STL演算法

第十二章  --- 特殊容器

第十三章  --- 字串

第十四章  --- 正規表達式

第十五章  --- 以Stream完成I/O

第十六章  --- 國際化

第十七章  --- 數值

第十八章  --- 並行運算

第十九章  --- 分配器