#(1)下載數據的壓縮檔 #1-1:訓練所需的數據 !wget --no-check-certificate \ https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip \ -O /tmp/rps.zip #1-2:測試與驗證所需的數據 !wget --no-check-certificate \ https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip \ -O /tmp/rps-test-set.zip #(2)解壓缩下載的檔案 import os import zipfile local_zip = '/tmp/rps.zip' zip_ref = zipfile.ZipFile(local_zip, 'r') zip_ref.extractall('/tmp/') zip_ref.close() local_zip = '/tmp/rps-test-set.zip' zip_ref = zipfile.ZipFile(local_zip, 'r') zip_ref.extractall('/tmp/') zip_ref.close() #(3)解壓縮產生的目錄:images-Training-Rock, Paper, Scissors rock_dir = os.path.join('/tmp/rps/rock') paper_dir = os.path.join('/tmp/rps/paper') scissors_dir = os.path.join('/tmp/rps/scissors') print('total training rock images:', len(os.listdir(rock_dir))) print('total training paper images:', len(os.listdir(paper_dir))) print('total training scissors images:', len(os.listdir(scissors_dir))) rock_files = os.listdir(rock_dir) print(rock_files[:10]) paper_files = os.listdir(paper_dir) print(paper_files[:10]) scissors_files = os.listdir(scissors_dir) print(scissors_files[:10]) #(4)在上面這些資料夾裡面創建『學習用,預測用』的圖片與標註 #4-1.目的:把下載的檔案,用ImageDataGenerator()指令,重新創建出模型學習時,所需的圖片 import tensorflow as tf import keras_preprocessing from keras_preprocessing import image from keras_preprocessing.image import ImageDataGenerator TRAINING_DIR = "/tmp/rps/" training_datagen = ImageDataGenerator( rescale = 1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') train_generator = training_datagen.flow_from_directory( TRAINING_DIR, target_size=(150,150), class_mode='categorical', batch_size=126 ) #4-2.目的:把下載的檔案,用ImageDataGenerator()指令,重新創建出模型『測試驗證』時,所需的圖片 VALIDATION_DIR = "/tmp/rps-test-set/" validation_datagen = ImageDataGenerator(rescale = 1./255) validation_generator = validation_datagen.flow_from_directory( VALIDATION_DIR, target_size=(150,150), class_mode='categorical', batch_size=126 ) #(5)建立卷積神經網絡模型 #為什麼要建立4層的卷積神經層:因為數據較複雜(圖片比較大(150x150),顏色比較多(黑人,白人,黃種人)) model = tf.keras.models.Sequential([ # Note the input shape is the desired size of the image 150x150 with 3 bytes color # This is the first convolution tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2, 2), # The second convolution tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), # The third convolution tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), # The fourth convolution tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), # Flatten the results to feed into a DNN tf.keras.layers.Flatten(), tf.keras.layers.Dropout(0.5), # 512 neuron hidden layer tf.keras.layers.Dense(512, activation='relu'), #最後輸出成:1層,三個神經元的網絡(輸出的答案有三種) tf.keras.layers.Dense(3, activation='softmax') ]) model.summary() #(6)編譯神經網絡模型(設定:loss,optimizer,metrics) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) #(7)總共做25回,來從訓練數據test_generator,來訓練學習 history = model.fit(train_generator, epochs=25, steps_per_epoch=20, validation_data = validation_generator, verbose = 1, validation_steps=3) model.save("rps.h5") #(8)把訓練過程的準確率accuracy,畫成曲線圖 import matplotlib.pyplot as plt acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(len(acc)) plt.plot(epochs, acc, 'r', label='Training accuracy') plt.plot(epochs, val_acc, 'b', label='Validation accuracy') plt.title('Training and validation accuracy') plt.legend(loc=0) plt.figure() plt.show() #(9)給一個測試x數據(validation_generator[0]),預測其石頭剪刀布的編號(pred_classifications[0]) #編號的順序=(布,石頭,剪刀),例如:布=(1,0,0),石頭=(0,1,0),剪刀=(0,0,1) pred_classifications = model.predict(validation_generator) print('對第1個測試樣品的預測(石頭剪刀布?)=', pred_classifications[0]) #使用np.argmax()函數:傳回最大值索引號 import numpy as np print("預測:第1個測試數據train_generator[0]的所預測的石頭剪刀布編號=", np.argmax(pred_classifications[0]))