### exB-1 (Keras_Mnist_MLP.py) ### import numpy as np from keras.utils import np_utils np.random.seed(10) from keras.datasets import mnist import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense def show_image(image): fig = plt.gcf() fig.set_size_inches(2, 2) plt.imshow(image, cmap = 'binary') plt.show() def show_images_labels_predictions(images, labels, predictions, start_id, num = 10): plt.gcf().set_size_inches(12, 14) if num > 25: num=25 for i in range(0, num): ax = plt.subplot(5, 5, 1 + i) # 顯示黑白圖片 ax.imshow(images[start_id], cmap = 'binary') # 有 AI 預測結果資料,才在標題顯示預測結果 if (len(predictions) > 0): title = 'ai = ' + str(predictions[i]) # 預測正確顯示(o), 錯誤顯示(x) title += (' (o)' if predictions[i] == labels[i] else ' (x)') title += '\nlabel = ' + str(labels[i]) # 沒有 AI 預測結果資料,只在標題顯示真實數值 else: title = 'label = ' + str(labels[i]) # X, Y 軸不顯示刻度 ax.set_title(title, fontsize = 12) ax.set_xticks([]);ax.set_yticks([]) start_id += 1 plt.show() # 建立訓練資料和測試資料,包括訓練特徵集、訓練標籤和測試特徵集、測試標籤 (train_feature, train_label), (test_feature, test_label) = mnist.load_data() # show_image(train_feature[0]) # show_images_labels_predictions(train_feature, train_label, [], 0, 10) # 將 Features 特徵值換為 784 個 float 數字的 1 維向量 train_feature_vector = train_feature.reshape(len(train_feature), 784).astype('float32') test_feature_vector = test_feature.reshape(len( test_feature), 784).astype('float32') # Features 特徵值標準化 train_feature_normalize = train_feature_vector / 255 test_feature_normalize = test_feature_vector / 255 # Label 轉換為 One-Hot Encoding 編碼 train_label_onehot = np_utils.to_categorical(train_label) test_label_onehot = np_utils.to_categorical(test_label) # 建立模型 model = Sequential() # 輸入層:784,隱藏層:256,輸出層:10 model.add(Dense(units = 256, input_dim = 784, kernel_initializer = 'normal', activation = 'relu')) model.add(Dense(units = 10, kernel_initializer = 'normal', activation = 'softmax')) #定義訓練方式 model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy']) # 以 (train_feature_normalize,train_label_onehot) 資料訓練,訓練資料保留 20% 作驗證,訓練 10 次、每批次讀取 200 筆資料,顯示簡易訓練過程 train_history =model.fit(x = train_feature_normalize, y = train_label_onehot, validation_split = 0.2, epochs = 10, batch_size = 200, verbose = 2) # 評估準確率 scores = model.evaluate(test_feature_normalize, test_label_onehot) print('\n準確率 = ', scores[1]) # 預測 prediction = model.predict(test_feature_normalize) prediction = np.argmax(prediction, axis = 1) # 顯示圖像、預測值、真實值 show_images_labels_predictions(test_feature, test_label, prediction, 0) ### exB-2 (Keras_Mnist_saveModel.py) ### import numpy as np from keras.utils import np_utils np.random.seed(10) from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense # 建立訓練資料和測試資料,包括訓練特徵集、訓練標籤和測試特徵集、測試標籤 (train_feature, train_label), (test_feature, test_label) = mnist.load_data() # 將 Features 特徵值換為 784 個 float 數字的 1 維向量 train_feature_vector =train_feature.reshape(len(train_feature), 784).astype('float32') test_feature_vector = test_feature.reshape(len( test_feature), 784).astype('float32') # Features 特徵值標準化 train_feature_normalize = train_feature_vector / 255 test_feature_normalize = test_feature_vector / 255 # Label 轉換為 One-Hot Encoding 編碼 train_label_onehot = np_utils.to_categorical(train_label) test_label_onehot = np_utils.to_categorical(test_label) # 建立模型 model = Sequential() # 輸入層:784,隱藏層:256,輸出層:10 model.add(Dense(units = 256, input_dim = 784, kernel_initializer = 'normal', activation = 'relu')) model.add(Dense(units = 10, kernel_initializer = 'normal', activation = 'softmax')) # 定義訓練方式 model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy']) # 以 (train_feature_normalize, train_label_onehot) 資料訓練,訓練資料保留 20% 作驗證,訓練 10 次、每批次讀取 200 筆資料,顯示簡易訓練過程 train_history = model.fit(x = train_feature_normalize, y = train_label_onehot, validation_split = 0.2, epochs = 10, batch_size = 200, verbose = 2) # 評估準確率 scores = model.evaluate(test_feature_normalize, test_label_onehot) print('\n準確率 = ', scores[1]) # 將模型儲存至 HDF5 檔案中 model.save('Mnist_mlp_model.h5') print("Mnist_mlp_model.h5 模型儲存完畢!") del model ### exB-3 (Keras_Mnist_LoadModel.py) ### import numpy as np np.random.seed(10) from keras.datasets import mnist import matplotlib.pyplot as plt from keras.models import load_model def show_images_labels_predictions(images, labels, predictions, start_id, num = 10): plt.gcf().set_size_inches(12, 14) if num > 25: num = 25 for i in range(0, num): ax = plt.subplot(5, 5, 1 + i) # 顯示黑白圖片 ax.imshow(images[start_id], cmap = 'binary') # 有 AI 預測結果資料,才在標題顯示預測結果 if(len(predictions) > 0) : title = 'ai = ' + str(predictions[i]) # 預測正確顯示(o),錯誤顯示(x) title += (' (o)' if predictions[i] == labels[i] else ' (x)') title += '\nlabel = ' + str(labels[i]) # 沒有 AI 預測結果資料,只在標題顯示真實數值 else: title = 'label = ' + str(labels[i]) # X,Y 軸不顯示刻度 ax.set_title(title, fontsize = 12) ax.set_xticks([]);ax.set_yticks([]) start_id += 1 plt.show() # 建立訓練資料和測試資料,包括訓練特徵集、訓練標籤和測試特徵集、測試標籤 (train_feature, train_label), (test_feature, test_label) = mnist.load_data() # 將 Features 特徵值換為 784 個 float 數字的 1 維向量 test_feature_vector = test_feature.reshape(len(test_feature), 784).astype('float32') # Features 特徵值標準化 test_feature_normalize = test_feature_vector / 255 # 從 HDF5 檔案中載入模型 print("載入模型 Mnist_mlp_model.h5") model = load_model('Mnist_mlp_model.h5') # 預測 prediction = model.predict(test_feature_normalize) prediction = np.argmax(prediction, axis = 1) # 顯示圖像、預測值、真實值 show_images_labels_predictions(test_feature, test_label, prediction, 0) ### exB-4 (Mnist_MLP_Predict.py) ### import numpy as np np.random.seed(10) import matplotlib.pyplot as plt from keras.models import load_model import glob, cv2 def show_images_labels_predictions(images, labels, predictions, start_id, num = 10): plt.gcf().set_size_inches(12, 14) if num > 25: num = 25 for i in range(0, num): ax = plt.subplot(5, 5, 1 + i) # 顯示黑白圖片 ax.imshow(images[start_id], cmap = 'binary') # 有 AI 預測結果資料,才在標題顯示預測結果 if(len(predictions) > 0) : title = 'ai = ' + str(predictions[i]) # 預測正確顯示(o),錯誤顯示(x) title += (' (o)' if predictions[i] == labels[i] else ' (x)') title += '\nlabel = ' + str(labels[i]) # 沒有 AI 預測結果資料,只在標題顯示真實數值 else: title = 'label = ' + str(labels[i]) # X,Y 軸不顯示刻度 ax.set_title(title, fontsize = 12) ax.set_xticks([]);ax.set_yticks([]) start_id += 1 plt.show() # 建立測試特徵集、測試標籤 files = glob.glob("imagedata\*.jpg" ) test_feature = [] test_label = [] for file in files: img = cv2.imread(file) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰階 _, img = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV) # 轉為反相黑白 test_feature.append(img) label = file[10:11] # "imagedata\1.jpg" 第10個字元 1 為 Label test_label.append(int(label)) test_feature = np.array(test_feature) # 串列轉為矩陣 test_label = np.array(test_label) # 串列轉為矩陣 # 將 Features 特徵值換為 784 個 float 數字的 1 維向量 test_feature_vector = test_feature.reshape(len(test_feature), 784).astype('float32') # Features 特徵值標準化 test_feature_normalize = test_feature_vector / 255 # 從 HDF5 檔案中載入模型 print("載入模型 Mnist_mlp_model.h5") model = load_model('Mnist_mlp_model.h5') # 預測 prediction = model.predict(test_feature_normalize) prediction = np.argmax(prediction, axis = 1) # 顯示圖像、預測值、真實值 show_images_labels_predictions(test_feature, test_label, prediction, 0, len(test_feature))