MatConvNet中mnist源码解析

2023-11-07

  本文的代码来自MatConvNet
  下面是自己对代码的注释:  
cnn_mnist_init.m

function net = cnn_mnist_init(varargin)
% CNN_MNIST_LENET Initialize a CNN similar for MNIST
opts.useBatchNorm = true ;   #batchNorm是否使用
opts.networkType = 'simplenn' ;  #网络结构使用lenet结构
opts = vl_argparse(opts, varargin) ;
rng('default');
rng(0) ;
f=1/100 ;
net.layers = {} ;
# 定义各层参数,type是网络的层属性,stride为步长,pad为填充
# method中max为最大池化
net.layers{end+1} = struct('type', 'conv', ...
                           'weights', {{f*randn(5,5,1,20, 'single'), zeros(1, 20, 'single')}}, ...
                           'stride', 1, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'pool', ...
                           'method', 'max', ...
                           'pool', [2 2], ...
                           'stride', 2, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'conv', ...
                           'weights', {{f*randn(5,5,20,50, 'single'),zeros(1,50,'single')}}, ...
                           'stride', 1, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'pool', ...
                           'method', 'max', ...
                           'pool', [2 2], ...
                           'stride', 2, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'conv', ...
                           'weights', {{f*randn(4,4,50,500, 'single'),  zeros(1,500,'single')}}, ...
                           'stride', 1, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'relu') ;
net.layers{end+1} = struct('type', 'conv', ...
                           'weights', {{f*randn(1,1,500,10, 'single'), zeros(1,10,'single')}}, ...
                           'stride', 1, ...
                           'pad', 0) ;
net.layers{end+1} = struct('type', 'softmaxloss') ;

# optionally switch to batch normalization
# BN层一般用在卷积到池化过程中,激活函数前面,这里是在第1,4,7层插入BN
if opts.useBatchNorm
  net = insertBnorm(net, 1) ;
  net = insertBnorm(net, 4) ;
  net = insertBnorm(net, 7) ;
end

# Meta parameters
net.meta.inputSize = [27 27 1] ;  #输入大小[w,h,channel],这里是灰度图片,单通道为1
net.meta.trainOpts.learningRate = 0.001 ; #学习率
net.meta.trainOpts.numEpochs = 20 ; #epoch次数,注意这里不是所谓的迭代次数
net.meta.trainOpts.batchSize = 100 ; #批处理,这里就是mini-batchsize,batchSize大小对训练过程的影响见我另外一篇博客:卷积神经网络四大问题之一

# Fill in defaul values
net = vl_simplenn_tidy(net) ;

# Switch to DagNN if requested
# 选择不同的网络结构,这里就使用的simplenn结构
switch lower(opts.networkType)
  case 'simplenn'
    % done
  case 'dagnn'
    net = dagnn.DagNN.fromSimpleNN(net, 'canonicalNames', true) ;
    net.addLayer('error', dagnn.Loss('loss', 'classerror'), ...
             {'prediction','label'}, 'error') ;
  otherwise
    assert(false) ;
end

% --------------------------------------------------------------------
function net = insertBnorm(net, l)   #具体的BN函数
% --------------------------------------------------------------------
assert(isfield(net.layers{l}, 'weights'));
ndim = size(net.layers{l}.weights{1}, 4);
layer = struct('type', 'bnorm', ...
               'weights', {{ones(ndim, 1, 'single'), zeros(ndim, 1, 'single')}}, ...
               'learningRate', [1 1 0.05], ...
               'weightDecay', [0 0]) ;
net.layers{l}.biases = [] ;
net.layers = horzcat(net.layers(1:l), layer, net.layers(l+1:end)) ; #horzcat水平方向矩阵连接,这里就是重新构建网络结构,将BN层插入到lennt中

cnn_mnist_experiments.m

%% Experiment with the cnn_mnist_fc_bnorm
[net_bn, info_bn] = cnn_mnist(...
  'expDir', 'data/mnist-bnorm', 'useBnorm', true);

[net_fc, info_fc] = cnn_mnist(...
  'expDir', 'data/mnist-baseline', 'useBnorm', false);
# 以下就是画图的代码
figure(1) ; clf ;
subplot(1,2,1) ;  # 第一张图
semilogy(info_fc.val.objective', 'o-') ; hold all ;
semilogy(info_bn.val.objective', '+--') ;  #表示y坐标轴是对数坐标系
xlabel('Training samples [x 10^3]'); ylabel('energy') ;
grid on ; #加入网格
h=legend('BSLN', 'BNORM') ;  #加入标注
set(h,'color','none');
title('objective') ;
subplot(1,2,2) ;
plot(info_fc.val.error', 'o-') ; hold all ;
plot(info_bn.val.error', '+--') ;
h=legend('BSLN-val','BSLN-val-5','BNORM-val','BNORM-val-5') ;
grid on ;
xlabel('Training samples [x 10^3]'); ylabel('error') ;
set(h,'color','none') ;
title('error') ;
drawnow ;

  运行结果得到的图:
    这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MatConvNet中mnist源码解析 的相关文章

  • java 定时任务之一 @Scheduled注解(第一种方法)

    本文仅供参考 使用spring Scheduled注解执行定时任务 步骤 1 xmlns 添加 http www springframework org schema task http www springframework org sc
  • CentOS下postgres怎么恢复数据库.bak文件_Xtrabackup 实现数据的备份与恢复

    Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件 它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份 对于MyISAM的备份同样需要加表锁 mysqldump备份方式是采用的逻辑备份
  • 加密SO文件中自定义的section

    加密SO文件中自定义的section 作者 0n1y3nd丶 分类 Android 发布时间 2014 08 29 18 22 61条评论 前言 加密已知so文件中的某一section 在运行时解密 执行里面的代码 0 1 libsyc s
  • vim q:适合更多操作的命令行窗口。

    最简单的命令行窗口 输入命令 但是 如果想复制内容到命令行窗口 怎么办 有一种方法 在正常模式下 输入 q 就打开了命令行窗口 命令行窗口中都是我们输入过的命令 在这个窗口中我们可以像编辑正文一样编辑新的命令 或修改旧的命令 因为像编辑普通
  • ChatGPT常见错误解决和封号情形说明

    1 ChatGPT国内能用吗 答 ChatGPT官网国内IP不能 包括港澳台 最好用美国IP 所以需要魔法才能访问官网 这块内容懂得都懂 不敢写教程 只能各位自行搞定 搞不定还是老实用国内的 2 登录遇到ChatGPT高峰期 解决办法 遇到
  • 深度学习-无监督学习(2)

    一 简介 接续上一节我们对无监督学习的介绍 接下来我们将对其中的两大模块展开介绍 在介绍之前会对流行数据让大家有一定的了解 二 无监督学习 数据流形 流形学习的目标是在保持特征特性的同时 将原来位于高维空间中的数据嵌入到低维空间中 这是可能
  • gcc 4.9 g++ gfortran 安装

    Linux编译安装GCC 4 9 0 有需要的朋友可以参考下 Linux下编写C C 程序自然缺不了一个优秀的编译器 Linux下比较常见的自然是GCC了 最近GCC也出到了4 9 0版本 对于C 11 14也有了更好的支持了 所以 今天我
  • 5.4 龙贝格算法

    为什么有龙贝格算法 龙贝格算法是一种数值积分方法 用于计算定积分的数值近似值 它是基于复合梯形法和复合辛普森法的推广和拓展 可以达到更高的精度 相较于复合梯形法和复合辛普森法 龙贝格算法的收敛速度更快 且误差更小 因此在计算积分时更加精确
  • Restful API注解之@PathVariable和@JsonView详解

    对于restful API的使用可以查看我之前的文章SpringMVC开发restful API查询请求 本文将在restful API的基础上介绍 PathVariable和 JsonView注解的详细使用方式 一 PathVariabl
  • 国王分金币(超详细版)

    描述 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币 之后两天 第二天和第三天 每天收到两枚金币 之后三天 第四 五 六天 每天收到三枚金币 之后四天 第七 八 九 十天 每天收到四枚金币 这种工资发放模式会一直这样延续下去
  • 数据结构:数组模拟栈

    实现一个栈 栈初始为空 支持四种操作 push x 向栈顶插入一个数 x pop 从栈顶弹出一个数 empty 判断栈是否为空 query 查询栈顶元素 用数组模拟栈 栈 先进后出 include
  • 基于Python的Streamlit框架数据可视化

    背景 性能测试和授权软件每周周会前都需要手工统计数据到excel文档形成周报 人工统计费时费力 excel文档也不美观 所以萌生了用数据可视化展示周报的想法 由于不太懂web开发 html css这些 网上浏览了一番 发现已经有大佬基于Py
  • 2022 年面向开发人员的七个优秀 Java IDE

    ava是最强大的编程语言之一 目前用于30亿台设备的开发 每天约有70万开发人员使用它 它一直是开发大量应用程序的重要组成部分 它提供了一些惊人的功能 例如易于学习和理解 高度安全 平台独立性 极其安全等等 Java IDE 集成开发环境
  • C#:通过字符串(文本)调用控件

    TextBox tb TextBox this GetType GetField tb Runtime System Reflection BindingFlags NonPublic System Reflection BindingFl
  • Scanner类在Java中的使用

    一 前言 在学习Java的过程中 我们很容易看得到诸如 从键盘中输入 这就需要我们新手 不针对大佬 大佬绕路即可 哈哈哈哈 学习其中的知识 今天就来给大家讲一下Scanner的使用方法 二 知识点 1 导包 import java util
  • 解决npm切换国内源-nrm ls 命令*不显示的问题

    解决npm切换国内源 nrm ls 命令 不显示的问题 解决方案 此时不显示 nrm ls 解决方案 进入本地全局包安装目录 例AppData Roaming npm node modules nrm nrm目录下打开cli js文件 找到
  • 攻防世界--WEB题之robots

    问题描述 难度系数 一颗星 题目来源 Cyberpeace n3k0 题目描述 X老师上课讲了Robots协议 小宁同学却上课打了瞌睡 赶紧来教教小宁Robots协议是什么吧 题目场景 点击获取在线场景 题目附件 暂无 题目分析 这个题由题
  • python基础练习题(一)

    参考 一 单选题 1 Python中 运算符比较两个对象的值 下列选项中哪一个是is比较对象的因素 4 0分 A id B sum C max D min id 命令查看变量的地址 2 在python中 字符串s abc 那么执行表达式s
  • vue2以ElementUI为例构建notify便捷精美提示

    我们先引入一个 第三方UI库 这里 我们以elementUI为例 先引入依赖 npm install element ui save 然后 在 main js 入口文件中 引入一下 import ElementUI from element

随机推荐

  • MSYS2 如何添加国内源

    用MSYS2 pacman S 安装包的速度让你怀疑人生 所以需要将源换成国内源 步骤 lt 1 gt 打开MSYS2软件内的 etc pacman d 其中有3个文件 mirrorlist mingw32 mirrorlist mingw
  • Nacos未授权访问漏洞(CVE-2021-29441)

    目录 漏洞描述 影响范围 环境搭建 漏洞复现 声明 本文仅供学习参考 其中涉及的一切资源均来源于网络 请勿用于任何非法行为 否则您将自行承担相应后果 本人不承担任何法律及连带责任 加粗样式 漏洞描述 Nacos 是阿里巴巴推出来的一个新开源
  • 百度Apollo(二):障碍物感知模块

    Apollo感知模块具有识别障碍物和交通灯的能力 其中 Apollo解决的障碍物感知问题 1 高精地图ROI过滤器 HDMap ROI Filter 2 基于卷积神经网络分割 CNN Segmentation 3 MinBox 障碍物边框构
  • jenkins构建前、构建、构建后操作

    因为使用docker部署的jenkins存在目录映射问题 所以直接部署jenkins 部署参考 构建前操作 思路 使用ssh到目标服务器下发命令 查询启动的node服务 分析不同的服务器启动的服务 备份服务对应代码 构建 思路 jenkin
  • linux 创建 svn 库

    cd data svn mkdir p itvalue chown R windmaker windmaker itvalue svnadmin create data svn itvalue cd itvalue cd conf vim
  • freeimage ubuntu安装

    sudo apt get install libfreeimage dev sudo apt get install libfreeimage 编译安装地址 https github com Kanma FreeImage This dis
  • es6 求两个数组的差集

    let arr 1 2 3 4 5 let arr01 1 2 3 4 5 6 7 8 9 let arr02 arr01 filter x gt arr every y gt y x console log arr02
  • 以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三)

    在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 一 中 我们已经完成了一切所需的设置 在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 二 中 让我们通过列出将在选举中运行的候选人来继续构建智能合约并完成客户端程序
  • 第四章文件管理

    0 初识文件管理 一个文件有哪些属性 文件名 由创建文件的用户决定文件名 主要是为了方便用户找到文件 同一目录下不允许有重名文件 标识符 一个系统内的各文件标识符唯一 对用户来说毫无可读性 因此标识符只是操作系统用于区分各个文件的一种内部名
  • WLS2 下解决nvidia-smi不可用方法

    WLS2系统 Ubuntu22 04 windows win11 wls2更新内核后 nvcc V 可用 但是 nvidia smi报错 NVIDIA SMI has failed because it couldn t communica
  • 安装开发软件的步骤以及后期开发会遇到的一系列问题

    这是我自己进行项目开发过程中遇到的一些问题 我将他们记录了下来 一 合理的安装开发软件的过程 1 安装jdk 1 1版本问题 不要安装最新的jdk 很容易出现bug 可以安装第三个版本左右的jdk 1 2配置环境变量 网上搜 2 安装Tom
  • 区块链学习笔记(三)——第一章 密码学及加密货币概念

    加密数字货币与法定货币不同在于 其安全规则需要完全通过技术手段实现 而非依赖中央机构 1 1 哈希函数 哈希函数三个特性 1 任意大小字符串均可作为输入 2 产生固定大小输出 3 能进行有效计算 即对应n位字符串 其哈希值计算复杂度为 O
  • linux 下使用 sar -n 命令查看Kbps、bps的带宽速率

    一 关于网络带宽知识 1 1 速率单位 bps 速度单位 bit即比特 通常用b 小写 表示 指一位二进制位 1 Milionbit 1000Kilobit 1000000bit 即 1Mbps 1000 000bps 常见换算单位 Mbp
  • helm 安装

    官方安装 https helm sh docs intro install 1 一键安装 curl https raw githubusercontent com helm helm main scripts get helm 3 bash
  • 计算机毕业设计Node.js+Vue电影票网上订票系统(程序+源码+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • Unity 动态加载Prefab

    Unity动态记载Prefab 第一种方法 从Resources文件夹读取Prefab Assets Resources是Unity中的一个特殊文件夹 放在这个文件夹里的资源包括Prefab可以被代码动态加载 GameObject Pref
  • 软件测试_笔记(完整版)

    软件测试 概述 程序 文档 数据 软件 狭义的软件测试定义 为发现软件缺陷而执行程序或系统的过程 广义的软件测试定义 人工或自动地运行或测定某系统的过程 目的在于检验它是否满足规定的需求或弄清预期结果和实际结果间的差别 为什么要做软件测试
  • LTspice入门使用教程(导入元器件&电压电流波形&幅频特性曲线)

    LTspice使用教程 本文针对LTspice的基本操作进行简单讲解 包括 导入自定义参数的元器件模型 仿真查看电压 电流波形图 输出幅频特性曲线 导入自定义参数的模型 打开LTspice 新建原理图之后 选择工具栏里的component
  • html实现点击复制内容功能

    需要实现点击复制功能需要先下载个插件 vue中可以通过 npm install clipboard save dev 来安装该插件 也可以通过使用线上cdn 复制scirpt标签引入到页面即可 html td class t left 用户
  • MatConvNet中mnist源码解析

    本文的代码来自MatConvNet 下面是自己对代码的注释 cnn mnist init m function net cnn mnist init varargin CNN MNIST LENET Initialize a CNN sim