Keras:融合不同的模型并使用自己的数据进行fine-tuning及预测(二)

原创 2018年04月17日 18:33:16

上篇文章我们已经训练且得到了可以用于分类的模型:

那么接下来如何预测呢?

其实,大体上预测和训练和差不多的,因此你可以对照训练的时候来写预测程序!核心思想:在训练的时候用了几个模型来融合,测试的时候就用几个;并且模型融合的顺序是不能变的!


一.提取特征

a.修改保存特征代码

对测试图片也是需要提取特征的,但是这个时候是没有label标签的,标签就是需要我们预测的,因此保存为H5时,应修改代码为:

    test = model.predict_generator(test_generator, test_generator.samples//test_generator.batch_size)
    with h5py.File("newmaptest_%s.h5" % MODEL.__name__) as h:
        h.create_dataset("test", data=test)


b.修改图片生成器ImageDataGenerator

由于此时已经不要ImageDataGenerator来进行数据增强,而仅仅只是用来传递文件而已!所以,应修改为:
    gen = ImageDataGenerator()

    test_generator = gen.flow_from_directory(testdir, image_size, shuffle=False,
                                             batch_size=batch_size, class_mode=None)


c.将以上步骤写成函数复用

def get_feature(MODEL, image_size, lambda_func=None):
    width = image_size[0]
    height = image_size[1]
    input_tensor = Input((height, width, 3))
    x = input_tensor
    if lambda_func:
        x = Lambda(lambda_func)(x)
    base_model = MODEL(input_tensor=x, weights='imagenet', include_top=False)
    model = Model(base_model.input, GlobalAveragePooling2D()(base_model.output))

    gen = ImageDataGenerator()

    test_generator = gen.flow_from_directory(testdir, image_size, shuffle=False,
                                             batch_size=batch_size, class_mode=None)

    test = model.predict_generator(test_generator, test_generator.samples//test_generator.batch_size)
    with h5py.File("newmaptest_%s.h5" % MODEL.__name__) as h:
        h.create_dataset("test", data=test)


d.得到测试图片的特征

用训练模型时候的4个预训练模型来提取特征:
  • ResNet50
  • VGG19
  • InceptionResNetV2
  • Xception
print("正在提取第1个特征")  
get_feature(ResNet50, (224, 224))  
print("特征1已就绪")  
# # #  
print("正在提取第2个特征")  
get_feature(Xception, (299, 299), xception.preprocess_input)  
print("特征3已就绪")  
#  
print("正在提取第3个特征")  
get_feature(InceptionResNetV2, (299, 299), inception_resnet_v2.preprocess_input)  
print("特征4已就绪")  
  
print("正在提取第4个特征")  
get_feature(VGG19, (224, 224))  
print("特征5已就绪")
具体文件名为:

  • newmaptest_InceptionResNetV2.h5
  • newmaptest_VGG19.h5
  • newmaptest_ResNet50.h5
  • newmaptest_Xception.h5

二.载入特征文件以及模型


a.载入特征文件

np.random.seed(1993)

X_test = []

for filename in ["newmaptest_InceptionResNetV2.h5", "newmaptest_VGG19.h5", "newmaptest_ResNet50.h5", "newmaptest_Xception.h5"]:
    with h5py.File(filename, 'r') as h:
        X_test.append(np.array(h['test']))

X_test = np.concatenate(X_test, axis=1)


b.加载模型

model = load_model('my_model.h5')
y_pred = model.predict(X_test, verbose=1)


gen = ImageDataGenerator()
test_generator = gen.flow_from_directory(testdir, (224, 224), shuffle=False,
                                         batch_size=batch_size, class_mode=None)

三.进行预测


a.创建不同类别的文件夹,用以存放分类结果

在这里,我们只需要创建‘dogs’和‘cats’两个文件夹即可:

if os.path.exists(targetDir):
    input("文件夹已存在,请重新创建新文件夹!\n键入任意键以关闭")
    raise ValueError("正在关闭")
else:
    os.mkdir(targetDir)#创建地图文件夹

if os.path.exists(nottargetDir):
    input("文件夹已存在,请重新创建新文件夹!\n键入任意键以关闭")
    raise ValueError("正在关闭")
else:
    os.mkdir(nottargetDir)#创建非地图文件夹


b.得到预测的概率,并且设定分类阈值

对每一个不同的图片,都会由上面得到的模型输出一个0-1的概率值,既然只有两类图片,我们就只需要设定阈值threshold=0.5即可;

y_pred = model.predict(X_test, verbose=1)


c.将概率值P>0.5和P<0.5的两类分别移动到a中所创建的文件夹中

for i, fname in enumerate(test_generator.filenames):
    print(i, fname)
    filename.append(fname)
    prediction.append(float(y_pred[i]))

    if y_pred[i] >= 0.5:#训练模型中的第二类
        sourceDir = os.path.join(testdir,  fname)
        shutil.copy(sourceDir, nottargetDir)
    elif y_pred[i] < 0.5:#训练模型中的第一类
        sourceDir = os.path.join(testdir,  fname)
        shutil.copy(sourceDir, targetDir)


d.将每一个图片预测的概率值保存为一个Excel:

cc = {'filename': filename, 'prediction': prediction}
aa = pd.DataFrame(cc)
aa.to_excel(exceldir)

keras中如何保存model的数据,以及如何重构模型进行数据预测

keras中首先是训练神经网络模型,在训练好一个不错神经网络模型之后如何对数据进行预测呢? 这里就需要先保存训练好的神经网络模型的结构与参数。接下来的代码展示了如何保存model的结构与训练好的参数,...
  • JohinieLi
  • JohinieLi
  • 2017-04-05 22:47:12
  • 7739

Tensorflow 使用slim框架下的分类模型进行分类

Tensorflow的slim框架可以写出像keras一样简单的代码来实现网络结构(虽然现在keras也已经集成在tf.contrib中了),而且models/slim提供了类似之前说过的object...
  • cugxyy6
  • cugxyy6
  • 2017-10-27 20:44:44
  • 408

【Keras】使用Keras建立模型并训练等一系列操作

由于Keras是一种建立在已有深度学习框架上的二次框架,其使用起来非常方便,其后端实现有两种方法,theano和tensorflow。由于自己平时用tensorflow,所以选择后端用tensorfl...
  • liuxiao214
  • liuxiao214
  • 2018-01-10 20:48:09
  • 583

keras 模型用于预测时的注意事项

为什么训练误差比测试误差高很多? 一个Keras的模型有两个模式:训练模式和测试模式。一些正则机制,如Dropout,L1/L2正则项在测试模式下将不被启用。 另外,训练误差是训练数据每个batch的...
  • xiaojiajia007
  • xiaojiajia007
  • 2017-06-27 10:39:03
  • 2459

模型融合与集成

介绍 堆叠(也称为元组合)是用于组合来自多个预测模型的信息以生成新模型的模型组合技术。通常,堆叠模型(也称为二级模型)因为它的平滑性和突出每个基本模型在其中执行得最好的能力,并且抹黑其执行不佳的每个...
  • guohao_zhang
  • guohao_zhang
  • 2018-01-06 16:40:12
  • 150

Keras中实现模型加载与测试(以mnist为例)

 需要安装cv2 http://blog.csdn.net/gjq246/article/details/71554157 安装h5py的命令如下(模型加载模块): sudo pi...
  • gjq246
  • gjq246
  • 2017-05-13 11:17:53
  • 2506

使用Keras由零开始快速构造自己的深度学习模型

《SDCC 2017人工智能技术实战》什么是kerasKeras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快...
  • xundh
  • xundh
  • 2017-10-28 11:41:19
  • 723

Keras中利用训练好的vgg16预测图片类型

代码:from keras.applications.vgg16 import VGG16 from keras.preprocessing import image from keras.appli...
  • qq_25964837
  • qq_25964837
  • 2018-01-12 10:40:17
  • 120

Keras:融合不同的模型并使用自己的数据进行fine-tuning及预测(一)

一.系统环境及工具:    在使用之前深度学习对图片进行分类时,你首先需要检查一下你的软件环境是否满足!该教程为基于:Python3,Keras,TensorFlow,在文章末尾我给出了完整的代码,但...
  • qq_15969343
  • qq_15969343
  • 2018-04-17 15:11:59
  • 79

fine-tuning:利用已有模型训练其他数据集

通过对ImageNet上训练出来的模型(如CaffeNet,VGGNet,ResNet)进行微调,然后应用到我们自己的数据集上...
  • yj3254
  • yj3254
  • 2016-09-29 19:04:31
  • 5922
收藏助手
不良信息举报
您举报文章:Keras:融合不同的模型并使用自己的数据进行fine-tuning及预测(二)
举报原因:
原因补充:

(最多只允许输入30个字)