浅谈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编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
Python实现带百分比的进度条
Jun 28 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
python多进程中的内存复制(实例讲解)
Jan 05 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
python如何让类支持比较运算
Mar 20 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
Django中使用Celery的方法步骤
Dec 07 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
python引入其他文件夹下的py文件具体方法
May 23 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中读取和写入WORD文档的代码
2008/04/09 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
vue中监听返回键问题
2019/08/28 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
python的迭代器与生成器实例详解
2014/07/16 Python
Python中函数的用法实例教程
2014/09/08 Python
Python画图学习入门教程
2016/07/01 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
Python实现粒子群算法的示例
2021/02/14 Python
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
asyncio异步编程之Task对象详解
2022/03/13 Python