浅谈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 25 Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
python查询sqlite数据表的方法
May 08 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
对python实现合并两个排序链表的方法详解
Jan 23 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python爬虫设置ip代理过程解析
Jul 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中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php动态绑定变量的用法
2015/06/16 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
php strftime函数的详细用法
2018/06/21 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
文艺演出策划方案
2014/06/07 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
如何写好闭幕词
2019/04/02 职场文书