#目的:使用卷積神經網絡,先學習鞋子資料集(fashion_mnist)裡面的鞋子圖片與鞋子名稱編號的關聯,然後再測試新的鞋子,預測它的名稱編號 #方法:建立深度學習模型,先學習train_images數據,然後再測試預測test_images #(1)步驟1:載入tensorflow(含keras)等函數庫 import tensorflow as tf #(2)步驟2:載入dataset(tensorflow裡面已經內建有fashion_mnist的資料集) #鞋子資料集(fashion_mnist),裡面的鞋子種類有10類,圖片有7萬張(每一類鞋子有7千張),每張圖片28x28像素 mnist = tf.keras.datasets.fashion_mnist #讀入鞋子資料集:mnist.load_data() #訓練學習用的資料圖片vs鞋子編號:(train_images, train_labels),共6萬張圖片,可以提供訓練學習用 #預測用的資料圖片vs鞋子編號:(test_images, test_labels),共1萬張圖片,可以提供預測用 (train_images, train_labels) , (test_images, test_labels) = mnist.load_data() #(3)步驟3:轉換成四維向量 #把資料集的圖片,轉換成4維向量,等一下才能進行卷積神經網絡運算 #60000個,(28x28x1)矩陣 = 4維向量 =(60000, 28, 28, 1) #圖片像素 = (28x28) train_images2 = train_images.reshape(60000, 28, 28, 1) test_images2 = test_images.reshape(10000, 28, 28, 1) #(4)步驟4:輸入檔案的預先處理(標準化Normalize,變成0~1的數據) #色階是指顏色的明暗度,共有256個色階,從0到255,0表示最暗的黑色,255表示最亮的白色 #照片檔案的色階/255,就可以把最大值變成1(變成0~1的向量數值) train_images2 = train_images2/255.0 test_images2 = test_images2/255.0 #(5)步驟5:建立卷積神經網絡之深度學習模型(Model) # 建立三層神經網絡(第1層隱藏層,第2層隱藏層,輸出層)(輸入層不算在三層之一) #A. 第1層隱藏層(同時在此層設定輸入層大小)[tf.keras.layers.Flatten(),輸入層向量大小=28x28 #B. 第2層隱藏層[tf.keras.layers.Dense,向量大小=1024 #C. 第3輸出層[tf.keras.layers.Dense,向量大小=10(10種鞋子種類) #Flatten層:又名扁平層,平坦層:把多維的輸入壓扁為一維輸出 #Dense層:為上下緊密連結的神經網路層 #激勵函數activation=relu,relu函數會把x>0的值輸出x,x<=0的數字全部輸出0 #激勵函數activation=softmax,softmax函數會輸出向量元素裡面的最大值 model = tf.keras.models.Sequential( [ #第1次卷積convolution tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)), tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(units=128, activation='relu'), tf.keras.layers.Dense(units=10, activation='softmax') ]) #註解: #目的:在卷積層加入64個濾鏡filter,濾鏡大小是(3x3),原始圖片大小是(28x28x1) #filters=64:(加入64個濾鏡filter) #kernel_size=(3,3):(設定濾鏡大小是(3x3)) #input_shape=(28,28,1):(設定原始圖片大小是(28x28x1)) #pool_size=(2, 2):(設定池化層的縮減比率效果) #pool_size=(2, 2) = 把寬度長度都/2,可把卷積層運算圖片,縮減一半, #pool_size=(3, 3) = 把寬度長度都/3,可把卷積層運算圖片,縮減1/3, #(6)步驟6:確立求解的目標函數,設定求解方法: #方法:用keras的model.compile()函數來設定(A.損失函數(loss)、B.優化函數(optimizer),C.成效衡量指標(mertrics) model.compile( #第1種寫法:使用參數設定(例如‘adam') optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'] #第2種寫法:使用物件類別(例如Adam()) #optimizer=tf.keras.optimizers.Adam(), #loss=tf.keras.losses.SparseCategoricalCrossentropy(), #metrics=tf.keras.metrics.SparseCategoricalCrossentropy() ) #(7)步驟7:用建立的模型來『訓練』已經存在的數據: #方法:用model.fit()函數進行訓練, #A).必須先指定訓練的樣本資料(x,y)來源,並撥一部分資料作驗證(validation_split=0.2), #B).還要設定訓練幾個週期(epochs=10)、訓練資料的抽樣方式 history = model.fit(train_images2, train_labels, epochs=10) #(8)步驟8:『評估(Evaluation)』該模型的成效 #方法:該模型經過訓練完後,用model.evaluate()函數,針對test_images新的測試數據,來計算其成效分數,以評估模型好壞 #訓練的結果,會傳回test_loss(測試數據的誤差值), test_acc(測試數據的準確率) test_loss, test_acc = model.evaluate(test_images2, test_labels) print("評估這個深度學習模型的正確率 = ",test_acc) #(9)步驟9:『預測(Prediction)』新數據x(鞋子圖test_image)所對應的y值(鞋子樣式編號=classifications) #方法:經過反覆訓練,有了可信模型後,用model.predict()函數,針對test_images新的測試數據,來預測對應的y值(鞋子樣式編號=classifications) #注意:鞋子樣式編號=classifications,是一個陣列 pred_classifications = model.predict(test_images2) #(10)步驟10:繪出測試數據的x值(test_images)的圖,及其已經知道的y值(鞋子樣式編號) #載入繪圖的函數庫matplotlib.pyplot import matplotlib.pyplot as plt #畫出(第一個)測試樣品的圖 #plt.imshow(test_images[0]) #畫出25個測試樣品的圖 plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i]) plt.show() #顯示(第一個)測試樣品,所屬的鞋子樣式編號(09代表短靴) print('顯示(第一個)測試樣品,所屬的鞋子樣式編號=', test_labels[0]) #(11)步驟11:給一個測試x數據(test_images[0]),預測其所屬的鞋子樣式編號(pred_classifications[0]) #類神經網路AI對於(第一個)測試樣品的預測(10個樣品中的哪一個?)(向量陣列編號0~9,若是編號9代表短靴) print('類神經網路AI對於(第一個)測試樣品的預測(10個樣品中的哪一個?)=', pred_classifications[0]) #使用np.argmax()函數:傳回最大值索引號 print("預測:第1個測試數據test_images[0]的所預測的產品樣式編號=", np.argmax(pred_classifications[0])) #(12)畫出學習過程準確率的變化 plt.plot(history.history['accuracy'], label='accuracy') #plt.plot(history.history['val_accuracy'], label='val_accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.ylim([0.5, 1]) plt.legend(loc='lower right')