浅谈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的另外几种语言实现
Jan 29 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
python3 读写文件换行符的方法
Apr 09 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
python的slice notation的特殊用法详解
Dec 27 Python
python ubplot使用方法解析
Jan 10 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python 调用C++封装的进一步探索交流
Mar 04 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
Python读写yaml文件
Mar 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 file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python config文件的读写操作示例
2019/09/27 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
如何查看python关键字
2021/01/17 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
学校安全生产承诺书
2014/05/23 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
讲党性心得体会
2014/09/03 职场文书
贫困生证明范文
2015/06/16 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
利用Python实现Picgo图床工具
2021/11/23 Python
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby