淺談keras使用預訓練模型vgg16分類,損失和準確度不變
問題keras使用預訓練模型vgg16分類,損失和準確度不變。
細節(jié):使用keras訓練一個兩類數據,正負比例1:3,在vgg16后添加了幾個全鏈接并初始化了。并且對所有層都允許訓練。
但是準確度一直是0.75.
數據預先處理已經檢查過格式正確
再將模型中relu改成sigmoid就正常了。
數據處理程序
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是訓練集,y_train是訓練標簽
ret_y = ret_y[index]
yield ret_X,ret_y
if __name__ == "__main__":
type = "train"
# 數據生成器,每個mini-batch包含32個正樣本(屬于VOC 20個類別),96個負樣本(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)
# 訓練SVM
# 非極大值抑制
# 預測
模型程序:
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
補充知識:val_acc一直不變
val_loss一直不變的原因
之前用keras編寫了LSTM模型,做圖片分類,自己劃分了測試集和訓練集,但是得到的結果是每個epoch訓練的準確率都不變。

探索
我一直以為是我的數據的讀取方式不對,我一直在從這方面下手,但是后來我發(fā)現根本不是這個原因,也找到了解決方案,具體原因有三點,三點是遞進關系。
1.數據集樣本各類別數量差距大
如果沒有這種情況就看看第二點。
2.訓練集和數據集是手動劃分的,改為代碼自動劃分
代碼如下:
X_train, X_test,Y_train, Y_test = train_test_split(data, labels, test_size=0.4, random_state=42)```
上述方法要多設置幾個epoch,要有耐心的等,如果還是測試的準確率還是不變,那就可能是第二個原因。
3. 訓練模型不適用,或者模型參數不恰當,建議調參,或者改算法
如果第一個方法還是不行那就可能是算法不適合這個數據集,可以打印混淆矩陣看一下,是不是分類錯誤率太高,比如我的數據集,做二分類,結果第二類全分到第一類了。
以上這篇淺談keras使用預訓練模型vgg16分類,損失和準確度不變就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python-django中的APPEND_SLASH實現方法
這篇文章主要介紹了python-django中的APPEND_SLASH實現方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
Python數據分析:手把手教你用Pandas生成可視化圖表的教程
今天小編就為大家分享一篇Python數據分析:手把手教你用Pandas生成可視化圖表的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python中mediapipe庫踩過的坑實戰(zhàn)記錄
MediaPipe是由google制作的開源的、跨平臺的機器學習框架,可以將一些模型部署到不同的平臺和設備上使用的同時,也能保住檢測速度,下面這篇文章主要給大家介紹了關于python中mediapipe庫踩過的坑的相關資料,需要的朋友可以參考下2023-04-04

