cnn突破四(生成卷积核与固定核对比)

cnn突破三中生成四个卷积核,训练6万次,91分,再训练6万次,95分,不是很满意,但又找不到问题点,所以就想了个办法,使用三个固定核,加上三层bpnet神经网络,看看效果,还别说,固定核效果不错,训练6万次,逼近96分,而且不到十秒就训练完成了,而机器自动生成卷积核要40多秒!以下是代码,做个记录,为什么图像处理中常用的卷积核效果好?

14:24 2024/9/25
已经打包,已经改成100,变化不大
然后想到,用那三个卷积核,加上三层网络,
结果太开心,稳定在96三次,时而突破97,学习6万次一共四次
如果重复学习,已经有参数,不低于97
28*28gaos后降采样成14*14,使用三个卷积核并行,变成3@12*12,
降采样到3@6*6,108全连接80-10,结束
先打包一个,太激动le,95就这样突破了

这是当天的日记。代码如下:

先看forward函数:

forward第一步;使用soblex,sobely,以及lapulas三个核,14*14-》3@12*12

  int w = 14;
            int ww = w;
            int h = 14;
            int hh = h;
            double[] A1 = new double[12 * 12]; double[] A2 = new double[12 * 12]; double[] A3 = new double[12 * 12];
            int k = 0;
            for (int j = 1; j < (h - 1); j++)
            {
                for (int i = 1; i < (w - 1); i++)
                {
                    int n0 = (j * w + i);
                 
                    double Grady = xI[n0 - 1 - ww] + 2 * xI[n0 - ww] + xI[n0 - ww + 1]
                        - xI[n0 + ww - 1] - 2 * xI[n0 + ww] - xI[n0 + ww + 1];


                    A1[k] = Grady;

                    double Gradx = xI[n0 - ww + 1] + 2 * xI[n0 + 1] + xI[n0 + ww + 1]
                         - xI[n0 - ww - 1] - 2 * xI[n0 - 1] - xI[n0 + ww - 1];

                 
                    A2[k] = Gradx;


                    double lapulas = xI[n0 + 1] + xI[n0 - 1] - 2 * xI[n0] + xI[n0 + w] + xI[n0 - w] - 2 * xI[n0];//拉普拉斯=+

                   
                    A3[k] = lapulas;

                    k++;
                }
            }

forward第二步:池化取最大,变成6*6@3

  //第二步,降级采样
           // List<double>
                hebing固定 = new List<double>();//一共36*3
            for (int i = 0; i < 6; i++)
                for (int j = 0; j < 6; j++)//
                {
                    int l = (i) * 6 + j;
                    double tempb = 0;
                   
                    for (int m = 0; m < 2; m++)
                        for (int n = 0; n < 2; n++)
                        {
                            int kk = (i * 2 + m) * 12 + j * 2 + n;

                            if (A1[kk] > tempb)
                            {
                                tempb = A1[kk];
                             

                            }
                        }
                    hebing固定.Add(tempb);
                   // hIcnn[l] = tempb;//25个数据,通过这个关系,就能找到14*14matrix中去。202409181038
                }
            for (int i = 0; i < 6; i++)
                for (int j = 0; j < 6; j++)//
                {
                    int l = (i) * 6 + j;
                    double tempb = 0;

                    for (int m = 0; m < 2; m++)
                        for (int n = 0; n < 2; n++)
                        {
                            int kk = (i * 2 + m) * 12 + j * 2 + n;

                            if (A2[kk] > tempb)
                            {
                                tempb = A2[kk];


                            }
                        }
                    hebing固定.Add(tempb);
                    // hIcnn[l] = tempb;//25个数据,通过这个关系,就能找到14*14matrix中去。202409181038
                }
            for (int i = 0; i < 6; i++)
                for (int j = 0; j < 6; j++)//
                {
                    int l = (i) * 6 + j;
                    double tempb = 0;

                    for (int m = 0; m < 2; m++)
                        for (int n = 0; n < 2; n++)
                        {
                            int kk = (i * 2 + m) * 12 + j * 2 + n;

                            if (A3[kk] > tempb)
                            {
                                tempb = A3[kk];


                            }
                        }
                    hebing固定.Add(tempb);
                    // hIcnn[l] = tempb;//25个数据,通过这个关系,就能找到14*14matrix中去。202409181038
                }

forward第三步:合并3@6*6=108,归一化后全连接

  //先观察数据,并归一化hebing固定
       
            double linshimax=0;
            for (int i = 0; i < hebing固定.Count;i++ )
            {
             
                if (hebing固定[i] > linshimax) linshimax = hebing固定[i];
            }
            hebing固定归一化=new double[108];
            for (int i = 0; i < hebing固定.Count; i++)
            {
                hebing固定归一化[i]=hebing固定[i] / linshimax;
            }
          
            hI固定 = new double[80];
            //通过w1计算输入层-隐藏层输入节点 
            for (int i = 0; i < 36 * 3; i++)//108
                for (int j = 0; j < 80; j++)//80

                    hI固定[j] += hebing固定归一化[i] * w1固定[i, j];

            //通过激活函数对隐藏层进行计算 
            for (int i = 0; i < 80; i++)
                hO固定[i] = sigmoid(hI固定[i] + bh固定[i]);
         
            yi固定 = new double[10];
            //通过w2计算隐藏层-输出层
            for (int i = 0; i < 80; i++)
                for (int j = 0; j < 10; j++)

                    yi固定[j] += hO固定[i] * w2固定[i, j];

            //通过激活函数求yo
            for (int i = 0; i < 10; i++)
                yO固定[i] = sigmoid(yi固定[i] + by固定[i]);

以上就完成了forward函数,下面再看:backward函数:

   void backcnn固定()
        {
            //对w2进行更新 
          double []deltax=new double[10];

            for (int j = 0; j < 10; j++)//10
            {
                deltax[j] = (yO固定[j] - d[j]) * dsigmoid(yO固定[j]);
                by固定[j] -= deltax[j] * learnRate;
                for (int i = 0; i < 80; i++)//
                {

            
                    w2固定[i, j] -= deltax[j] * learnRate * hO固定[i];
                    
                }
            }

            //对反向传播进行预处理 

            double[] W2 = new double[80];//
       
            for (int j = 0; j < 80; j++)
                for (int k = 0; k < 10; k++)
                    W2[j] += deltax[k] * w2固定[j, k];

            //对w1进行更新

            for (int j = 0; j < 80; j++)
            {
                double delta = dsigmoid(hO固定[j]) * W2[j];
                bh固定[j] -= delta * learnRate;
                for (int i = 0; i < 108; i++)//
                {

                    w1固定[i, j] -= delta * learnRate * hebing固定归一化[i];
                   
                }
            }
           
        }

这就完了,看看运行效果:

然后再看那个自己生成四个卷积核的cnn,对比有什么感想:

14:31 2024/9/25
另外,降采样中取最大的提示,是否高斯后也如此操作,而不是各行各列降采样?
15:37 2024/9/25
已经尝试,效果不好

这是第一个直觉上的想法,并验证,不行,第二个直觉上的想法:

我们5*5的卷积核,都不是像图像处理中的卷积核,我们自己生成的卷积核都是针对第一像素的处理,而图像处理中的卷积核,都是针对中心像素卷积的,以为这个中心对齐有效果,求证后,没有质的提升!

找不出来为什么得分在91-95之间,我就认为,自己的程序当下没有问题!

在这个自生成卷积核cnn上,我想是不是层数太少导致的,所以,我扩展了结构:

28*28-》4@24*24-》4@12*12-》16@8*8-》16@4*4-》80-》10,使用了4个5*5卷积核,以及16个5*5卷积核,让网络自己生成,期间我只是吧步长learnrate由0.2降为0.07,

这个结构程序达成的得分仍然在91-95之间,仍然不如固定核一次就能训练到96分

虽然有点沮丧,但是,我发现,我的这个cnn架构,已经和lecun的lenet-1相当,

这才是最大的成功,别人花了那么多年的成果,就这样被我突破了!

其实,想一想,还有好几个法宝都没用上,以后有机会在推进一下!

然后,我把这个固定核bpnet移植到自己的机器视觉megauning中试了试,发现速度跟不上,

然后就放弃了!

说实话,这个不如我在形状匹配中引入角点的效果,虽然时间长了一点点,但时间在500ms内能搞定,而且得分由原来的37分的确定界限,翻一番都不止!

这个固定核bpnet改成匹配,时间接近2秒,而且用识别分类的方法来找(匹配)准确位置,效果不值一提!

但可以肯定的是,cnn是可以用来定位的,但很明显人工智能的cnn显然与机器视觉在应用场景上极大的不同!

这更增强了我对机器视觉的信心!ai在场景的落地上还需要时间,我觉得用人工智能判断疾病应该有极大的空间!

哎,又好长时间没有看中医了,ai应该和中医能很好的结合!这上面我是有信心的,中医识别和分类很像cnn。

总结:人眼中有识别和匹配,但识别和匹配不一样,匹配是拉着弓,百步穿杨,而识别是那是杨树叶,或者说,那是杨树。

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

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

相关文章

王道-数据结构

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 答案:D 解析:队列的头指针指向队首元素的实际位置,因此出队操作后,头指针需向上移动一个元素的位置。循环队列的容量为m,所以头指针front加1以后,需…

【d60】【Java】【力扣】509. 斐波那契数

思路 要做的问题&#xff1a;求F&#xff08;n&#xff09;, F&#xff08;n&#xff09;就等于F(n-1)F(n-2)&#xff0c;要把这个F(n-1)F(n-2)当作常量&#xff0c;已经得到的值&#xff0c; 结束条件&#xff1a;如果是第1 第2 个数字的时候&#xff0c;没有n-1和n-2,所以…

闯关训练三:Git 基础知识

任务1: 破冰活动&#xff1a;自我介绍 点击Fork目标项目&#xff0c;创建一个新的Fork 获取仓库链接 在连接好开发机的vscode终端中逐行执行以下代码&#xff1a; git clone https://github.com/KelvinIII/Tutorial.git # 修改为自己frok的仓库 cd Tutorial/ git branch -a g…

4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1

目录 前序工作 1. 服务器项目名和本地一致 2. pycharm连接服务器 3. 本地项目对应到服务器项目 4. 简单测试一下同步效果 同步成功 前序工作 在同步到服务器之前&#xff0c;得确保已经完成以下几个前置步骤&#xff1a; 1. 租一个云服务器&#xff0c;可参考&#xff1a…

18734 拓扑排序

### 思路 1. **建模问题**&#xff1a;将课程和依赖关系建模为有向图&#xff0c;其中课程是节点&#xff0c;依赖关系是有向边。 2. **选择算法**&#xff1a;使用拓扑排序算法来确定课程的学习顺序。由于需要确保输出唯一性&#xff0c;同等条件下编号小的课程排在前面&…

WDG看门狗在stm32中的应用

一&#xff0c;WDG看门狗的介绍 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠性和安全性看…

2-114 基于matlab的CA模型

基于matlab的CA模型&#xff0c;Singer模型对单机动目标进行跟踪算法&#xff0c;具有10页实验文档。采用蒙特卡罗方法对一个二坐标雷达对一平面上运动的目标进行观测&#xff0c;得到跟踪滤波结果。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-114 …

libcurl网络协议库使用Demo

目录 1 libcurl简介 2 libcurl编译 3 使用步骤 4 函数说明 4.1 全局初始化函数 curl_global_init 4.2 全局释放函数 curl_global_cleanup 4.3 libcurl库版本 curl_version 4.4 开启会话 curl_easy_init 4.5 结束会话 curl_easy_cleanup 4.6 设置传输选项 curl_easy_se…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」&#xff1a; 下方「运动」Tab 会有一系列参数&#xff1a; 以下4个参数&#xff0c;只有「动画模式」选择「2D」才会生效&#xff0c;可忽略&#xff1a; 运动 平移 X 让镜头左右移动&#xff1a; 大于0&a…

Seata学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

华为eNSP:端口隔离

一&#xff0c;什么是端口隔离 端口隔离是一种网络配置技术&#xff0c;用于将不同的网络设备或用户隔离在不同的虚拟局域网&#xff08;VLAN&#xff09;中&#xff0c;以实现网络流量的隔离和安全性提升。通过在交换机或路由器上配置端口隔离&#xff0c;可以将连接到同一设…

【机器学习-无监督学习】概率图模型

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

在VS code 中部署C#和avalonia开发环境

要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 安装 .NET SDK 下载 .NET SDK&#xff1a; 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK&#xff0c;并下载安装程序。安装 .NET SDK&#xff1…

VSCode | 设置Jupyter Notebook显示行号

vscode中的jupyter notebook每个cell都是默认不显示行号的&#xff0c;如果出现了报错&#xff0c;比如在52行出现报错&#xff0c;如果代码多的话不显示行号就有点麻烦&#xff0c;本文介绍如何设置显示行号。 1、VScode点击文件-首选项-设置 2、搜索“python”&#xff0c;点…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

cherry-markdown开源markdown组件详细使用教程

文章目录 前言开发定位目标调研技术方案前提工作量安排数据库表设计实现步骤1、引入依赖2、实现cherry-markdown的vue组件&#xff08;修改上传接口路径&#xff09;3、支持draw.io组件4、支持展示悬浮目录toc前端使用&#xff1a;编辑状态使用cherry-markdown的vue组件前端使用…

netty之Netty心跳服务与断线重连

前言 使用netty中&#xff0c;需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听&#xff1b;f.addListener(new MyChannelFutureListener()) 代码目录结构 package com.lm.demo.netty.client;import io.netty.channel.ChannelFuture; import io.nett…

【11】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-模块化语法与自定义组件

序言&#xff1a; 本文详细讲解了关于鸿蒙系统学习中的模块化语法与自定义组件&#xff0c;在模块化语法中我们学习到了多种导入导出方式&#xff0c;实现了在一个项目中&#xff0c;通过引用不同的组件&#xff0c;让我们整体代码的可读性更强&#xff0c;相当于我们把一个手…

认知战认知作战:认知战与安全挑战中方企业在海外的应对策略分析

认知战认知作战&#xff1a;认知战与安全挑战中方企业在海外的应对策略分析 关键词&#xff1a;认知战, 中方企业, 恐怖袭击, 安全挑战, 信息传播, 社会责任, 风险管理, 国际合作,认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战…

MATLAB中lsqminnorm函数用法

目录 语法 说明 示例 求解具有无限个解的线性系统 指定容差以减少含噪数据的影响 切换显示低秩矩阵警告 lsqminnorm函数的功能是线性方程的最小范数最小二乘解。 语法 X lsqminnorm(A,B) X lsqminnorm(A,B,tol) X lsqminnorm(___,rankWarn) 说明 X lsqminnorm(A,B…