日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Kaggle] Digit Recognizer 手写数字识别(神经网络)

發布時間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Kaggle] Digit Recognizer 手写数字识别(神经网络) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. baseline
    • 2. 改進
      • 2.1 增加訓練時間
      • 2.2 更改網絡結構

Digit Recognizer 練習地址

相關博文:
[Hands On ML] 3. 分類(MNIST手寫數字預測)
[Kaggle] Digit Recognizer 手寫數字識別

1. baseline

  • 導入包
import tensorflow as tf from tensorflow import keras # 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.Flatten(input_shape=[784])) 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.Flatten(input_shape=[784]), 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) # set the vertical range to [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)) # dropout 正則化 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.4896.4395.989
增加訓練次數97.9896.6196.296(+0.307%)
增加隱藏層98.4796.7296.546(+0.25%)
再增加隱藏層98.6097.0096.578(+0.032%)
增加隱藏單元數量、batch_size = 128、訓練250輪10097.6697.442(+0.864%)
使用 dropout 隨機失活(正則化)99.4097.7997.546(+0.104%)

目前最好得分,可以在 kaggle 排到1597名。


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的[Kaggle] Digit Recognizer 手写数字识别(神经网络)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。