生活随笔
收集整理的這篇文章主要介紹了
[Kaggle] Digit Recognizer 手写数字识别(神经网络)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
Digit Recognizer 練習地址
相關博文:
[Hands On ML] 3. 分類(MNIST手寫數字預測)
[Kaggle] Digit Recognizer 手寫數字識別
1. baseline
import tensorflow
as tf
from tensorflow
import keras
import numpy
as np
%matplotlib inline
import matplotlib
.pyplot
as plt
import pandas
as pdtrain
= pd
.read_csv
('train.csv')
y_train_full
= train
['label']
X_train_full
= train
.drop
(['label'], axis
=1)
X_test
= pd
.read_csv
('test.csv')
X_train_full
.shape
(42000, 784)
42000個訓練樣本,每個樣本 28*28 展平后的像素值 784 個
X_valid
, X_train
= X_train_full
[:8000] / 255.0, X_train_full
[8000:] / 255.0
y_valid
, y_train
= y_train_full
[:8000], y_train_full
[8000:]
from PIL
import Image
img
= Image
.fromarray
(np
.uint8
(np
.array
(X_train_full
)[0].reshape
(28,28)))
img
.show
()
print(np
.uint8
(np
.array
(X_train_full
)[0].reshape
(28,28)))
數字 1 的像素矩陣:
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 188 255 94 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 191 250 253 93 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 248 253 167 10 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 247 253 208 13 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 207 253 235 77 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 209 253 253 88 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 254 253 238 170 17 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 23 210 254 253 159 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 16 209 253 254 240 81 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 27 253 253 254 13 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 20 206 254 254 198 7 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 168 253 253 196 7 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 20 203 253 248 76 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 22 188 253 245 93 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 103 253 253 191 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 89 240 253 195 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 15 220 253 253 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 94 253 253 253 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 89 251 253 250 131 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 214 218 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
model
= keras
.models
.Sequential
()
model
.add
(keras
.layers
.Dense
(300, activation
="relu"))
model
.add
(keras
.layers
.Dense
(100, activation
="relu"))
model
.add
(keras
.layers
.Dense
(10, activation
="softmax"))
或者以下寫法
model
= keras
.models
.Sequential
([
keras
.layers
.Dense
(300, activation
="relu"),
keras
.layers
.Dense
(100, activation
="relu"),
keras
.layers
.Dense
(10, activation
="softmax")
])
opt
= keras
.optimizers
.Adam
(learning_rate
=0.001, beta_1
=0.9, beta_2
=0.999, decay
=0.01)
model
.compile(loss
="sparse_categorical_crossentropy",optimizer
=opt
, metrics
=["accuracy"])
history
= model
.fit
(X_train
, y_train
, epochs
=30,validation_data
=(X_valid
, y_valid
))
...
Epoch
30/30
1063/1063 [==============================] - 2s 2ms
/step
-
loss
: 0.0927 - accuracy
: 0.9748 -
val_loss
: 0.1295 - val_accuracy
: 0.9643
model
.summary
()
輸出:
Model
: "sequential_5"
_________________________________________________________________
Layer
(type) Output Shape Param
=================================================================
dense_15
(Dense
) (None, 300) 235500
_________________________________________________________________
dense_16
(Dense
) (None, 100) 30100
_________________________________________________________________
dense_17
(Dense
) (None, 10) 1010
=================================================================
Total params
: 266,610
Trainable params
: 266,610
Non
-trainable params
: 0
_________________________________________________________________
from tensorflow
.keras
.utils
import plot_model
plot_model
(model
, './model.png', show_shapes
=True)
pd
.DataFrame
(history
.history
).plot
(figsize
=(8, 5))
plt
.grid
(True)
plt
.gca
().set_ylim
(0, 1)
plt
.show
()
y_pred
= model
.predict
(X_test
)
pred
= y_pred
.argmax
(axis
=1).reshape
(-1)
print(pred
.shape
)image_id
= pd
.Series
(range(1,len(pred
)+1))
output
= pd
.DataFrame
({'ImageId':image_id
, 'Label':pred
})
output
.to_csv
("submission_svc.csv", index
=False)
得分 : 0.95989
2. 改進
根據上面的準確率:
...
Epoch
30/30
1063/1063 [==============================] - 2s 2ms
/step
-
loss
: 0.0927 - accuracy
: 0.9748 -
val_loss
: 0.1295 - val_accuracy
: 0.9643
人類的準確率幾乎是100%,我們的訓練集準確率 97.48%,驗證集準確率 96.43%,我們的模型存在高偏差
參考, 超參數調試、正則化以及優化:https://michael.blog.csdn.net/article/details/108372707
怎么辦?
2.1 增加訓練時間
訓練次數更改為 epochs=100
...
Epoch
100/100
1063/1063 [==============================] - 2s 2ms
/step
-
loss
: 0.0751 - accuracy
: 0.9798 -
val_loss
: 0.1194 - val_accuracy
: 0.9661
得分 : 0.96296,比上面好 0.307%
2.2 更改網絡結構
model
= keras
.models
.Sequential
()
model
.add
(keras
.layers
.Dense
(300, activation
="relu"))
model
.add
(keras
.layers
.Dense
(100, activation
="relu"))
model
.add
(keras
.layers
.Dense
(100, activation
="relu"))
model
.add
(keras
.layers
.Dense
(10, activation
="softmax"))
Epoch
100/100
1063/1063 [==============================] - 2s 2ms
/step
-
loss
: 0.0585 - accuracy
: 0.9847 -
val_loss
: 0.1114 - val_accuracy
: 0.9672
得分 : 0.96546,比上面好 0.25%
model
= keras
.models
.Sequential
()
model
.add
(keras
.layers
.Dense
(300, activation
="relu"))
model
.add
(keras
.layers
.Dense
(100, activation
="relu"))
model
.add
(keras
.layers
.Dense
(100, activation
="relu"))
model
.add
(keras
.layers
.Dense
(50, activation
="relu"))
model
.add
(keras
.layers
.Dense
(10, activation
="softmax"))
Epoch
100/100
1063/1063 [==============================] - 2s 2ms
/step
-
loss
: 0.0544 - accuracy
: 0.9860 -
val_loss
: 0.1039 - val_accuracy
: 0.9700
得分 : 0.96578,比上面好 0.032%
- 增加隱藏單元數量、使用 batch_size = 128、訓練250輪
DROP_OUT
= 0.3
model
= keras
.models
.Sequential
()
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dense
(10, activation
="softmax"))
history
= model
.fit
(X_train
, y_train
, epochs
=250, batch_size
=128,validation_data
=(X_valid
, y_valid
))
Epoch
250/250
266/266 [==============================] - 3s 10ms
/step
-
loss
: 9.7622e-08 - accuracy
: 1.0000 -
val_loss
: 0.2358 - val_accuracy
: 0.9766
得分 : 0.97442,比上面好 0.864%
- 使用 dropout 隨機使一些神經元失效,是一種正則化方法
DROP_OUT
= 0.3
model
= keras
.models
.Sequential
()
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dropout
(DROP_OUT
))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dropout
(DROP_OUT
))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dropout
(DROP_OUT
))
model
.add
(keras
.layers
.Dense
(500, activation
="relu"))
model
.add
(keras
.layers
.Dropout
(DROP_OUT
))
model
.add
(keras
.layers
.Dense
(10, activation
="softmax"))
history
= model
.fit
(X_train
, y_train
, epochs
=250, batch_size
=128,validation_data
=(X_valid
, y_valid
))
Epoch
250/250
266/266 [==============================] - 4s 16ms
/step
-
loss
: 0.0171 - accuracy
: 0.9940 -
val_loss
: 0.0928 - val_accuracy
: 0.9779
得分 : 0.97546,比上面好 0.104%
模型/準確率(%)訓練集驗證集測試集
| 簡單模型 | 97.48 | 96.43 | 95.989 |
| 增加訓練次數 | 97.98 | 96.61 | 96.296(+0.307%) |
| 增加隱藏層 | 98.47 | 96.72 | 96.546(+0.25%) |
| 再增加隱藏層 | 98.60 | 97.00 | 96.578(+0.032%) |
| 增加隱藏單元數量、batch_size = 128、訓練250輪 | 100 | 97.66 | 97.442(+0.864%) |
| 使用 dropout 隨機失活(正則化) | 99.40 | 97.79 | 97.546(+0.104%) |
目前最好得分,可以在 kaggle 排到1597名。
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的[Kaggle] Digit Recognizer 手写数字识别(神经网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。