浅谈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中强大的命令行库click入门教程
Dec 26 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
python 编写简单网页服务器的实例
Jun 01 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
jupyter notebook 重装教程
Apr 16 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
Python如何批量生成和调用变量
Nov 21 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Pygame Event事件模块的详细示例
Nov 17 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动态创建Web站点的方法
2011/08/14 PHP
php的ajax简单实例
2014/02/27 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
在Python下尝试多线程编程
2015/04/28 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
python把1变成01的步骤总结
2019/02/27 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
金融行业务员的自我评价
2013/12/13 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
中国好声音华少广告词
2014/03/17 职场文书
村干部培训方案
2014/05/02 职场文书
科学发展观标语
2014/10/08 职场文书
交通事故协议书范文
2014/10/23 职场文书
金榜题名主持词
2015/07/02 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python