# Digit Recognizer ### 您看不見我 D0843526 譚淇勻 D0845133 王靖甯 D0845163 林昱彤 --- ### 比賽描述 ---- 訓練一款模型辨識手寫的數字圖像 ---- 透過機器學習分析其結構並得知圖像相關數據。 --- ### 資料集的概覽 ---- - train.csv(42,000),test.csv(28,000) - 手繪灰階圖 - 0~9 ---- ### 圖像規格 - 784 pixels(28x28) - 像素值介於0~255, 越大越暗; 反之越亮 ---- ### 資料集 - 訓練集: 785列 = 標籤1列 + 像素值784列 - 測試集: 784列 = 像素值784列 - 像素值以座標(i,j)表示 > ex.(3,7)為第3列第7行 --- ### 目標與目的 ---- ### 動機 - 任務的目標明確易懂,適合新手進行嘗試 - 網路上也有許多參考資料可供參考 - 對神經網絡的技術感興趣,選擇從基礎入門 ---- ### 目標 利用預測模型成功預測出手寫圖片中的數字 --- ### 步驟 --- ### 資料預處理 ---- ### 讀入資料集 ```r= train <- read.csv('train.csv') test <- read.csv('test.csv') dim(train) dim(test) ``` ```r= [1] 42000 785 [1] 28000 784 ``` ---- ### 忽略訓練集的label並轉成28x28矩陣 ```r= obs.matrix <- matrix(unlist(train[1, -1]), nrow = 28, byrow=T) str(obs.matrix) ``` ```r= [1] int [1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ... ``` ---- ### 畫圖並指定灰階值0~255 ```r= image(obs.matrix, col=grey.colors(255)) ``` ---- ![](https://i.imgur.com/3Y43RGb.jpg) ---- ### 翻轉函式 ```r= rotate <- function(matrix){ t(apply(matrix, 2, rev)) } ``` ---- ### 畫出1~8筆資料圖 ```r= par(mfrow=c(2,4)) for(x in 1:8){ obs.matrix <- matrix(unlist(train[x, -1]), # ignore 'label' nrow = 28, byrow=T) image(rotate(obs.matrix), col=grey.colors(255), xlab=paste("Label", train[x, 1], sep=": "), cex.lab = 1.5 ) } ``` ---- ![](https://i.imgur.com/OG2zRY3.jpg) --- ### 建造模型(mxnet) ---- ### 為什麼選擇mxnet? ---- 在查資料的階段我們比對了多種可用套件 - neuralnet - nnet - h2o - mxnet ---- ### 最後選擇mxnet - 彈性 > 允許自行設計類神經網絡模型 - 能實現多種深度學習演算法 - 同時具有python版本,寫法相似於keras,對於未來學python深度學習也能很快上手 ---- ### Package Download ```r= # download mxnet package from github install.packages("drat", repos="https://cran.rstudio.com") drat:::addRepo("dmlc") install.packages("mxnet") require(mxnet) ``` ---- ### Model Bulid ---- ### Input layer ```r= data <- mx.symbol.Variable("data") ``` ---- ### First layer ```r= fc1 <- mx.symbol.FullyConnected(data, name="1-fc", num_hidden=500) act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu") drop1 <- mx.symbol.Dropout(data=act1, p=0.5) ``` ---- ### Second layer ```r= fc2 <- mx.symbol.FullyConnected(drop1, name="2-fc", num_hidden=400) act2 <- mx.symbol.Activation(fc2, name="relu2", act_type="relu") drop2 <- mx.symbol.Dropout(data=act2, p=0.5) ``` ---- ### Output layer ```r= output <- mx.symbol.FullyConnected(drop2, name="output", num_hidden=10) dnn <- mx.symbol.SoftmaxOutput(output, name="dnn") ``` --- ### Model Training ---- ### 資料處理 ```r= # data preparation train.x <- t(train[, -1]/255) # train: 28 x 28 pixels train.y <- train[, 1] # train: label test.x <- t(test/255) # test: 28 x 28 pixels ``` ---- ### 訓練模型 ```r= mx.set.seed(0) dnn.model <- mx.model.FeedForward.create( dnn, # 剛剛設計的DNN模型 X=train.x, # train.x y=train.y, # train.y ctx=mx.cpu(), # 可以決定使用cpu或gpu num.round=10, # iteration round array.batch.size=100, # batch size learning.rate=0.07, # learn rate momentum=0.9, # momentum eval.metric=mx.metric.accuracy, # 評估預測結果的基準函式* initializer=mx.init.uniform(0.07), # 初始化參數 epoch.end.callback=mx.callback.log.train.metric(100) ) ``` ---- ```r= Start training with 1 devices [1] Train-accuracy=0.859379474940333 [2] Train-accuracy=0.932333333333333 [3] Train-accuracy=0.944928571428571 [4] Train-accuracy=0.9515 [5] Train-accuracy=0.957095238095239 [6] Train-accuracy=0.959952380952382 [7] Train-accuracy=0.963761904761905 [8] Train-accuracy=0.966047619047621 [9] Train-accuracy=0.965904761904764 [10] Train-accuracy=0.969190476190479 ``` --- ### 預測 ---- ### Result ```r= test.y <- predict(dnn.model, test.x) test.y <- t(test.y) test.y.label <- max.col(test.y) - 1 ``` ```r= 0.97229 ``` --- #### 尾聲 ---- ### 發現問題 ---- ![](https://i.imgur.com/ysJx7Yj.jpg) ---- ![](https://i.imgur.com/TFjZ3To.jpg) ---- ### 總結失敗 - 沒辦法寫入目標資料夾 - 版本不符 - 網址找不到套件(mxnet) ---- ### 解決辦法 ---- - 上網尋找 - 嘗試重新安裝不同版本R - 依照rStudio指令下載 rtools - 到處尋找可供下載的 mxnet 套件 - 獨立安裝各個套件 - 詢問教授 ---- 因為套件在實作前兩天消失,估計是最後一次更新時壞了,最終還是沒能成功實作出網頁上的效果 ![](https://i.imgur.com/mnl1NoVsd.gif) ---- 但是沒關係~我們弄懂了程式碼^^ 還上網學習了很多關於類神經網路的資料 ![](https://i.imgur.com/zSljMS9.gif) --- ### 報告之後 ---- #### 教授Question - 關於Dropout: - 過擬合: 訓練節點太多、訓練樣本太少; 導致訓練時準確率很高但是測試時準確率卻極低的現象 - Dropout能解決此現象 - Dropout具體做法: - 在每次"訓練"模型時隨機關掉一部份的節點,使模型不會太過於依賴某些特徵 > 每個節點關掉的機率為p - 但在"測試"階段必須開啟所有節點,以避免有特徵未發揮作用 - Dropout類似於生物環境中的"突變" ---- #### 方法一: 找規律 ---- - 將train檔內的資料依label排序分為數字0-9的資料集 - 將0-255的pixels值轉為0跟1 - 取同一數字的資料們,尋找每張圖出現等於1的pixel值 - 依pixel值為分類,紀錄出現1的筆數,得出機率 - 將數字0-9出現pixel值為1的機率高峰取出 - 相互比較機率高峰,挑出每數字獨一無二的高峰區 - 將test集內的資料一筆一筆和高峰區比較,符合者歸類該數字 ---- #### 方法二: 相似度 ---- - 設定範本圖 - 透過比對圖片相似度的方法比對範本圖及訓練圖 - 紀錄每次比對的相符百分比,最終計算平均值 - 測試時比對範本圖,找到相似度最接近平均值則判斷該圖最接近某數字 ---- #### 方法三: 使用另一個套件 ___ ### 參考網址 [DNN & CNN comparison](https://medium.com/chiukevin0321/cnn-%E5%82%B3%E7%B5%B1nn-comparison-9b0a6a9b1e2d) [快速反應機制─類神經網路](https://medium.com/marketingdatascience/%E5%BF%AB%E9%80%9F%E5%8F%8D%E6%87%89%E6%A9%9F%E5%88%B6-%E9%A1%9E%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-a3bbdee4a6f6) [濤哥系列文章(26):利用mxnet進行深度學習](https://kknews.cc/zh-tw/code/yj22e9g.html) [Dropout](https://zhuanlan.zhihu.com/p/38200980) [Dropout — 隨機關閉神經元 | 模擬人腦神經元原理 | 避免模型過擬合](https://medium.com/@a5560648/dropout-5fb2105dbf7c) ...
{"metaMigratedAt":"2023-06-16T17:37:43.802Z","metaMigratedFrom":"YAML","title":"Digit Recognizer","breaks":true,"contributors":"[{\"id\":\"08c24d99-f55a-473e-9e91-0f7fde6374b9\",\"add\":717,\"del\":152},{\"id\":\"4d593da1-d311-41b3-9321-035ef22400d6\",\"add\":5357,\"del\":1233},{\"id\":\"c40ae6d5-930a-4332-ae29-f990b00acda0\",\"add\":1010,\"del\":140}]"}
    252 views
   Owned this note