【第19天】训练模型-验证与比较训练成果

摘要

  1. Test资料集验证

    1.1 单张图档预测

    1.2 多张图档预测

  2. 五个模型的准确度对照表

  3. 心得


内容

  1. Test资料集验证

    1.1 单张图档预测

    • 程序码
    from tensorflow.keras.preprocessing import image
    from keras.models import load_model
    from keras import backend as K
    import numpy as np
    import os
    
    # 关闭GPU加速功能(建议安装无GPU版本,缩短初始化时间)
    os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
    
    # 开启800字典
    words_path = './800_words.txt'
    file1 = open(words_path, 'rt', encoding='Big5')
    labels = list(file1.read())
    file1.close()
    
    # 载入模型
    model = load_model('./model/xception_v2/Xception_retrained_v2.h5')
    
    # 读取照片
    img_path = './data/test/丁/丁_0.jpg'
    try:
        img = image.load_img(img_path, target_size=(80, 80))
    except Exception as e:
        print(img_path, e)
    
    # 图档预处理
    img = image.img_to_array(img) # 灰阶
    img = np.expand_dims(img, axis=0) # 转换通道
    img = img/255 # rescale
    
    # 计算机率与预测结果
    pred = model.predict(img)[0]
    print(pred) # 机率list
    index = np.argmax(pred)
    prediction = labels[index]
    print(prediction) # 预测结果
    
    • 输出:印出800字的机率,并取机率最大的中文字,作为辨识结果。
      • 图档

      • 结果

    1.2 多张图档预测:以flow_from_directory抽取每个epoch的预测样本,再逐次载入记忆体进行预测。

    • 程序码
    from keras.preprocessing.image import ImageDataGenerator
    from keras.models import load_model
    from keras import backend as K
    
    # 关闭GPU加速功能
    # os.environ["CUDA_VISIBLE_DEVICES"]="-1"
    
    # 载入模型
    K.clear_session()
    model = load_model('./model/densenet201_v2/10011/Densenet201_checkpoint_v2.h5')
    
    # 设定参数
    test_dir = './data/test'
    batch_size = 64
    target_size = (80, 80)
    
    # 图档前处理
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    #从Test资料集抽取每批验证图档
    test_generator = test_datagen.flow_from_directory(test_dir,
                                       target_size=target_size,
                                       batch_size=batch_size, shuffle=False)
    
    # 验证test准确率
    test_generator.reset()
    test_loss, test_acc = model.evaluate_generator(test_generator,    steps=test_generator.samples//batch_size, verbose=1)
    print('test acc:', test_acc)
    print('test loss:', test_loss)
    
    • 输出:
      • Train Accuracy/Loss与Test Accuracy/Loss。
      • Train资料集:预测174,808张图档;Test资料集:预测38277张图档
  2. 五个模型的准确率对照表

  3. 总结:

    3.1 以前只是单纯载入预训练模型,随机调整参数,训练後挑选出效果不错的模型。这是第一次看论文,耗费大量时间精力,刚开始研读的前几天,真的挺痛苦的,进度也因此延误。但了解模型的核心理念与架构後,有渐入佳境的感觉,获益良多。

    3.2 由於IceptionV4最新版的预训练模型,在Keras中有权重不匹配的问题,目前采用不载入权重的重新训练,需要耗费更多时间。从对照图得知,IceptionV4从头训练效果不好,故後续先不考虑此模型。

    3.3 此外,前五天的模型架构与原理的分享,如果内文叙述有误,欢迎大家提出意见,谢谢。


小结

  1. 下一步,我们想利用加权的方式组合多个模型,找出各模型权重後,计算出800个中文字的加权机率,再以机率最高的中文字作为模型预测结果。
  2. 我们以R语言撰写,进行模型加权权重计算。在此之前,需要先取得各个模型输出之800字机率表。故下一章,目标是:「和大家介绍模型权重计算的前置作业」。

让我们继续看下去...


参考资料


<<:  找LeetCode上简单的题目来撑过30天啦(DAY19)

>>:  Day 19 - 建立 canvas QRCode

D19-(9/19)-巨大(9921)-不只是台湾单车龙头,也是世界龙头

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

[Day 4] 使用 Gradle Multi-Project Builds X Shadow Plugin X Docker Compose 建置、打包、部署

以往 Gradle 只能使用 Groovy 语言撰写 Script,因为我对 Groovy 不熟,所...

Microsoft Azure Pass 学习日志 Day 5

Chap.VI Management + Governance 管理方法 Advisor 概观 这边...

【LeetCode】当初的 LeetCode 学习

有点受不了没什麽演算法底子还要掰出 Leetcode 文章QQ 今天来记录当初学习的过程和後来的想法...

Day 13 Component Lifecycle -2

第 13 天啦~~~ 昨天我们谈到 lifecycle, 那我们今天来稍微介绍一下,在生命周期每个阶...