淺談keras使用預(yù)訓(xùn)練模型vgg16分類,損失和準(zhǔn)確度不變
問題keras使用預(yù)訓(xùn)練模型vgg16分類,損失和準(zhǔn)確度不變。
細(xì)節(jié):使用keras訓(xùn)練一個(gè)兩類數(shù)據(jù),正負(fù)比例1:3,在vgg16后添加了幾個(gè)全鏈接并初始化了。并且對(duì)所有層都允許訓(xùn)練。
但是準(zhǔn)確度一直是0.75.
數(shù)據(jù)預(yù)先處理已經(jīng)檢查過格式正確
再將模型中relu改成sigmoid就正常了。
數(shù)據(jù)處理程序
import os import pickle import numpy as np import DataFile import SelectiveSearch import Generator import IoU import Model_CRNN_VGG16 from keras.preprocessing.image import ImageDataGenerator from keras.callbacks import ModelCheckpoint def data_generator(gen1,gen0): while True: data_pos = next(gen1) data_neg = next(gen0) ret_X = np.vstack((data_pos[0],data_neg[0])) ret_y = np.vstack((data_pos[1],data_neg[1])) index = np.arange(ret_y.shape[0]) np.random.shuffle(index) ret_X = ret_X[index, :, :, :] # X_train是訓(xùn)練集,y_train是訓(xùn)練標(biāo)簽 ret_y = ret_y[index] yield ret_X,ret_y if __name__ == "__main__": type = "train" # 數(shù)據(jù)生成器,每個(gè)mini-batch包含32個(gè)正樣本(屬于VOC 20個(gè)類別),96個(gè)負(fù)樣本(background) RESIZE = (224, 224) path = "category_images" categories = os.listdir(path) categories.append('background') print(categories) train_1_datagen = ImageDataGenerator( rescale=1.0/255, #shear_range=0.2, #zoom_range=0.2, horizontal_flip=True) train_1_generator = train_1_datagen.flow_from_directory( 'category_images', target_size=RESIZE, batch_size=32, classes = categories) train_0_datagen = ImageDataGenerator( rescale=1.0 / 255, #shear_range=0.2, #zoom_range=0.2, horizontal_flip=True) train_0_generator = train_0_datagen.flow_from_directory( 'category_background', target_size=RESIZE, batch_size=32*3, classes=categories) generator = data_generator(train_1_generator,train_0_generator) # 創(chuàng)建模型 model = Model_CRNN_VGG16.CRNN_Model(input_shape=(*RESIZE,3)) cnn = model.CNN(len(categories)) if os.path.exists('weights-cnn.hdf5'): cnn.load_weights('weights-cnn.hdf5') if type == "train": checkpoint = ModelCheckpoint('weights-cnn.hdf5',save_weights_only=True) cnn.fit_generator(generator = generator,steps_per_epoch=200,epochs=1000,callbacks=[checkpoint]) else: img = next(generator)[0] result = cnn.predict(img) print(result) # 訓(xùn)練SVM # 非極大值抑制 # 預(yù)測(cè)
模型程序:
from keras.applications.vgg16 import VGG16 from keras.layers import * from keras.models import Model from keras.optimizers import SGD,Adam class CRNN_Model(): def __init__(self,input_shape,trainable=True): vgg16 = VGG16(include_top=False,weights="imagenet", input_shape=input_shape) for layer in vgg16.layers: layer.trainable = trainable self.base_model = vgg16 def CNN(self,classes): img_input = self.base_model.input x = self.base_model.get_layer('block5_conv3').output x = Flatten(name='crnn_flatten')(x) x = Dense(512,activation='relu', kernel_initializer='he_normal', name='crnn_fc1')(x) x = Dense(512,activation='relu', kernel_initializer='he_normal',name='crnn_fc2')(x) x = Dense(classes, activation='softmax', kernel_initializer='he_normal', name='crnn_predictions')(x) model = Model(img_input,x) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) adam = Adam() model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy']) model.summary() return model if __name__ == "__main__": pass
補(bǔ)充知識(shí):val_acc一直不變
val_loss一直不變的原因
之前用keras編寫了LSTM模型,做圖片分類,自己劃分了測(cè)試集和訓(xùn)練集,但是得到的結(jié)果是每個(gè)epoch訓(xùn)練的準(zhǔn)確率都不變。
探索
我一直以為是我的數(shù)據(jù)的讀取方式不對(duì),我一直在從這方面下手,但是后來我發(fā)現(xiàn)根本不是這個(gè)原因,也找到了解決方案,具體原因有三點(diǎn),三點(diǎn)是遞進(jìn)關(guān)系。
1.數(shù)據(jù)集樣本各類別數(shù)量差距大
如果沒有這種情況就看看第二點(diǎn)。
2.訓(xùn)練集和數(shù)據(jù)集是手動(dòng)劃分的,改為代碼自動(dòng)劃分
代碼如下:
X_train, X_test,Y_train, Y_test = train_test_split(data, labels, test_size=0.4, random_state=42)```
上述方法要多設(shè)置幾個(gè)epoch,要有耐心的等,如果還是測(cè)試的準(zhǔn)確率還是不變,那就可能是第二個(gè)原因。
3. 訓(xùn)練模型不適用,或者模型參數(shù)不恰當(dāng),建議調(diào)參,或者改算法
如果第一個(gè)方法還是不行那就可能是算法不適合這個(gè)數(shù)據(jù)集,可以打印混淆矩陣看一下,是不是分類錯(cuò)誤率太高,比如我的數(shù)據(jù)集,做二分類,結(jié)果第二類全分到第一類了。
以上這篇淺談keras使用預(yù)訓(xùn)練模型vgg16分類,損失和準(zhǔn)確度不變就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法
Qt平臺(tái)對(duì)SQL編程有著良好的支持,PyQt5也一并繼承了過來,這篇文章主要介紹了Python GUI教程之在PyQt5中使用數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2021-09-09Django 如何使用日期時(shí)間選擇器規(guī)范用戶的時(shí)間輸入示例代碼詳解
這篇文章主要介紹了 Django 如何使用日期時(shí)間選擇器規(guī)范用戶的時(shí)間輸入,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Django開發(fā)中使用Ueditor上傳圖片遇到的坑及解決
在Django開發(fā)中使用Ueditor上傳圖片時(shí),可能會(huì)遇到后端配置不正確的問題,建議在實(shí)例化Ueditor后加上serverUrl,這可以在Chrome的F12工具中查看請(qǐng)求的后端配置項(xiàng),此外,如果需要修改上傳路徑,可以在配置文件中更改路徑,并調(diào)整view.py中的代碼來管理上傳文件2024-09-09Python內(nèi)建類型list源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python內(nèi)建類型list源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python趣味編程實(shí)現(xiàn)手繪風(fēng)視頻示例
本文與計(jì)算機(jī)視覺相關(guān),使用Python將圖片由自然風(fēng)轉(zhuǎn)化為手繪風(fēng),期間未對(duì)圖片進(jìn)行任何預(yù)處理、后處理;代碼中只借助了兩個(gè)常見庫(kù),核心計(jì)算由Numpy負(fù)責(zé) ,Pillow 負(fù)責(zé)圖片讀寫2021-10-10python 如何利用chinese_calendar 獲取上一個(gè)工作日日期
這篇文章主要介紹了python 利用chinese_calendar 獲取上一個(gè)工作日日期,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03