(一)選題背景
機器學習是人工智能領域一個重要的研究課題,在課堂上學習完機器學習中的貓狗識別案例后,想找個簡單的數據集做個機器學習期末設計,同時借助本次作業去了解機器學習的代碼原理以及其操作。
選擇天氣分類的主要原因:1本人手機的天氣預報一直不是很准確所以就想試着做一個和天氣有關的主題,2通過機器學習對天氣進行識別,可以便於用戶在不便的情況下對室外氣候有一定了解,3該數據集較為簡單適合我初步學習了解機器學習。
(二)機器學習案例設計方案
數據來源:
本案例中涉及的數據集來源於 kaggle 網站 Kaggle: Your Home for Data Science
本案例用keras框架對天氣圖片進行簡單的識別分類
代碼參考,python書中貓狗大戰案例,kaggle網站 貓狗識別案例
(三)機器學習的實現步驟
這是我下載的數據集

我們先對數據進行處理編號
1 import os 2 3 image_dir = "D:/weather/kaggle_original_data/" 4 i = 0 5 for dir_name in os.listdir(image_dir): 6 for image_name in os.listdir(os.path.join(image_dir, dir_name)): 7 old_name = os.path.join(image_dir, dir_name, image_name) 8 new_name = os.path.join(image_dir, dir_name, (dir_name + str(i) + ".jpg")) 9 print("new image name :", new_name) 10 print("old image name:", old_name) 11 os.rename(old_name, new_name) 12 i = i + 1 13 i=0

我們再創建test、train、validation三個數據集文件夾
1 import os 2 import shutil #導入os,shutil庫用來創建新的數據集 3 #創建數據集 4 from os import mkdir 5 or_data_dir='D:\weather\kaggle_original_data' 6 base_dir='D:\weather\sunny_or_cloudy' 7 os.mkdir(base_dir) 8 9 train_dir=os.path.join(base_dir,'train') 10 os,mkdir(train_dir) #創建訓練集目錄 11 12 validation_dir=os.path.join(base_dir,'validation') 13 os.mkdir(validation_dir) #創建驗證集目錄 14 15 test_dir=os.path.join(base_dir,'test') 16 os.mkdir(test_dir) #創建測試集目錄 17 18 train_sunny_dir=os.path.join(train_dir,'sunny') 19 os.mkdir(train_sunny_dir) #創建sunny的訓練集目錄 20 21 train_cloudy_dir=os.path.join(train_dir,'cloudy') 22 os.mkdir(train_cloudy_dir) #創建cloudy的訓練集目錄 23 24 validation_sunny_dir=os.path.join(validation_dir,'sunny') 25 os.mkdir(validation_sunny_dir) #創建sunny驗證集目錄 26 27 validation_cloudy_dir=os.path.join(validation_dir,'cloudy') 28 os.mkdir(validation_cloudy_dir) #創建cloudy驗證集目錄 29 30 test_sunny_dir=os.path.join(test_dir,'sunny') 31 os.mkdir(test_sunny_dir) #創建sunny的測試集目錄 32 33 test_cloudy_dir=os.path.join(test_dir,'cloudy') 34 os.mkdir(test_cloudy_dir) #創建cloudy的測試集目錄 35 36 #將前1000個cloudy圖像復制到train_dir文件夾 37 fnames = ['cl{}.jpg'.format(i) for i in range(0,1000)] 38 for fname in fnames: 39 src = os.path.join(or_data_dir + '/cl', fname) 40 dst = os.path.join(train_cloudy_dir, fname) 41 shutil.copyfile(src, dst) 42 43 #將以下500個cloudy圖像復制到train_dir文件夾中 44 fnames = ['cl{}.jpg'.format(i) for i in range(1000, 1500)] 45 for fname in fnames: 46 src = os.path.join(or_data_dir + '/cl', fname) 47 dst = os.path.join(validation_cloudy_dir, fname) 48 shutil.copyfile(src, dst) 49 50 #將以下500個cloudy圖像復制到test_dir文件夾 51 fnames = ['cl{}.jpg'.format(i) for i in range(1500, 2000)] 52 for fname in fnames: 53 src = os.path.join(or_data_dir + '/cl', fname) 54 dst = os.path.join(test_cloudy_dir, fname) 55 shutil.copyfile(src, dst) 56 57 58 #將前1000張sunny圖片復制到train_dir文件夾中 59 fnames = ['su{}.jpg'.format(i) for i in range(0,1000)] 60 for fname in fnames: 61 src = os.path.join(or_data_dir + '/su', fname) 62 dst = os.path.join(train_sunny_dir, fname) 63 shutil.copyfile(src, dst) 64 65 #將以下500張sunny圖片復制到train_dir文件夾中 66 fnames = ['su{}.jpg'.format(i) for i in range(1000, 1500)] 67 for fname in fnames: 68 src = os.path.join(or_data_dir + '/su', fname) 69 dst = os.path.join(validation_sunny_dir, fname) 70 shutil.copyfile(src, dst) 71 72 #將以下500個sunny圖片復制到文件夾test_dir 73 fnames = ['su{}.jpg'.format(i) for i in range(1500, 2000)] 74 for fname in fnames: 75 src = os.path.join(or_data_dir + '/su', fname) 76 dst = os.path.join(test_sunny_dir, fname) 77 shutil.copyfile(src, dst)
這是我分類后的數據集,分為測試集、訓練集、驗證集

數據處理好后,再進行構建網絡
1 #構建網絡 2 import keras 3 from keras import layers 4 from keras import models 5 model = models.Sequential()#利用keras中的sequential完成網絡的構建 6 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) 7 model.add(layers.MaxPooling2D((2, 2))) 8 9 model.add(layers.Conv2D(64, (3, 3), activation='relu')) 10 model.add(layers.MaxPooling2D((2, 2))) 11 12 model.add(layers.Conv2D(128, (3, 3), activation='relu')) 13 model.add(layers.MaxPooling2D((2, 2))) 14 15 model.add(layers.Conv2D(128, (3, 3), activation='relu')) 16 model.add(layers.MaxPooling2D((2, 2))) 17 18 model.add(layers.Flatten()) 19 model.add(layers.Dense(512, activation='relu')) 20 model.add(layers.Dense(1, activation='sigmoid')) 21 model.summary

圖像在輸入網絡之前先進行數據預處理
1 #圖像在輸入網絡之前進行數據預處理 2 import keras 3 from keras.preprocessing.image import ImageDataGenerator 4 5 train_datagen=ImageDataGenerator(rescale=1./255) #數據歸一化 6 test_datagen=ImageDataGenerator(rescale=1./255) 7 8 #指向訓練集圖片目錄路徑 9 train_dir='D:/weather/sunny_or_cloudy/train' 10 train_generator=train_datagen.flow_from_directory( 11 train_dir, 12 target_size=(150,150), #設置圖片大小 13 batch_size=20, 14 class_mode='binary') 15 16 #指向驗證集圖片目錄路徑 17 validation_dir='D:/weather/sunny_or_cloudy/validation' 18 validation_generator=test_datagen.flow_from_directory( 19 validation_dir, 20 target_size=(150,150), 21 batch_size=20, 22 class_mode='binary') 23 24 for data_batch,labels_batch in train_generator: 25 print('data batch shape:',data_batch.shape) 26 print('data batch shape:',labels_batch.shape) 27 break

接下來進行模型編譯和訓練
我先進行了10輪的訓練
1 #模型編譯 2 from keras import optimizers 3 model.compile(loss='binary_crossentropy', 4 optimizer=optimizers.RMSprop(lr=1e-4), 5 metrics=['acc']) 6 7 #利用批量生成器訓練模擬 8 history=model.fit_generator(train_generator, 9 steps_per_epoch=100, 10 epochs=10, 11 validation_data=validation_generator, 12 validation_steps=50)

再進行20輪的訓練
1 #利用批量生成器訓練模擬 2 history=model.fit_generator(train_generator, 3 steps_per_epoch=100, 4 epochs=20, 5 validation_data=validation_generator, 6 validation_steps=50)

根據訓練的數據進行繪圖
1 #繪制損失曲線和精度曲線 2 import matplotlib.pyplot as plt 3 acc = history.history['acc'] 4 val_acc=history.history['val_acc'] 5 loss = history.history['loss'] 6 val_loss=history.history['val_loss'] 7 epochs=range(len(acc)) 8 9 plt.plot(epochs, acc,'o',label='Training acc') 10 plt.plot(epochs, val_acc, 'b', label='validation acc') 11 plt.title('Training and validation accuracy') 12 plt.xlabel('Epochs') 13 plt.ylabel('Accuracy') 14 plt.legend() 15 16 plt.figure() 17 18 plt.plot(epochs, loss, 'o', label='Training loss') 19 plt.plot(epochs, val_loss, 'b', label='Validation loss') 20 plt.title('Train and validation loss') 21 plt.xlabel('Epochs') 22 plt.ylabel('Loss') 23 plt.legend() 24 25 plt.show()

為了盡可能的減小過擬合的影響,進行數據加強
1 #為了盡可能的消除過擬合,我打算進行數據增強 2 #定義ImageDataGenerator參數 3 train_datagen = ImageDataGenerator(rescale=1./255, 4 rotation_range=40, #將圖像隨機旋轉40度 5 width_shift_range=0.2, #在水平方向上平移比例為0.2 6 height_shift_range=0.2, #在垂直方向上平移比例為0.2 7 shear_range=0.2, #隨機錯切變換的角度為0.2 8 zoom_range=0.2, #圖片隨機縮放的范圍為0.2 9 horizontal_flip=True, #隨機將一半圖像水平翻轉 10 fill_mode='nearest') #填充創建像素 11 12 test_datagen = ImageDataGenerator(rescale=1./255) 13 14 train_generator = train_datagen.flow_from_directory( 15 train_dir, 16 target_size=(150,150), 17 batch_size=32, 18 class_mode='binary' 19 ) 20 21 validation_generator = test_datagen.flow_from_directory( 22 validation_dir, 23 target_size=(150,150), 24 batch_size=32, 25 class_mode='binary'

1 #為了更好的消除過擬合,我打算在模型中添加一個Dropout層,添加密集連接分類器前 2 model = models.Sequential() 3 model.add(layers.Conv2D(32, (3,3), activation='relu', 4 input_shape=(150,150, 3))) 5 model.add(layers.MaxPool2D((2,2))) 6 model.add(layers.Conv2D(64, (3,3), activation='relu')) 7 model.add(layers.MaxPool2D((2,2))) 8 model.add(layers.Conv2D(128, (3,3), activation='relu')) 9 model.add(layers.MaxPool2D((2,2))) 10 model.add(layers.Conv2D(128, (3,3), activation='relu')) 11 model.add(layers.MaxPool2D((2,2))) 12 13 model.add(layers.Flatten()) 14 model.add(layers.Dropout(0.5)) 15 model.add(layers.Dense(512, activation='relu')) 16 model.add(layers.Dense(1, activation='sigmoid')) 17 18 model.compile(optimizer=optimizers.RMSprop(lr=1e-4), 19 loss='binary_crossentropy', 20 metrics=['accuracy'])
重新啟動后再次運行20輪次
1 #模型編譯 2 from keras import optimizers 3 model.compile(loss='binary_crossentropy', 4 optimizer=optimizers.RMSprop(lr=1e-4), 5 metrics=['acc']) 6 7 #利用批量生成器訓練模擬 8 history=model.fit_generator(train_generator, 9 steps_per_epoch=100, 10 epochs=20, 11 validation_data=validation_generator, 12 validation_steps=50)

畫出增強后的圖片
1 #繪制損失曲線和精度曲線 2 import matplotlib.pyplot as plt 3 acc = history.history['acc'] 4 val_acc=history.history['val_acc'] 5 loss = history.history['loss'] 6 val_loss=history.history['val_loss'] 7 epochs=range(len(acc)) 8 9 plt.plot(epochs, acc,'o',label='Training acc') 10 plt.plot(epochs, val_acc, 'b', label='validation acc') 11 plt.title('Training and validation accuracy') 12 plt.xlabel('Epochs') 13 plt.ylabel('Accuracy') 14 plt.legend() 15 16 plt.figure() 17 18 plt.plot(epochs, loss, 'o', label='Training loss') 19 plt.plot(epochs, val_loss, 'b', label='Validation loss') 20 plt.title('Train and validation loss') 21 plt.xlabel('Epochs') 22 plt.ylabel('Loss') 23 plt.legend() 24 plt.show()

對比之前的圖片可以看出有所改善
現自定義圖片,將自定義的圖片導入到模型當中,查看測試識別結果
1 #讀取用戶自定義的圖像文件,修改尺寸后保存 2 import matplotlib.pyplot as plt 3 from PIL import Image 4 import os.path 5 6 #自定義函數,將圖片縮小到(150,150)的大小 7 def convertjpg(jpgfile,outdir,width=150,height=150): 8 img=Image.open(jpgfile ) 9 new_img=img.resize((width,height),Image.BILINEAR) 10 new_img.save(os.path.join(outdir,os.path.basename(jpgfile))) 11 #讀取用戶自定義圖片 12 jpgfile='D:/weather/sunny_or_cloudy/sample/cl3.jpg' 13 convertjpg(jpgfile,'D:/weather/sunny_or_cloudy') 14 img_scale=plt.imread('D:/weather/sunny_or_cloudy/cl3.jpg') 15 plt.imshow(img_scale) #顯示改變圖像大小后的圖片(150x150)

導入測試
1 #導入模型 2 from keras.models import load_model 3 #導入訓練模型文件 4 model=load_model('weather.h6') 5 #model.summary 6 7 img_scale=img_scale.reshape(1,150,150,3).astype('float32') 8 img_scale=img_scale/255 #歸一化到0——1之間 9 10 result=model.predict(img_scale)#讀取圖片信息 11 #根據result的值進行判定 12 if result>0.5: 13 print('該圖片是多雲的概率為:',result) 14 else: 15 print('該圖片是晴天的概率為:',1-result)

全代碼
1 #對數據圖片進行重命名編號 2 import os 3 image_dir = "D:/weather/kaggle_original_data/" 4 i = 0 5 for dir_name in os.listdir(image_dir): 6 for image_name in os.listdir(os.path.join(image_dir, dir_name)): 7 old_name = os.path.join(image_dir, dir_name, image_name) 8 new_name = os.path.join(image_dir, dir_name, (dir_name + str(i) + ".jpg")) 9 print("new image name :", new_name) 10 print("old image name:", old_name) 11 os.rename(old_name, new_name) 12 i = i + 1 13 i = 0 14 15 16 import shutil #導入os,shutil庫用來創建新的數據集 17 #創建數據集 18 from os import mkdir 19 or_data_dir='D:\weather\kaggle_original_data' 20 base_dir='D:\weather\sunny_or_cloudy' 21 os.mkdir(base_dir) 22 #創建訓練集目錄 23 train_dir=os.path.join(base_dir,'train') 24 os,mkdir(train_dir) 25 #創建驗證集目錄 26 validation_dir=os.path.join(base_dir,'validation') 27 os.mkdir(validation_dir) 28 #創建測試集目錄 29 test_dir=os.path.join(base_dir,'test') 30 os.mkdir(test_dir) 31 #創建sunny的訓練集目錄 32 train_sunny_dir=os.path.join(train_dir,'sunny') 33 os.mkdir(train_sunny_dir) 34 #創建cloudy的訓練集目錄 35 train_cloudy_dir=os.path.join(train_dir,'cloudy') 36 os.mkdir(train_cloudy_dir) 37 #創建sunny驗證集目錄 38 validation_sunny_dir=os.path.join(validation_dir,'sunny') 39 os.mkdir(validation_sunny_dir) 40 #創建cloudy驗證集目錄 41 validation_cloudy_dir=os.path.join(validation_dir,'cloudy') 42 os.mkdir(validation_cloudy_dir) 43 #創建sunny的測試集目錄 44 test_sunny_dir=os.path.join(test_dir,'sunny') 45 os.mkdir(test_sunny_dir) 46 #創建cloudy的測試集目錄 47 test_cloudy_dir=os.path.join(test_dir,'cloudy') 48 os.mkdir(test_cloudy_dir) 49 50 #將前1000個cloudy圖像復制到train_dir文件夾 51 fnames = ['cl{}.jpg'.format(i) for i in range(0,1000)] 52 for fname in fnames: 53 src = os.path.join(or_data_dir + '/cl', fname) 54 dst = os.path.join(train_cloudy_dir, fname) 55 shutil.copyfile(src, dst) 56 #將以下500個cloudy圖像復制到train_dir文件夾中 57 fnames = ['cl{}.jpg'.format(i) for i in range(1000, 1500)] 58 for fname in fnames: 59 src = os.path.join(or_data_dir + '/cl', fname) 60 dst = os.path.join(validation_cloudy_dir, fname) 61 shutil.copyfile(src, dst) 62 #將以下500個cloudy圖像復制到test_dir文件夾 63 fnames = ['cl{}.jpg'.format(i) for i in range(1500, 2000)] 64 for fname in fnames: 65 src = os.path.join(or_data_dir + '/cl', fname) 66 dst = os.path.join(test_cloudy_dir, fname) 67 shutil.copyfile(src, dst) 68 #將前1000張sunny圖片復制到train_dir文件夾中 69 fnames = ['su{}.jpg'.format(i) for i in range(0,1000)] 70 for fname in fnames: 71 src = os.path.join(or_data_dir + '/su', fname) 72 dst = os.path.join(train_sunny_dir, fname) 73 shutil.copyfile(src, dst) 74 #將以下500張sunny圖片復制到train_dir文件夾中 75 fnames = ['su{}.jpg'.format(i) for i in range(1000, 1500)] 76 for fname in fnames: 77 src = os.path.join(or_data_dir + '/su', fname) 78 dst = os.path.join(validation_sunny_dir, fname) 79 shutil.copyfile(src, dst) 80 #將以下500個sunny圖片復制到文件夾test_dir 81 fnames = ['su{}.jpg'.format(i) for i in range(1500, 2000)] 82 for fname in fnames: 83 src = os.path.join(or_data_dir + '/su', fname) 84 dst = os.path.join(test_sunny_dir, fname) 85 shutil.copyfile(src, dst) 86 87 #構建網絡 88 import keras 89 from keras import layers 90 from keras import models 91 model = models.Sequential()#利用keras中的sequential完成網絡的構建 92 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) 93 model.add(layers.MaxPooling2D((2, 2))) 94 95 model.add(layers.Conv2D(64, (3, 3), activation='relu')) 96 model.add(layers.MaxPooling2D((2, 2))) 97 98 model.add(layers.Conv2D(128, (3, 3), activation='relu')) 99 model.add(layers.MaxPooling2D((2, 2))) 100 101 model.add(layers.Conv2D(128, (3, 3), activation='relu')) 102 model.add(layers.MaxPooling2D((2, 2))) 103 104 model.add(layers.Flatten()) 105 model.add(layers.Dense(512, activation='relu')) 106 model.add(layers.Dense(1, activation='sigmoid')) 107 model.summary 108 109 #圖像在輸入網絡之前進行數據預處理 110 from keras.preprocessing.image import ImageDataGenerator 111 112 train_datagen=ImageDataGenerator(rescale=1./255) #數據歸一化 113 test_datagen=ImageDataGenerator(rescale=1./255) 114 115 #指向訓練集圖片目錄路徑 116 train_dir='D:/weather/sunny_or_cloudy/train' 117 train_generator=train_datagen.flow_from_directory( 118 train_dir, 119 target_size=(150,150), #設置圖片大小 120 batch_size=20, 121 class_mode='binary') 122 123 #指向驗證集圖片目錄路徑 124 validation_dir='D:/weather/sunny_or_cloudy/validation' 125 validation_generator=test_datagen.flow_from_directory( 126 validation_dir, 127 target_size=(150,150), 128 batch_size=20, 129 class_mode='binary') 130 131 for data_batch,labels_batch in train_generator: 132 print('data batch shape:',data_batch.shape) 133 print('data batch shape:',labels_batch.shape) 134 break 135 136 #模型編譯 137 from keras import optimizers 138 model.compile(loss='binary_crossentropy', 139 optimizer=optimizers.RMSprop(lr=1e-4), 140 metrics=['acc']) 141 142 #利用批量生成器訓練模擬 143 history=model.fit_generator(train_generator, 144 steps_per_epoch=100, 145 epochs=10, 146 validation_data=validation_generator, 147 validation_steps=50) 148 #利用批量生成器訓練模擬 149 history=model.fit_generator(train_generator, 150 steps_per_epoch=100, 151 epochs=20, 152 validation_data=validation_generator, 153 validation_steps=50) 154 #繪制損失曲線和精度曲線 155 import matplotlib.pyplot as plt 156 acc = history.history['acc'] 157 val_acc=history.history['val_acc'] 158 loss = history.history['loss'] 159 val_loss=history.history['val_loss'] 160 epochs=range(len(acc)) 161 162 plt.plot(epochs, acc,'o',label='Training acc') 163 plt.plot(epochs, val_acc, 'b', label='validation acc') 164 plt.title('Training and validation accuracy') 165 plt.xlabel('Epochs') 166 plt.ylabel('Accuracy') 167 plt.legend() 168 169 plt.figure() 170 171 plt.plot(epochs, loss, 'o', label='Training loss') 172 plt.plot(epochs, val_loss, 'b', label='Validation loss') 173 plt.title('Train and validation loss') 174 plt.xlabel('Epochs') 175 plt.ylabel('Loss') 176 plt.legend() 177 178 plt.show() 179 180 #為了盡可能的消除過擬合,我打算進行數據增強 181 #定義ImageDataGenerator參數 182 train_datagen = ImageDataGenerator(rescale=1./255, 183 rotation_range=40, #將圖像隨機旋轉40度 184 width_shift_range=0.2, #在水平方向上平移比例為0.2 185 height_shift_range=0.2, #在垂直方向上平移比例為0.2 186 shear_range=0.2, #隨機錯切變換的角度為0.2 187 zoom_range=0.2, #圖片隨機縮放的范圍為0.2 188 horizontal_flip=True, #隨機將一半圖像水平翻轉 189 fill_mode='nearest') #填充創建像素 190 191 test_datagen = ImageDataGenerator(rescale=1./255) 192 193 train_generator = train_datagen.flow_from_directory( 194 train_dir, 195 target_size=(150,150), 196 batch_size=32, 197 class_mode='binary' 198 ) 199 200 validation_generator = test_datagen.flow_from_directory( 201 validation_dir, 202 target_size=(150,150), 203 batch_size=32, 204 class_mode='binary' 205 206 #為了更好的消除過擬合,我打算在模型中添加一個Dropout層,添加密集連接分類器前 207 model = models.Sequential() 208 model.add(layers.Conv2D(32, (3,3), activation='relu', 209 input_shape=(150,150, 3))) 210 model.add(layers.MaxPool2D((2,2))) 211 model.add(layers.Conv2D(64, (3,3), activation='relu')) 212 model.add(layers.MaxPool2D((2,2))) 213 model.add(layers.Conv2D(128, (3,3), activation='relu')) 214 model.add(layers.MaxPool2D((2,2))) 215 model.add(layers.Conv2D(128, (3,3), activation='relu')) 216 model.add(layers.MaxPool2D((2,2))) 217 218 model.add(layers.Flatten()) 219 model.add(layers.Dropout(0.5)) 220 model.add(layers.Dense(512, activation='relu')) 221 model.add(layers.Dense(1, activation='sigmoid')) 222 223 model.compile(optimizer=optimizers.RMSprop(lr=1e-4), 224 loss='binary_crossentropy', 225 metrics=['accuracy']) 226 227 #重新啟動后再次運行20輪次 228 #模型編譯 229 from keras import optimizers 230 model.compile(loss='binary_crossentropy', 231 optimizer=optimizers.RMSprop(lr=1e-4), 232 metrics=['acc']) 233 234 #利用批量生成器訓練模擬 235 history=model.fit_generator(train_generator, 236 steps_per_epoch=100, 237 epochs=20, 238 validation_data=validation_generator, 239 validation_steps=50) 240 241 #將訓練模型數據文件保存在文件h6中 242 model.save('weather.h6') 243 #繪制損失曲線和精度曲線 244 import matplotlib.pyplot as plt 245 acc = history.history['acc'] 246 val_acc=history.history['val_acc'] 247 loss = history.history['loss'] 248 val_loss=history.history['val_loss'] 249 epochs=range(len(acc)) 250 251 plt.plot(epochs, acc,'o',label='Training acc') 252 plt.plot(epochs, val_acc, 'b', label='validation acc') 253 plt.title('Training and validation accuracy') 254 plt.xlabel('Epochs') 255 plt.ylabel('Accuracy') 256 plt.legend() 257 258 plt.figure() 259 260 plt.plot(epochs, loss, 'o', label='Training loss') 261 plt.plot(epochs, val_loss, 'b', label='Validation loss') 262 plt.title('Train and validation loss') 263 plt.xlabel('Epochs') 264 plt.ylabel('Loss') 265 plt.legend() 266 plt.show() 267 268 #讀取用戶自定義的圖像文件,修改尺寸后保存 269 import matplotlib.pyplot as plt 270 from PIL import Image 271 import os.path 272 273 #自定義函數,將圖片縮小到(150,150)的大小 274 def convertjpg(jpgfile,outdir,width=150,height=150): 275 img=Image.open(jpgfile ) 276 new_img=img.resize((width,height),Image.BILINEAR) 277 new_img.save(os.path.join(outdir,os.path.basename(jpgfile))) 278 #讀取用戶自定義圖片 279 jpgfile='D:/weather/sunny_or_cloudy/sample/cl3.jpg' 280 convertjpg(jpgfile,'D:/weather/sunny_or_cloudy') 281 img_scale=plt.imread('D:/weather/sunny_or_cloudy/cl3.jpg') 282 plt.imshow(img_scale) #顯示改變圖像大小后的圖片(150x150) 283 284 285 #導入模型 286 from keras.models import load_model 287 #導入訓練模型文件 288 model=load_model('weather.h7') 289 #model.summary 290 291 img_scale=img_scale.reshape(1,150,150,3).astype('float32') 292 img_scale=img_scale/255 #歸一化到0——1之間 293 294 result=model.predict(img_scale)#讀取圖片信息 295 #根據result的值進行判定 296 if result>0.5: 297 print('該圖片是多雲的概率為:',result) 298 else: 299 print('該圖片是晴天的概率為:',1-result)
(四)總結
1.在進行本次作業設計的過程中,對機器學習有了進一步的了解,但還不是完全了解,有些地方還是依葫蘆畫瓢,數據處理不太好,自定義圖片判定的准確度較低
2.收獲:在此次設計中,我切身感受到,要學會代碼就要親自去操作去編寫,碰到問題,去上網查和朋友討論,在實踐中掌握代碼。
不足之處:在本設計中對於自定義的圖片識別度較低,在使用數據增強和dropout后過擬合情況較前略有改善,但效果還是不好,應該在防止過擬合機制方面多做嘗試。
