浅谈keras使用预训练模型vgg16分类,损失和准确度不变

作者:我的九八卡 时间:2021-05-25 18:23:40 

问题keras使用预训练模型vgg16分类,损失和准确度不变。

细节:使用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)

# 创建模型
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训练的准确率都不变。

浅谈keras使用预训练模型vgg16分类,损失和准确度不变

探索

我一直以为是我的数据的读取方式不对,我一直在从这方面下手,但是后来我发现根本不是这个原因,也找到了解决方案,具体原因有三点,三点是递进关系。

1.数据集样本各类别数量差距大

如果没有这种情况就看看第二点。

2.训练集和数据集是手动划分的,改为代码自动划分

代码如下:

X_train, X_test,Y_train, Y_test = train_test_split(data, labels, test_size=0.4, random_state=42)```

上述方法要多设置几个epoch,要有耐心的等,如果还是测试的准确率还是不变,那就可能是第二个原因。

3. 训练模型不适用,或者模型参数不恰当,建议调参,或者改算法

如果第一个方法还是不行那就可能是算法不适合这个数据集,可以打印混淆矩阵看一下,是不是分类错误率太高,比如我的数据集,做二分类,结果第二类全分到第一类了。

来源:https://blog.csdn.net/qq_36490878/article/details/80906957

标签:keras,vgg16,损失,准确度
0
投稿

猜你喜欢

  • Python按天实现生成时间范围序列的方法详解

    2022-12-31 13:48:45
  • Python利用PyQT5设置闹钟功能

    2023-05-08 15:34:08
  • tensorflow指定CPU与GPU运算的方法实现

    2023-08-09 11:18:52
  • Python 读取图片文件为矩阵和保存矩阵为图片的方法

    2022-07-23 05:21:11
  • Python实现动态添加类的属性或成员函数的解决方法

    2021-05-13 17:13:41
  • 历数Firefox2.0对XML处理的改进

    2007-11-27 12:41:00
  • python+tifffile之tiff文件读写方式

    2022-03-16 13:17:41
  • 用 Django 开发一个 Python Web API的方法步骤

    2021-05-24 02:36:11
  • Python中的for循环详情

    2022-04-11 04:30:54
  • Django用内置方法实现简单搜索功能的方法

    2021-09-15 21:02:52
  • 关于Python 常用获取元素 Driver 总结

    2022-12-24 05:03:28
  • python之消除前缀重命名的方法

    2021-12-25 09:28:42
  • 采用python实现简单QQ单用户机器人的方法

    2022-06-26 03:28:40
  • python将unicode和str互相转化的实现

    2023-07-17 21:36:34
  • 给Python学习者的文件读写指南(含基础与进阶)

    2021-04-26 12:05:40
  • Python调整数组形状如何实现

    2021-01-06 09:55:34
  • UI自动化定位常用实现方法代码示例

    2022-09-22 09:47:13
  • 一个sql查询器,自动画表格填字段

    2011-04-10 10:58:00
  • PHP自定义函数格式化json数据示例

    2023-07-17 07:17:45
  • ie8下ewebeditor无效的解决办法

    2010-02-28 10:31:00
  • asp之家 网络编程 m.aspxhome.com