# 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))
```
----

----
### 翻轉函式
```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
)
}
```
----

---
### 建造模型(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
```
---
#### 尾聲
----
### 發現問題
----

----

----
### 總結失敗
- 沒辦法寫入目標資料夾
- 版本不符
- 網址找不到套件(mxnet)
----
### 解決辦法
----
- 上網尋找
- 嘗試重新安裝不同版本R
- 依照rStudio指令下載 rtools
- 到處尋找可供下載的 mxnet 套件
- 獨立安裝各個套件
- 詢問教授
----
因為套件在實作前兩天消失,估計是最後一次更新時壞了,最終還是沒能成功實作出網頁上的效果

----
但是沒關係~我們弄懂了程式碼^^
還上網學習了很多關於類神經網路的資料

---
### 報告之後
----
#### 教授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}]"}