浅谈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学习笔记_数据排序方法
May 22 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
python如何通过protobuf实现rpc
Mar 06 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 Python
Python turtle库的画笔控制说明
Jun 28 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
关于Kotlin中SAM转换的那些事
Sep 15 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP数组实例总结与说明
2011/08/23 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
学习Node.js模块机制
2016/10/17 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
python线程join方法原理解析
2020/02/11 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
keras的三种模型实现与区别说明
2020/07/03 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
后勤人员岗位职责
2013/12/17 职场文书
个人求职信范文分享
2014/01/06 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
运动会开幕词
2015/01/28 职场文书
朋友聚会开场白
2015/06/01 职场文书
学风建设主题班会
2015/08/17 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技