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


Posted in Python onJuly 02, 2020

问题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. 训练模型不适用,或者模型参数不恰当,建议调参,或者改算法

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

以上这篇浅谈keras使用预训练模型vgg16分类,损失和准确度不变就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现可将字符转换成大写的tcp服务器实例
Apr 29 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
python图书管理系统
Apr 05 Python
django session完成状态保持的方法
Nov 27 Python
python程序控制NAO机器人行走
Apr 29 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
python脚本和网页有何区别
Jul 02 #Python
keras:model.compile损失函数的用法
Jul 01 #Python
win10安装python3.6的常见问题
Jul 01 #Python
Python代码需要缩进吗
Jul 01 #Python
导致python中import错误的原因是什么
Jul 01 #Python
详细分析Python垃圾回收机制
Jul 01 #Python
Python自带的IDE在哪里
Jul 01 #Python
You might like
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
php实现短信发送代码
2015/07/05 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
Django更新models数据库结构步骤
2020/04/01 Python
iPython pylab模式启动方式
2020/04/24 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
区域总监的岗位职责
2013/11/21 职场文书
教师个人剖析材料
2014/02/05 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
工地标语大全
2014/06/18 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
新生开学寄语大全
2015/05/28 职场文书
收入证明范本
2015/06/12 职场文书
2016七夕情人节感言
2015/12/09 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS