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