浅谈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从入门到精通(DAY 1)
Dec 20 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
Django框架models使用group by详解
Mar 11 Python
Keras自定义IOU方式
Jun 10 Python
python爬取音频下载的示例代码
Oct 19 Python
python 爬取京东指定商品评论并进行情感分析
May 27 Python
Python if else条件语句形式详解
Mar 24 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
第十三节--对象串行化
2006/11/16 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
工作表现自我评价
2014/02/08 职场文书
医德考评自我评价
2014/09/14 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
五一放假通知怎么写
2015/08/18 职场文书
Python中字符串对象语法分享
2022/02/24 Python