#目的:先學習衣服鞋子資料集(fashion_mnist)裡面的衣服鞋子圖片與鞋子名稱編號的關聯,然後再測試新的鞋子,預測它的名稱編號 #方法:建立深度學習模型,先學習train_images數據,然後再測試預測test_images #(1)步驟1:載入tensorflow(含keras)等函數庫 import tensorflow as tf #(2)步驟2:tensorflow裡面已經內建有fashion_mnist的資料集 #衣服鞋子資料集(fashion_mnist),裡面的衣服鞋子種類有10類,圖片有7萬張(每一類鞋子有7千張),每張圖片28x28像素 mnist = tf.keras.datasets.fashion_mnist #讀入衣服鞋子資料集:mnist.load_data() #訓練學習用的資料圖片vs衣服鞋子編號:(training_images, training_labels),共6萬張圖片,可以提供訓練學習用 #預測用的資料圖片vs衣服鞋子編號:(test_images, test_labels),共1萬張圖片,可以提供預測用 (training_images, training_labels) , (test_images, test_labels) = mnist.load_data() #(3)步驟3:輸入檔案的預先處理(正規化,變成0~1的數據) #色階是指顏色的明暗度,共有256個色階,從0到255,0表示最暗的黑色,255表示最亮的白色 #照片檔案的色階/255,就可以把最大值變成1(變成0~1的向量數值) training_images = training_images/255.0 test_images = test_images/255.0 #(4)步驟4:建立深度學習的模型(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=tf.nn.relu,relu函數會把x>0的值輸出x,x<=0的數字全部輸出0 #激勵函數activation=tf.nn.softmax,softmax函數會輸出向量元素裡面的最大值 model = tf.keras.Sequential( [ tf.keras.layers.Flatten(input_shape=[28, 28]), tf.keras.layers.Dense(1024, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) #(5)步驟2:確立求解的目標函數,設定求解方法: #方法:用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.Accuracy() #要修改成其它物件類別,才能run #metrics=tf.keras.metrics.SparseCategoricalAccuracy() #或是改成這個(但是這些不同參數的設定,都會改變結果的預測,尤其是i=12,sneaker或sandal) metrics=tf.keras.metrics.SparseCategoricalCrossentropy() ) #(6)步驟3:用建立的模型來『訓練』已經存在的數據: #方法:用model.fit()函數進行訓練, #A).必須先指定訓練的樣本資料(x,y)來源,並撥一部分資料作驗證(validation_split=0.2), #B).還要設定訓練幾個週期(epochs=10)、訓練資料的抽樣方式 model.fit(training_images, training_labels, epochs=5) #(7)步驟4:『評估(Evaluation)』該模型的成效 #方法:該模型經過訓練完後,用model.evaluate()函數,針對test_images新的測試數據,來計算其成效分數,以評估模型好壞 #訓練的結果,會傳回test_loss(測試數據的誤差值), test_acc(測試數據的準確率) test_loss, test_acc = model.evaluate(test_images, test_labels) print('\n評估test數據的預測正確度(Test accuracy):', test_acc) #(8)步驟5:『預測(Prediction)』新數據x(鞋子圖test_image)所對應的y值(鞋子樣式編號=classifications) #方法:經過反覆訓練,有了可信模型後,用model.predict()函數,針對test_images新的測試數據,來預測對應的y值(鞋子樣式編號=classifications) #注意:鞋子樣式編號=classifications,是一個陣列 pred_classifications = model.predict(test_images) #(9)步驟6:繪出測試數據的x值(test_images)的圖,及其已經知道的y值(鞋子樣式編號) #載入繪圖的函數庫matplotlib.pyplot import matplotlib.pyplot as plt #畫出(第一個)測試樣品的圖 plt.imshow(test_images[0]) #顯示(第一個)測試樣品圖片的檔案(向量陣列) print('顯示(第一個)測試樣品圖片的檔案=', test_images[0]) #顯示(第一個)測試樣品,所屬的鞋子樣式編號(09代表短靴) print('顯示(第一個)測試樣品,所屬的鞋子樣式編號=', test_labels[0]) #(10)步驟7:給一個測試x數據(test_images[0]),預測其所屬的鞋子樣式編號(pred_classifications[0]) #類神經網路AI對於(第一個)測試樣品的預測(10個樣品中的哪一個?)(向量陣列編號0~9,若是編號9代表短靴) print('類神經網路AI對於(第一個)測試樣品的預測(10個樣品中的哪一個?)=', pred_classifications[0])