cnn突破一(先搞定三层反馈神经网络bpnet,c#实现)
惦记cnn很久了,一直搞机器视觉,走不出来,现在megauging已经实现,说明书也写了不少,该突破的突破了,该改进的也改进了,一个心病治好了,有空把人工智能在机器视觉上的延伸,补一补。自己也是一直认为,人工智能是在机器视觉上发展起来的,所以做这些事情,也是顺理成章。
前头有几篇自己研究bpnet的资料,不成气候,现在可以补齐。
后面的突破,那些个前面bpnet的公式推导仍然是必不可少,我这里就省略了。
网上看到有c++手写数字识别(基于mnist数据集),顺便翻译成c#,但没有成功,直觉上估计是自己在翻译二维数组过程中有问题,因为数学的推导,我已经反复核对过了!
c++有兴趣的可以参考:利用c++编写bp神经网络实现手写数字识别详解 - AlphaInf - 博客园
后来发现,直觉不对,二维数组没错,错了两处:
1,c++和c#的random函数使用不同
2,d【10】这个数组初始化不对
然后,我觉得学习的时间太长,就改进了一下,具体如下:
28*28的图像,使用3*3的高斯核平滑,然后隔行隔列取像素,形成14*14的图像,然后全连接:
196-》128-》10,或者196-》80-》10,训练结果都很好,自己要求不很高,达到95分就行。
下面是自己的c#代码:
double learnRate = 0.2f; //学习率
int n = 196; //输入层点个数
int p = 128; //隐藏层节点个数
int q = 10; //输出层节点个数
//与推导公式保持一致
//double x[n],hi[p],ho[p],yi[q],yo[q],d[q];
double[] xI = new double[14*14];
double[] hI = new double[128];
double[] hO = new double[128];
double[] yi = new double[10];
double[] yO = new double[10];
//所训练的网络,采用两个矩阵表示
double[,] w1 = new double[196, 128];
double[,] w2 = new double[128, 10];
void init()
{
Random ran = new Random();
for (int i = 0; i < n; i++)
for (int j = 0; j < p; j++)
{
// w1[i, j] = 0.1;
w1[i,j] = ran.Next(-100, 100)/100f;
// w1[i][j] = ran.Next(0, 65535) % 10 / 5f - 1;
}
//zhege zhengfu yi zhijian henmiao20240912
for (int i = 0; i < p; i++)
for (int j = 0; j < q; j++)
{
// w2[i, j] = 0.1;
w2[i,j] = ran.Next(-100, 100) / 100f;
// w2[i][j] = ran.Next(0, 65535) % 10 / 5f - 1;
}
}
以上初始化要说明的是:权重都初始化为【-1,1】之间的随机数,图像每个像素除以255,图像每个像素归一化到【0,1】
int[] d = new int[10];
int[] last = new int[60000];
//激活函数
public double sigmoid(double x)
{
return 1 / (1f + Math.Exp(-x));
}
//前向传播函数
public void forward()
{
//计算hi前需要对其进行清空
// memset(hi, 0, sizeof(hi));
hI = new double[128];
//通过w1计算输入层-隐藏层输入节点
for (int i = 0; i < n; i++)//196
for (int j = 0; j < p; j++)//128
hI[j] += xI[i] * w1[i,j];
//通过激活函数对隐藏层进行计算
for (int i = 0; i < p; i++)
//hO[i] = sigmoid(hI[i]+bh[i]);
hO[i] = sigmoid(hI[i] );
计算yi前需要对其进行清空
//memset(yi, 0, sizeof(yi));
yi = new double[10];
//通过w2计算隐藏层-输出层
for (int i = 0; i < p; i++)
for (int j = 0; j < q; j++)
yi[j] += hO[i] * w2[i,j];
//通过激活函数求yo
for (int i = 0; i < q; i++)
//yO[i] = sigmoid(yi[i]+by[i]);
yO[i] = sigmoid(yi[i] );
}
//判断输出的答案是多少
int getAns()
{
int ans = 0;
for (int i = 1; i < q; i++)
if (yO[i] > yO[ans]) ans = i;
return ans;
}
下面是训练函数:
void train(int cas)
{
xI = hello[cas];
int num = labels[cas];
d = new int[10];
d[num] = 1;
forward();
int ans = getAns();
if (num == ans)
last[cas] = 1;
back();
}
上面训练函数中xI = hello[cas];来自下面对mnist数据集的解析:高斯化和归一化都在里头:
double[][] hello = new double[60000][];
void ReadMnistImages(string filePath)
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
using (BinaryReader reader = new BinaryReader(fileStream))
{
// 跳过文件头的前16个字节
reader.ReadBytes(16);
int h = 28;
int w = 28;
while (fileStream.Position < fileStream.Length)
{
byte[] image = reader.ReadBytes(28 * 28); // MNIST图像大小为28x28
处理图像数据
byte[] showoutput = new byte[28 * 28];
//Blur(image, showoutput, 28, 28, 5);
...
for (int j = 1; j < (h - 1); j++)
{
for (int i = 1; i < (w - 1); i++)
{
int n0 = (j * w + i);
int wo = (image[n0 - w - 1] + 2 * image[n0 - w] + image[n0 - w + 1] +
2 * image[n0 - 1] + 4 * image[n0] + 2 * image[n0 + 1] +
image[n0 + w - 1] + 2 * image[n0 + w] + image[n0 + w + 1]);//未作除以16
showoutput[n0] = (byte)(wo >> 4);//完成除以16
}
}
byte[] showoutput14 = new byte[14 * 14];
int k = 0;
for (int j = 1; j < 28; j += 2)
{
for (int i = 1; i < 28; i += 2)
{
int nn = j * 28 + i;
showoutput14[k] = showoutput[nn];
k++;
}
}
gaoshoutuxiang196.Add(showoutput14);
}
//while循环完成60000图片的读取和高斯处理
//下面for循环完成60000图片在【0,1】的归一化
for (int xx = 0; xx < 60000; xx++)
{
hello[xx] = new double[196];
for (int i = 0; i < 196; i++)
{
hello[xx][i] = gaoshoutuxiang196[xx][i] / 255f;
}
}
}
}
下面是反传播back()函数:
public double dsigmoid(double x)
{
return x * (1 - x);
}
//反向传播函数
void back()
{
//对w2进行更新
for (int i = 0; i < p; i++)//128
for (int j = 0; j < q; j++)//10
{
double delta = (yO[j] - d[j]) * dsigmoid(yO[j]) ;//图像28*28是ling,则标签是0,d[]={1,0,0,0,0,0,0,0,0,0};图像28*28是wu,则标签是5,d[]={0,0,0,0,0,1,0,0,0,0}
w2[i, j] -= delta * learnRate * hO[i];
}
//对反向传播进行预处理
double[] W2 = new double[p];//p=128
// memset(W2,0,sizeof(W2));
for (int j = 0; j < p; j++)
for (int k = 0; k < q; k++)
W2[j] += (yO[k] - d[k]) * dsigmoid(yO[k]) * w2[j,k];//图像28*28是壹,则标签是1,d[]={0,1,0,0,0,0,0,0,0,0};图像28*28是jiu,则标签是9,d[]={0,0,0,0,0,0,0,0,0,1}
//对w1进行更新
for (int i = 0; i < n; i++)//196
for (int j = 0; j < p; j++)
{
double delta = dsigmoid(hO[j]) * xI[i] * W2[j];
w1[i,j] -= delta * learnRate;
}
}
最后就是调用执行,学习训练60000万次,以及把最后十次结果显示出来:
private void button1trainMnist_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
for (int cas = 0; cas < 60000; cas++)
{
train(cas);
}
int P = 100;
int he = 59000;
for (int n = 0; n < 9; n++)
{
int hh = 0;
for (int i = 0; i < P; i++)
{
hh += last[he + i];
}
textBox42对比信息.Text += he.ToString() + "," + hh.ToString() + "\r\n";
he += 100;
}
TimeSpan sp = DateTime.Now - dt;
textBox44.Text = sp.ToString();
}
c++程序和我这个程序都没有引入bias,其实正如c++作者所言,97分
后来我引入了bias【】,觉得正规一些,发现,反而不如这个程序!
原因是,bias【】更新计算对了,但写的地方不对导致学习成绩下降成绩,这是一个很隐蔽的错误,接下来,我会讲到,很久才发现bug,很崩溃,一度不想用bias【】!
今天先到这里!
相关文章:
cnn突破一(先搞定三层反馈神经网络bpnet,c#实现)
惦记cnn很久了,一直搞机器视觉,走不出来,现在megauging已经实现,说明书也写了不少,该突破的突破了,该改进的也改进了,一个心病治好了,有空把人工智能在机器视觉上的延伸,…...
如何创建一个docker,给它命名,且下次重新打开它
1.创建一个新的docker并同时命名 docker run -it --name one ubuntu:18.04 /bin/bash 这时候我们已经创建了一个docker,并且命名为"one" 2.关闭当前docker exit 3.这时docker已经终止了,我们需要使用它要重新启动 docker start one 4.现在可以重新打…...
【D3.js in Action 3 精译_025】3.4 让 D3 数据适应屏幕(中)—— 线性比例尺的用法
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…...
Python的多线程与多进程:并发编程基础与实战
随着计算机硬件的不断发展,现代计算机通常配备多核处理器,使得在程序中同时处理多个任务成为可能。并发编程是提升程序性能、充分利用多核处理器能力的重要技术之一。在Python中,并发编程的实现主要包括多线程、多进程以及异步编程(如asyncio)。然而,由于Python的全局解释…...
HarmonyOS Next应用开发——响应式布局之媒体查询
响应式布局之媒体查询 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式,常用于多屏幕的应用适配。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(…...
240 搜索二维矩阵 II
解题思路: \qquad 解这道题最重要的是如何利用从左到右、从上到下为升序的性质,快速找到目标元素。 \qquad 如果从左上角开始查找,如果当前matrix[i][[j] < target,可以向右、向下扩展元素都是升序,但选择哪个方向…...
jenkins微服务
如果vim进去某个文件里,可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹,然后向其中导入两个包 2.安装jenkins 再在控制…...
【Kotlin基于selenium实现自动化测试】初识selenium以及搭建项目基本骨架(1)
导读大纲 1.1 Java: Selenium 首选语言1.2 配置一个强大的开发环境 1.1 Java: Selenium 首选语言 Java 是开发人员和测试人员进行自动化 Web 测试的首选 Java 和 Selenium 之间的协同作用受到各种因素的驱动,从而提高它们的有效性 为什么Java经常被认为是Selenium的首选语言 广…...
汽车追尾为什么是后车的责任?
简单点说:因为人后面没有长眼睛。 结论 在汽车追尾事故中,通常情况下后车被认为是责任方的原因在于交通法规对驾驶安全标准的约定和实践中的责任识别原则。虽然追尾事故常见地被归责于后车,但具体判断并不是绝对的,仍需综合多种…...
[运维]4.bookinfo无法部署的问题
为了拉取镜像,搭建了阿里云镜像仓库,教程见:K8S中基于NFS-Subdir-External-Provisioner存储组件实现的StorageClass-CSDN博客 但是bookinfo的ratings和productpage无法运行,部署后显示crashLoopBackOff [rootmaster ~]# kubectl…...
ACT调试pycharm报错
在运行ACT 代码时,根据官方readme使用命令行需要在wandb选择的时候输入3 但是,使用pycharm运行的时候会报错 wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key[your_api_key]) 网上搜索都是说要注册什么key…...
记一次控件提升后,运行却不显示的Bug
.h文件 #ifndef VOLUMETOOLBTN_H #define VOLUMETOOLBTN_H#include <QToolButton> #include <memory>class VolumeToolBtn : public QToolButton { Q_OBJECTpublic:explicit VolumeToolBtn(QWidget *parent nullptr);~VolumeToolBtn() override;void initUi(); p…...
关于深度学习torch的环境配置问题
已经下好了torch在虚拟环境中,结果在ipynb文件中无法运行 后来在终端直接用python语句编译 发现没有问题 在编辑测试py文件 发现runcode有问题 原来是插件默认base环境 具体操作参考VS Code插件Code Runner使用python虚拟环境_coderunner怎么在虚拟环境中使用-CSD…...
Linux工具的使用——yum和vim的理解和使用
目录 linux工具的使用1.linux软件包管理器yum1.1yum的背景了解关于yum的拓展 1.2yum的使用 2.Linux编辑器-vim使用2.1vim的基本概念2.2vim的基本操作2.3命令模式命令集2.3.1关于光标的命令:2.3.2关于复制粘贴的命令2.3.3关于删除的命令2.3.4关于文本编辑的命令 2.4插…...
websockets库使用(基于Python)
主要参考资料: 【Python】websockets库的介绍及用法: https://blog.csdn.net/qq_53871375/article/details/135920231 python模块websockets,浏览器与服务器之间的双向通信: https://blog.csdn.net/randy521520/article/details/134752051 目录 websocke…...
Electron 主进程与渲染进程、预加载preload.js
在 Electron 中,主要控制两类进程: 主进程 、 渲染进程 。 Electron 应⽤的结构如下图: 如果需要更深入的了解electron进程,可以访问官网 流程模型 文档。 主进程 每个 Electron 应用都有一个单一的主进程,作为应用…...
鸿蒙harmonyos next纯flutter开发环境搭建
公司app是用纯flutter开发的,目前支持android和iOS,后续估计也会支持鸿蒙harmonyos。目前谷歌flutter并没有支持咱们国产手机操作系统鸿蒙harmonyos,于是乎国内有个叫OpenHarmony-SIG的组织,去做了鸿蒙harmonyos适配flutter开发的…...
【学习资源】人在环路的机器学习
说明:本文图片和内容来源 Human-in-the-Loop Machine Learning Human-in-the-Loop Machine Learning Active learning and annotation for human-centered AI by Robert (Munro) Monarch, June 2021 介绍Human-in-the-Loop的目标,学习过程,…...
计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
031集——文本文件按空格分行——C#学习笔记
如下图,读取每行文本,每行文本再按空格分开读取一个字符串,输出到另一个文本: CAD环境下,代码如下: using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using System; using Sys…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
