機器學習——對天氣進行簡單分類


(一)選題背景

機器學習是人工智能領域一個重要的研究課題,在課堂上學習完機器學習中的貓狗識別案例后,想找個簡單的數據集做個機器學習期末設計,同時借助本次作業去了解機器學習的代碼原理以及其操作。

選擇天氣分類的主要原因: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后過擬合情況較前略有改善,但效果還是不好,應該在防止過擬合機制方面多做嘗試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM