第五十四回 高太尉大兴三路兵 呼延灼摆布连环马-AI通过构建并训练CNN网络来进行飞机识别

呼延灼举荐了百胜将韩滔和天目将彭玘做先锋。

两军对战,韩滔和秦明斗二十回合,呼延灼与林冲斗在一起,花荣与彭玘斗在一处,后彭玘与一丈青扈三娘斗在一起,被扈三娘抓住。

尽管梁山占优,宋江也没有乘胜追击,因为呼延灼带的是连环马,马带马甲,人披铁铠,射箭都不顶用。打完后,宋江亲自给彭玘解绑,送到大寨。

第二天呼延灼又列出连环马冲杀,宋江被李逵护着逃到水边,被李俊、张横、张顺、三阮接到战船上才逃脱。小兵折损大半,幸好头领们都还在。山下的四间酒店也被官兵拆了。大家一点办法也没有,晁盖只好下令严防死守。宋江不肯上山,亲自坐镇鸭嘴滩。

宋江很多事还是亲历亲为的,怪不得大家都服他! 人工智能,也需要亲自实践一下才行!

AI通过构建并训练CNN网络来进行飞机识别

在星河社区2019年的培训课程中,有一节课程是通过构建并训练CNN网络来进行飞机识别。课程中有一项作业,是通过各种方法增加准确率。这门课程主要面向初学者,所以增加准确率的方法主要是调整神经网络的深度和channel值,方法很简单,但是确实非常有助于初学者对神经网络的理解。

项目地址:7天入门深度学习 d2 作业飞机识别 - 飞桨AI Studio星河社区

直接点击,然后fork执行即可。

网络结构如图:

因为需要飞桨1.6.2环境和相关数据集,所以下面的代码只能展示:

# 导入依赖包
import sys
import numpy as np

# import lr_utils
import matplotlib.pyplot as plt
import paddle
import paddle.fluid as fluid

%matplotlib inline

# 加载数据, 并展示一张,由于数据图片较小,所以显示出来比较模糊
train_set_x_orig=np.load("data/data1589/traindata.npy")
train_set_y=np.load("data/data1589/trainlabel.npy")
test_set_x_orig=np.load("data/data1589/testdata.npy")
test_set_y=np.load("data/data1589/testlabel.npy")
plt.imshow(train_set_x_orig[2])
plt.show()

# 输出数据集的信息
m_train=train_set_x_orig.shape[0]
m_test=test_set_x_orig.shape[0]
num_px=train_set_x_orig.shape[1]

print ("训练样本数: m_train = " + str(m_train))
print ("测试样本数: m_test = " + str(m_test))
print ("图片高度/宽度: num_px = " + str(num_px))
print ("图片大小: (" + str(num_px) + ", " + str(num_px) + ", 3)")
print ("train_set_x shape: " + str(train_set_x_orig.shape))
print ("train_set_y shape: " + str(train_set_y.shape))
print ("test_set_x shape: " + str(test_set_x_orig.shape))
print ("test_set_y shape: " + str(test_set_y.shape))

###因为paddlepaddle认识的数据是3*l*h的,所以需要进行数据格式转换
train_set_x = np.array(train_set_x_orig).reshape(m_train, 3, num_px, num_px).astype(np.float32)
train_set_y = np.array(train_set_y).reshape(m_train, 1).astype(np.float32)
test_set_x = np.array(test_set_x_orig).reshape(m_test, 3, num_px, num_px).astype(np.float32)
test_set_y = np.array(test_set_y).reshape(m_test, 1).astype(np.float32)

#归一化
train_set_x=train_set_x/ 255.0 * 2.0 - 1.0

test_set_x=test_set_x/ 255.0 * 2.0 - 1.0

# 读取训练数据或测试数据
def read_data(train_set_x,train_set_y,buffer_size):
 
    def reader():
     
        for i in range(buffer_size):            
            yield train_set_x[i,:], int(train_set_y[i])            
    return reader

def convolutional_neural_network():
    """
    定义卷积神经网络分类器:
        输入的二维图像,经过两个卷积-池化层,使用以softmax为激活函数的全连接层作为输出层
    Args:
        img -- 输入的原始图像数据
    Return:
        predict -- 分类的结果
    """
    img = fluid.layers.data(
        name='img', shape =[3,32,32],dtype = 'float32')
    #多加了一个卷积池化层,最后加了drop,以提高准确率,降低过拟合
#    droped = fluid.layers.dropout(img,dropout_prob=1)
    #第一个卷积层
    
#     hidden = fluid.nets.simple_img_conv_pool(input, num_filters, filter_size, pool_size, pool_stride, pool_padding=0)
    hidden=fluid.nets.simple_img_conv_pool(
    input=img,
        num_filters=250,
        filter_size=9,
        pool_size=1,
        pool_stride=1,
        pool_padding=0
    )
    #(50 10 5 1 0)
    #第二个卷积层
#    drop1 = fluid.layers.dropout(hidden,dropout_prob=0.2)
    
    h2=fluid.nets.simple_img_conv_pool(
    input=hidden,
        num_filters=150,
        filter_size=5,
        pool_size=1,
        pool_stride=1,
        pool_padding=0
    )
    h3=fluid.nets.simple_img_conv_pool(
    input=h2,
        num_filters=150,
        filter_size=3,
        pool_size=2,
        pool_stride=1,
        pool_padding=0
    )
    
    
#(50 3 2 1 0)
    drop1 = fluid.layers.dropout(h3,dropout_prob=0.3)

#     predict = fluid.layers.fc(h2,size=1,act='sigmoid')
    predict = fluid.layers.fc(drop1,size=2,act='softmax') #softmax

    return predict 

#配置网络结构
def train_func():
    
    label = fluid.layers.data(name='label', shape = [1],dtype = 'int64')
    predict = convolutional_neural_network()

    # 损失函数,cross_entropy 函数内部使用交叉熵损失函数
    cost = fluid.layers.cross_entropy(input=predict, label=label)
    avg_cost = fluid.layers.mean(cost)
    return avg_cost

def optimizer_func():
    # 创建Momentum优化器,并设置学习率(learning_rate)、动量(momentum)
    optimizer=fluid.optimizer.Momentum(learning_rate=0.0001,momentum=0.5)
    #optimizer=fluid.optimizer.Adam(learning_rate=0.001,momentum=0.5)
    return optimizer

feed_order = ['img', 'label']     #数据格式
params_dirname = "./DNN_model"    #模型保存路径

# 事件处理函数
from paddle.utils.plot import Ploter
from  paddle.fluid.contrib.trainer import EndStepEvent
train_title = "Train cost"
test_title = "Test cost"
plot_cost = Ploter(train_title, test_title)

step = 0
def event_handler_plot(event):
    global step
    if isinstance(event, EndStepEvent):
        if event.step % 2 == 0: # 若干个batch,记录cost
            if event.metrics[0] < 10:
                plot_cost.append(train_title, step, event.metrics[0])
                plot_cost.plot()
        if event.step % 20 == 0: # 若干个batch,记录cost
            test_metrics = trainer.test(
            reader=test_reader, feed_order=feed_order)
            if test_metrics[0] < 10:
                plot_cost.append(test_title, step, test_metrics[0])
                plot_cost.plot()

#             if test_metrics[0] < 1.0:
#                 # 如果准确率达到阈值,则停止训练
#                 print('loss is less than 10.0, stop')
#                 trainer.stop()
            if test_metrics[0] < 0.001:
                 # 如果准确率达到阈值,则停止训练
                print('loss is less than 10.0, stop')
                trainer.stop()

        # 将参数存储,用于预测使用
        if params_dirname is not None:
            trainer.save_params(params_dirname )
    step += 1

#训练所用到的具体数据
#主要是增加了训练量,从209提高到5800

BATCH_SIZE=128
# 设置训练reader
train_reader = paddle.batch(
    paddle.reader.shuffle(
        read_data(train_set_x,train_set_y,buffer_size=5880), #buff原来是209
        buf_size=50),#buf原来是50
    batch_size=BATCH_SIZE)
# 设置测试reader
test_reader = paddle.batch(
    paddle.reader.shuffle(
        read_data(test_set_x,test_set_y,buffer_size=2000), 
        buf_size=20),#buf原来是20
    batch_size=BATCH_SIZE)

#创建训练器
from  paddle.fluid.contrib.trainer import Trainer
trainer= Trainer(
    train_func= train_func,
    place= place,
    optimizer_func= optimizer_func )

#开始训练
trainer.train(
    reader=train_reader,
    num_epochs=60 ,#num 30
    event_handler=event_handler_plot,
    feed_order= feed_order )

from  paddle.fluid.contrib.inferencer import Inferencer
inferencer = Inferencer(
    infer_func=convolutional_neural_network, param_path=params_dirname, place=place)

#取出一个 mini-batch
for mini_batch in test_reader(): 
    # 转化为 numpy 的 ndarray 结构,并且设置数据类型
    test_x = np.array([data[0] for data in mini_batch]).astype("float32")
    test_y = np.array([data[1] for data in mini_batch]).astype("int64")
    # 真实进行预测
    mini_batch_result = inferencer.infer({'img': test_x})
    
    result=(mini_batch_result[0][:,-1]>0.5)+0   #True or False 转0/1,直接后面+0即可
    
    
    # 打印预测结果
#     mini_batch_result = np.argsort(mini_batch_result) #找出可能性最大的列标,升序排列,
    
   
    ###经过分析,这是多分类问题会用到的函数,找出概率值最大的下标
    
    
#     mini_batch_result = mini_batch_result[0][:, -1]  #把这些列标拿出来

    print('预测结果:%s'%result)
    
    # 打印真实结果    
    label = np.array(test_y) # 转化为 label
    print('真实结果:%s'%label)
    break 


# 查看百分比
def right_ratio(right_counter, total):
    ratio = float(right_counter)/total
    return ratio

# 评估函数 data_set 是一个reader
def evl(data_set):
    total = 0    #操作的元素的总数
    right_counter = 0  #正确的元素

    pass_num = 0
#     print(liruoyi)
    for mini_batch in data_set():
        pass_num += 1
        #预测
        test_x = np.array([data[0] for data in mini_batch]).astype("float32")
        test_y = np.array([data[1] for data in mini_batch]).astype("int64")
        mini_batch_result = inferencer.infer({'img': test_x})
        
        mini_batch_result=(mini_batch_result[0][:,-1]>0.5)+0   #True or False 转0/1,直接后面+0即可
        
        #预测的结果
       # mini_batch_result = np.argsort(mini_batch_result) #找出可能性最大的列标,升序排列
       # mini_batch_result = mini_batch_result[0][:, -1]+0  #把这些列标拿出来

         #print('预测结果:%s'%result)

        label = np.array(test_y) # 转化为 label
         # print('真实结果:%s'%label)

        #计数
        label_len = len(label)
        total += label_len
        for i in range(label_len):
            if mini_batch_result[i] == label[i]:
                right_counter += 1

    ratio = right_ratio(right_counter, total)
    return ratio


ratio = evl(train_reader)
print('训练数据的正确率 %0.2f%%'%(ratio*100))

ratio = evl(test_reader)
print('预测数据的正确率 %0.2f%%'%(ratio*100))


提高准确率的方法就是改变卷积的大小和深度。比如原来的卷积大小是10和5 ,深度是两层,最终试出来的卷积大小是9、5和3,深度是三层。这也是为什么有人问某某模型为什么参数是xxx,我会回答“作者试出来”的原因,因为理论只是指导,最终大多数模型的参数都是通过实践试出来的,哪个最好,论文里就写哪个。

大家也可以去修改试试。当然卷积网络还需要注意最终全连接层的参数对应,这个在实践中特别容易出问题,多练练就好了。

呼延灼从东京汴梁请来了轰天雷凌振。凌振的炮威力很大,晁盖派了水路六个头领去捉拿凌振,把他也请上了山。

大家商量破连环马的计策,金钱豹子汤隆说我有一个计策。需要一个兵器和我的一个哥哥,可以破连环马。

欲知后事如何,且听下回分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443878.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

❤ Vue3项目搭建系统篇(二)

❤ Vue3项目搭建系统篇&#xff08;二&#xff09; 1、安装和配置 Element Plus&#xff08;完整导入&#xff09; yarn add element-plus --savemain.ts中引入&#xff1a; // 引入组件 import ElementPlus from element-plus import element-plus/dist/index.css const ap…

B端系统升级,登录页必在升级之列,不容置疑。

进行B端界面升级时&#xff0c;首先升级登录页有以下几个原因&#xff1a; 用户体验&#xff1a;登录页是用户进入系统的第一个页面&#xff0c;用户首先接触到的界面。通过升级登录页&#xff0c;可以提升用户的第一印象&#xff0c;增强用户对系统的信任感和好感度&#xff…

基于Unity3D引擎RPG游戏设计与开发

目 录 摘 要 I Abstract II 引 言 1 1.相关技术 3 1.1 Unity基础界面 3 1.2 C#脚本编写 3 1.3 Unity脚本 3 1.4 Unity物理引擎 3 1.5 UGUI 3 1.6 Unity动画系统 4 1.7 本章小结 4 2. 系统分析 5 2.1游戏内容需求分析 5 2.2游戏流程需求分析 5 2.3游戏场景需求分析 5 2.4怪物系…

GPT-4-turbo还是大家心中第一!Claude 3竞技场人类投票成绩出炉:仅居第三

Claude 3的竞技场排名终于揭晓了&#xff1a; 在仅仅3天的时间里&#xff0c;20000张投票使得排名的流量达到了前所未有的高度。 最后&#xff0c;Claude 3的"大杯"模型Opus以1233的分数赢得了胜利&#xff0c;成为了第一个能和GPT-4-Turbo匹敌的选手。 "中杯…

基于范围的for循环(C++11)和auto

auto C11中&#xff0c;标准委员会赋予了auto全新的含义即&#xff1a; auto不再是一个存储类型指示符&#xff0c;而是作为一个新的类型 指示符来指示编译器&#xff0c;auto声明的变量必须由编译器在编译时期推导而得。 int a 10;auto b a;auto c a;auto d TestAuto(…

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 导入element-plus图标 命令行安装unplugin-icons pnpm i -D unplugin-icons//没有安装自…

银河麒麟V10 安装部署大数据管理软件 DataSophon

一、概览 1、愿景 致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 2、DataSophon是什么 《三体》&#xff0c;这部获世界科幻文学最高奖项雨果奖的作品以惊艳的"硬科幻"…

Joe主题网站

一款博客网站源码 发现源码为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff0c;…

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化&#xff0c;一个小小故事分享给大家&#xff0c;仅个人观点 二、故事前半段背景内容 …

C#中对象的相等性与同一性的判断方法总结

C#对象的相等性与同一性 1. 概述与准备1.1 概述1.2 准备 2. Equals(Object)2.1 功能&#xff1a;2.2 实例&#xff1a;2.3 扩展&#xff1a;2.4 重写此方法 3. Equals(Object, Object)3.1 功能3.2 实例 4. ReferenceEquals(Object, Object)4.1 功能4.2 使用场景&#xff1a;4.3…

突破编程_前端_JS编程实例(自适应表格列宽)

1 开发目标 针对如下的表格组件&#xff1a; 根据表格的各个列字符串宽度动态调整表格列宽&#xff1a; 2 详细需求 本组件目标是提供一个自动调整 HTML 表格列宽的解决方案&#xff0c;通过 JS 实现动态计算并调整表格每列的宽度&#xff0c;以使得表格能够自适应容器宽度&a…

Matlab|配电网智能软开关(sop)规划模型

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 3.1 sop选址定容优化模型 3.2 对比算例&#xff08;不含sop&#xff09; 4 下载链接 1 主要内容 该程序参考文献《基于改进灵敏度分析的有源配电网智能软开关优化配置》&#xff0c;采用二阶锥算法&#xff0c;以改进的…

vscode 格式化prettier失败出现一大堆错误

如题&#xff0c;使用vscode开发项目时候&#xff0c;会自动进行格式化【安装prettier插件】 但是有时候会出现格式化失败的情况&#xff0c;如果插件安装正确&#xff0c;则可能是代码出现了格式问题。

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章&#xff1a; WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么&#xff1f;为什么用它建站&#xff1f;怎么安装与部署&#xff1f; 初次安装WordPress后如何进行网站设置&#xff08;主题安装、…

揭秘接口测试:完整流程指南!

在讲接口测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更好的…

Python快速入门系列-2(Python基础语法)

第三章&#xff1a;Python基础语法 3.1 变量与数据类型3.1.1 变量的定义与赋值3.1.2 数据类型3.1.3 类型转换 3.2 注释与缩进3.2.1 注释3.2.2 缩进 3.3 条件语句与循环结构3.3.1 条件语句3.3.2 循环结构 3.4 函数与模块3.4.1 函数3.4.2 参数和返回值3.4.3 模块3.4.4 标准库中的…

基于SSH的点餐服务管理系统的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 开发工具相关技术 3 1.1 SSH框架 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 Hibernate 4 1.2 前端技术 4 1.2.1 jQuery 5 1.2.2 Bootstrap 5 1.3 数据库技术 5 1.4 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统工作流程 8 2.3 用例…

一学就会 | ChatGPT提示词极简指南-有爱AI实战教程(三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

【Claude 3】一文谈谈Anthropic(Claude) 亚马逊云科技(Bedrock)的因缘际会

文章目录 前言1. Anthropic的诞生2. Anthropic的“代表作”——Claude 3的“三驾马车”3. 亚马逊云科技介绍4. 强大的全托管服务平台——Amazon Bedrock5. 亚马逊云科技(AWS)和Anthropic的联系6. Claude 3模型与Bedrock托管平台的关系7. Clude 3限时体验入口分享【⚠️截止3月1…

【Flink】Apache Flink 常见问题定位指南

Apache Flink 常见问题定位指南 1.问题分析概览1.1 如何分析 Flink 问题 2.常见问题处理2.1 作业自动停止2.2 输出量稳定但不及预期2.3 输出量逐步减少或完全无输出2.4 个别数据缺失2.5 作业频繁重启 3.问题追因技巧3.1 常用工具3.1.1 内存3.1.2 CPU3.1.3 磁盘 I/O3.1.4 网络 I…