浅谈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标准异常和异常处理详解
Feb 02 Python
介绍Python中的fabs()方法的使用
May 14 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
基于PyTorch中view的用法说明
Mar 03 Python
Python 如何解决稀疏矩阵运算
May 26 Python
Python基本数据类型之字符串str
Jul 21 Python
python中urllib包的网络请求教程
Apr 19 Python
Pandas 数据编码的十种方法
Apr 20 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实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP面向对象详解(三)
2015/12/07 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
分享6个隐藏的python功能
2017/12/07 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python用input输入列表的实例代码
2020/02/07 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
python中@contextmanager实例用法
2021/02/07 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
一套SQL笔试题
2016/08/14 面试题
final, finally, finalize的区别
2012/03/01 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
初中三年学生的学习自我评价
2013/11/13 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android