iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
AI & Data

Machine Learning與軟工是否搞錯了什麼?系列 第 21

Day 21 如何讓測試資料集的正確率變高呢? Voting篇

  • 分享至 

  • xImage
  •  

如何讓測試資料集的正確率變高呢? Voting篇

在Day 20天中,我們使用了ResNet架構,現在我們要試試看如何能再次提高正確率!

前置作業

我們使用Colab來當作我們的實作平台,並使用Keras來完成。

資料集

fashion_mnist,為Keras內建的資料集
訓練集為60,000 張28x28 像素灰度圖像,測試集為10,000 同規格圖像,總共10 類時尚物品標籤。該數據集可以用作MNIST 的直接替代品。類別標籤是:
類別 描述 中文
0 T-shirt/top T卹/上衣
1 Trouser 褲子
2 Pullover 套頭衫
3 Dress 連衣裙
4 Coat 外套
5 Sandal 涼鞋
6 Shirt 襯衫
7 Sneaker 運動鞋
8 Bag 背包
9 Ankle boot 短靴

Code

我們使用12層當作基準。

12層

#12層
tag = 'ResNet0910_fashion_mnist_12layer_{}'.format(0)
h5_weight_path = os.path.join(WEIGHT_DIR, './' + tag + '.h5')

input_shape=(28,28,1)

input = Input(input_shape, name='input')

layer=Conv2D(32, kernel_size=(2, 2), activation='relu', padding='same')(input)
layer=BatchNormalization()(layer)
for i in range(2):
  layer=Conv2D(32, kernel_size=(2, 2), activation='relu',padding='same')(layer)
  layer=BatchNormalization()(layer)
layer=MaxPooling2D(pool_size=(2, 2))(layer)
for i in range(3):
  layer=Conv2D(64, kernel_size=(2, 2), activation='relu',padding='same')(layer)
  layer=BatchNormalization()(layer)
layer=MaxPooling2D(pool_size=(2, 2))(layer)
for i in range(3):
  layer=Conv2D(128, kernel_size=(2, 2), activation='relu',padding='same')(layer)
  layer=BatchNormalization()(layer)
layer=MaxPooling2D(pool_size=(2, 2))(layer)
for i in range(3):
  layer=Conv2D(256, kernel_size=(2, 2), activation='relu',padding='same')(layer)
  layer=BatchNormalization()(layer)
layer=MaxPooling2D(pool_size=(2, 2))(layer)

layer = Dropout(0.5)(layer)
layer = Flatten(name='flatten')(layer)
output = Dense(nb_classes, name="Dense_10nb", activation='softmax')(layer)

model = Model(inputs=[input], outputs=[output])

model.compile(loss='sparse_categorical_crossentropy',optimizer=keras.optimizers.Adam(lr=0.0001,decay=1e-6),metrics = ['accuracy'])
model.summary()

Voting

投票是一種很簡單的方式,而投票為什麼有用呢?我們可以想像一下,當大家都很厲害時,出錯的機率就很小,假設現在有三個人來投票,並且這三個人不會互相影響對方的投票結果,為獨立事件,成功率為80%,出錯率為20%,那麼我們可以得到三個都成功機率為51.2%,兩個成功一個失敗機率為38.4%,一個成功兩個失敗機率為9.6%,三個失敗機率為0.8%,以這個範例來說,我們可以得到最後成功的機率會比失敗的機率還高,並且提高了期望值提高了9.6%。
投票可以使用很多個分類器參與,如果為奇數個分類器,那投票的結果就是少數服從多數;如果為偶數個分類器,那麼當投票數量一樣時,我們就隨機決定投票結果。

code

def voting(predictlist,numbers):
  # predictlist是放所有model的預測結果
  # numbers則為投票次數
  predictlist = np.reshape(predictlist, (-1, len(y_test)))
  voting_acc = 0
  
  for testnumber in range(len(y_test)):
    decide=np.zeros(10)
    for number in range(numbers):
      decide[int(predictlist[number][testnumber])]+=1
    #查看投票結果與實際答案是否相同
    if np.argmax(decide) == y_test[testnumber]:
      voting_acc+=1

  print("voting_acc:", voting_acc/len(y_test))
  return voting_acc/len(y_test)

正確率比較

層數 12層 3個投票 5個投票 7個投票 9個投票 15個投票
正確率 88.63% 90.48% 91.41% 91.61% 91.75% 91.89%

結論

我們發現投票可以增加正確率,且越多個投票正確率越高,但達到一定數量後,正確率的增加會逐漸飽和。


上一篇
Day 20 ResNet如何實現
下一篇
Day 22 如何讓測試資料集的正確率變高呢? Fusion篇
系列文
Machine Learning與軟工是否搞錯了什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言