浅谈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 del()函数用法
Mar 24 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
python3 反射的四种基本方法解析
Aug 26 Python
python实现网站微信登录的示例代码
Sep 18 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
django 模型字段设置默认值代码
Jul 15 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python实现学生信息管理系统源码
Feb 22 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
Python中标准库OS的常用方法总结大全
2017/07/19 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
测试驱动开发的主要步骤是什么
2014/12/10 面试题
服装公司总经理岗位职责
2013/11/30 职场文书
白酒市场营销方案
2014/02/25 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
党员争先创优承诺书
2015/01/20 职场文书
档案接收函格式
2015/01/30 职场文书
项目建议书
2015/02/04 职场文书
2016党校培训心得体会
2016/01/07 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP