浅谈keras使用预训练模型vgg16分类,损失和准确度不变
作者:我的九八卡 发布时间:2021-05-25 18:23:40
标签:keras,vgg16,损失,准确度
问题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训练的准确率都不变。
探索
我一直以为是我的数据的读取方式不对,我一直在从这方面下手,但是后来我发现根本不是这个原因,也找到了解决方案,具体原因有三点,三点是递进关系。
1.数据集样本各类别数量差距大
如果没有这种情况就看看第二点。
2.训练集和数据集是手动划分的,改为代码自动划分
代码如下:
X_train, X_test,Y_train, Y_test = train_test_split(data, labels, test_size=0.4, random_state=42)```
上述方法要多设置几个epoch,要有耐心的等,如果还是测试的准确率还是不变,那就可能是第二个原因。
3. 训练模型不适用,或者模型参数不恰当,建议调参,或者改算法
如果第一个方法还是不行那就可能是算法不适合这个数据集,可以打印混淆矩阵看一下,是不是分类错误率太高,比如我的数据集,做二分类,结果第二类全分到第一类了。
来源:https://blog.csdn.net/qq_36490878/article/details/80906957
0
投稿
猜你喜欢
- python菜鸟,每天都要进步一点点。二维元组的例子:A = ((1, 1, 1), (1, 1, 1),(1, 1, 1),(0, 0,
- 在python中,循环有一个语句:for语句。简单的for循环例子>>> hello = "world"
- 据国外媒体报道,相较于IE8浏览器,微软最新一代浏览器IE9的最大改进就是硬件加速HTML5。微软承诺,通过利用IE9中的硬件加速功能,开发
- 演示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//
- 本文实例为大家分享了bootstrap响应式工具的具体代码,供大家参考,具体内容如下<!DOCTYPE html><htm
- 使用python完成超级基础的学生管理系统,供大家参考,具体内容如下说明:1、本学生管理系统非常非常简易,只有增,显,查,删,改功能,对于P
- 本文实例为大家分享了python对实例属性进行类型检查的具体代码,供大家参考,具体内容如下案例:在某项目中,我们实现了一些类,并希望能像静态
- 译文原文:http://blog.benhuoer.com/2009/04/10-simple-and-impressive-design-
- 初学python,写一个小程序练习一下。主要功能就是增删改查的一些功能。主要用到的技术:字典的使用,pickle的使用,io文件操作。代码如
- 今天介绍Python当中十大可视化工具,每一个都独具特色,惊艳一方。MatplotlibMatplotlib 是 Python 的一个绘图库
- 在 python 开发中我们最常用的IDE就是PyCharm,有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库,
- 一、上传表单的HTML代码 <form action="UpLoad.php" method="post
- 首先去官网下载两个架包链接如下:官网链接第一步:将两个架包解压到同一个database目录下。如截图所示:第二步:打开setup应用程序打开
- 在树莓派自带得python IDE Thonny中写如下代码,并在树莓派上插上usb摄像头import cv2cap=cv2.VideoCa
- 蒙特卡罗方法是一种统计模拟方法,由冯·诺依曼和乌拉姆提出,在大量的随机数下,根据概率估计结果,随机数据越多,获得的结果越精确。下面我们将用p
- 软删除简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。预
- 本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下1、解释一下 WSGI 和 FastCGI
- 网页开发人员常常希望能够了解并掌握多种语言,结果是,学习一门语言的所有内容是棘手的,但是却很容易发现你并没有完全利用那些比较特殊却很有用的标
- Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)
- 一、排序的基本概念和分类所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按