手寫數字識別 小資料集

2022-05-02 18:45:12 字數 4472 閱讀 7312

1.手寫數字資料集

#匯入手寫數字資料集

from sklearn.datasets import load_digits

import numpy as np

digits = load_digits()

2.資料預處理

# 歸一化minmaxscaler()

from sklearn.preprocessing import minmaxscaler

x_data = digits.data.astype(np.float32)

scaler = minmaxscaler()

x_data = scaler.fit_transform(x_data)

print("歸一化後",x_data)

# 轉化為的格式

獨熱編碼:

# 獨熱編碼

from sklearn.preprocessing import onehotencoder

# y = digits.target.reshape(-1,1)

#將y_data變為一列

y = digits.target.astype(np.float32).reshape(-1,1)

y = onehotencoder().fit_transform(y).todense() #張量結構todense

print("獨熱編碼:",y)

# 切分資料集

3.設計卷積神經網路結構

from tensorflow.keras.models import sequential

from tensorflow.keras.layers import dense,dropout,conv2d,maxpool2d,flatten

#3、建立模型

model = sequential()

ks = (3, 3) # 卷積核的大小

input_shape = x_train.shape[1:]

# 一層卷積,padding='same',tensorflow會對輸入自動補0

model.add(conv2d(filters=16, kernel_size=ks, padding='same', input_shape=input_shape, activation='relu'))

# 池化層1

model.add(maxpool2d(pool_size=(2, 2)))

# 防止過擬合,隨機丟掉連線

model.add(dropout(0.25))

# 二層卷積

model.add(conv2d(filters=32, kernel_size=ks, padding='same', activation='relu'))

# 池化層2

model.add(maxpool2d(pool_size=(2, 2)))

model.add(dropout(0.25))

# 三層卷積

model.add(conv2d(filters=64, kernel_size=ks, padding='same', activation='relu'))

# 四層卷積

model.add(conv2d(filters=128, kernel_size=ks, padding='same', activation='relu'))

# 池化層3

model.add(maxpool2d(pool_size=(2, 2)))

model.add(dropout(0.25))

# 平坦層

model.add(flatten())

# 全連線層

model.add(dense(128, activation='relu'))

model.add(dropout(0.25))

# 啟用函式softmax

4.模型訓練

import matplotlib.pyplot as plt

# 畫圖

def show_train_history(train_history, train, validation):

plt.plot(train_history.history[train])

plt.plot(train_history.history[validation])

plt.title('train history')

plt.ylabel('train')

plt.xlabel('epoch')

plt.legend(['train', 'validation'], loc='upper left')

plt.show()

# 4、模型訓練

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

train_history = model.fit(x=x_train, y=y_train, validation_split=0.2, batch_size=300, epochs=10, verbose=2)

# 準確率

show_train_history(train_history, 'accuracy', 'val_accuracy')

# 損失率

5.模型評價

import pandas as pd

import seaborn as sns

# model.evaluate()

score = model.evaluate(x_test, y_test)

print('score:', score)

# **值

y_pred = model.predict_classes(x_test)

print('y_pred:', y_pred[:10])

# 交叉表與交叉矩陣

y_test1 = np.argmax(y_test, axis=1).reshape(-1)

y_true = np.array(y_test1)[0]

# 交叉表檢視**資料與原資料對比

# pandas.crosstab

pd.crosstab(y_true, y_pred, rownames=['true'], colnames=['predict'])

# 交叉矩陣

# seaborn.heatmap

y_test1 = y_test1.tolist()[0]

a = pd.crosstab(np.array(y_test1), y_pred, rownames=['lables'], colnames=['predict'])

# 轉換成屬dataframe

15 手寫數字識別 小資料集

1.手寫數字資料集 from sklearn.datasets import load digits digits load digits 2.資料預處理 x data digits.data.astype np.float32 scale minmaxscaler x data scale.fit...

15 手寫數字識別 小資料集

1.手寫數字資料集 from sklearn.datasets import load digits digits load digits 2.資料預處理 3.設計卷積神經網路結構 4.模型訓練 訓練模型 import matplotlib.pyplot as plt model.compile l...

15 手寫數字識別 小資料集

1.手寫數字資料集 2.資料預處理 3.設計卷積神經網路結構 設計卷積神經網路結構 model sequential ks 3,3 卷積核的大小 input shape x train.shape 1 model.add conv2d filters 16,kernel size ks,paddin...