【JS进阶】执行上下文与执行栈

【Javascript】图解JS中执行上下文与执行栈 今天我们更深入地讲述了类型转换的诸多细节,除了这一讲的简单题解之外,对于“+”号运算也做了一些补充。总地来讲,我们是在讨论 JavaScript 语言所谓“动态类型”的部分,但是动态类型并不仅限于此。也就是说 JavaScript 中并不仅仅是“类型转换”表现出来动态类型的特性。最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。 阅读详情

执行上下文与执行栈

1.执行上下文

简单来说,执行上下文是一种对 JS 代码执行环境的抽象概念,即只要有 JS 代码在运行,那么它就一定是运行在执行上下文中。

执行上下文的类型分为三种:

  • 全局执行上下文:有且只有一个,浏览器中的全局对象就是 window 对象,全局执行上下文中的 this 指向这个全局对象
  • 函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文
  • Eval 函数执行上下文:指的是运行在 eval 函数中的代码,很少用而且不建议使用

例:
在这里插入图片描述
在上面的图中,紫色框的部分为全局上下文,而绿色、蓝色和橙色框的部分,则是不同的函数上下文。可以看到,只有全局上下文中的变量、方法,能够被其它任何上下文访问。

但是可以有任意多个函数上下文,每次调用函数创建一个新的上下文,会创建一个私有作用域,函数内部声明的任何变量都不能在当前函数作用域外部直接访问。

所以,执行上下文的特点在于:

  • 单线程。
  • 同步执行。
  • 只有一个全局上下文。
  • 可有无数个函数上下文。 每个函数调用都会创建一个新的 执行上下文,哪怕是递归调用。

2.执行上下文的生命周期

执行上下文的生命周期包括三个阶段:创建阶段 → 执行阶段 → 回收阶段。

  • 创建阶段:这个阶段后面会详细分析。
  • 执行阶段:执行变量赋值、代码执行
  • 回收阶段:执行上下文出栈,等待虚拟机回收。

如图:
在这里插入图片描述

3.执行上下文的创建阶段

每个执行上下文的基本组成如下:
在这里插入图片描述
下面来分别对这几项工作以及关键概念进行介绍。

3.1 生成变量对象
a.变量对象的创建过程
  1. 建立arguments对象。检查当前上下文中的参数,并建立 arguments对象下的属性与属性值之间的对应关系。
  2. 检查当前上下文的函数声明,也就是使用function关键字进行声明的函数。在变量对象中以函数名建立一个属性,属性值为指向该函数所在内存地址的引用。若该函数名的属性已经存在了,则会用新的引用覆盖。
  3. 检查当前上下文中的变量声明,每找到一个变量声明,就在变量对象中以变量名建立一个属性,其值默认为undefined。同时,为了防止与变量同名的函数被修改为undefined,则会直接将其跳过,不修改其属性值。

如图:
在这里插入图片描述
但是有一件需要注意的事:

function foo() { console.log('function foo') }
var foo = 20;

console.log(foo); // 20

// 以上代码中,变量声明的 foo 遇到函数声明的 foo 会跳过,
// 可是为什么最后 foo 的输出结果仍然是被覆盖了呢?
// 那是因为三条规则仅仅适用于变量对象的创建过程,也就是执行上下文的创建过程。
// 而 foo=20 是在执行上下文的执行过程中运行的,输出结果自然会是20。

再来看另一个例子:

console.log(foo); // ƒ foo() { console.log('function foo') }
function foo() { console.log('function foo') }
var foo = 20;

上面例子的执行顺序为:

  1. 首先将所有函数声明放入变量对象中,即:function foo() { console.log('function foo') }
  2. 其次将所有变量声明放入对象变量中,即:var foo。而此时因为已经存在同名的函数foo(),所以会跳过对 foo 变量的 undefined 赋值。
  3. 然后执行代码,即:console.log(foo); foo = 20;

因此,这里输出的 foo 为函数对象,而不是 20。

其中关键的地方在于:始终将var foo = 20视为两个分离的操作,即var foo和foo = 20。从而使得在赋值之前,输出 foo 变量。

b.变量对象与活动对象

变量对象与活动对象其实都是同一个对象,只是处于执行上下文的不同生命周期。不过只有处于函数调用栈栈顶的执行上下文中的变量对象,才会变成活动对象。

看下面这个例子:

function test() {
    console.log(a);
    console.log(foo());

    var a = 1;
    function foo() {
        return 2;
    }
}

test();

在全局作用域中调用test()时,test()的执行上下文开始创建。

在创建过程中,test 方法的执行上下文结构如下:

testEC = {
	// VO 为 Variable Object的缩写,即变量对象
    VO: {
        //注:在浏览器的展示中,函数的参数可能并不是放在arguments对象中
        arguments: {...},  
        foo: <foo reference>,  // 表示 foo 的地址引用
        a: undefined,
        this: Window
    },
    scopeChain: {}
}

而未进入执行阶段之前,变量对象 VO 中的属性均不能访问!但是进入执行阶段后,变量对象转为活动对象,其中的属性均可以被访问,随后开始执行阶段的各项操作。

// 执行阶段
VO ->  AO   // Active Object 活动对象
AO = {
    arguments: {...},
    foo: <foo reference>,
    a: 1,
    this: Window
}

所以,在上面的例子中,代码的执行顺序如下:

function test() {
    //创建阶段
    function foo() {
        return 2;
    }
    var a;
    
    //执行阶段
    console.log(a); // undefined
    console.log(foo()); // 2
    a = 1;
}

test();
c.全局上下文的变量对象

全局上下文有一个特殊的地方,它的变量对象,就是window对象。而这个特殊,在this指向上也同样适用,this也是指向window。

除此之外,全局上下文的生命周期,与程序的生命周期一致,只要程序运行不结束,比如关掉浏览器窗口,全局上下文就会一直存在。其他所有的上下文环境,都能直接访问全局上下文的属性。

3.2 创建作用域链

作用域链本质上是一个指向当前环境与上层环境的一系列变量对象的指针列表(它只引用但不实际包含变量对象),作用域链保证了当前执行环境对符合访问权限的变量和函数的有序访问。

看下面这个例子:

var a = 1;             
function out() {
    var b = 2;
    function inner() {
        var c = 3;
        console.log(a+b+c);
    }
    inner();          
}
out();

首先,代码开始运行时就创建了全局上下文环境,接着运行到out()时创建 out函数的执行上下文,最后运行到inner()时创建 inner函数的执行上下文,我们设定他们的变量对象分别为VO(global),VO(out), VO(inner)。

我们可以直接用一个数组来表示作用域链,数组的第一项scopeChain[0]为作用域链的最前端,而数组的最后一项,为作用域链的最末端。

注意,所有的最末端都为全局变量对象!

  1. 对于全局作用域链:由于它只含全局作用域,没有上级,因此它的作用域链只指向本身的全局变量对象。在查找标识符时只能从本身的全局变量对象中查找。

    此时的全局上下文环境如下:

    // 全局上下文环境
    globalEC = {
        VO: {
            out: <out reference>,  // 表示 out 的地址引用
            a: undefined
        },
        scopeChain: [VO(global)], // 作用域链
    }
    
  2. 对于函数out的作用域链:可以引用函数out本身的变量对象以及全局的变量对象。查找标识符时,先在函数out变量对象中寻找,找不到的话再去上一级全局变量对象查找。

    此时out函数的执行上下文环境如下:

    // out 函数的执行上下文
    outEC = {
        VO: {
            arguments: {...},
            inner: <inner reference>,  // 表示 inner 的地址引用
            b: undefined
        },
        scopeChain: [VO(out), VO(global)], // 作用域链
    }
    

    如图:
    在这里插入图片描述

  3. 对于函数inner的作用域链:可以引用函数inner本身的变量对象和上一级out函数的变量对象以及全局的变量对象。查找标识符时依次从inner,out,全局变量对象中查找。

    此时inner函数的执行上下文环境如下:

    innerEC = {
        VO: {
            arguments: {...},  
            c: undefined,
        },  // 变量对象
        scopeChain: [VO(inner), VO(out), VO(global)], // 作用域链
    }
    

    如图:
    在这里插入图片描述

3.3 确定 this 指向

有关this的指向问题,见…

4.执行上下文栈

在代码开始执行时,首先会产生一个全局执行上下文环境,调用函数时,会产生函数执行上下文环境,函数调用完成后,它的执行上下文环境以及其中的数据都会被销毁,重新回到全局执行环境,网页关闭后全局执行环境也会销毁。其实这是一个压栈出栈的过程,全局上下文环境永远在栈底,而当前正在执行的函数上下文在栈顶。

例如:

var a = 1;             //1.进入全局上下文环境
function out() {
    var b = 2;
    function inner() {
        var c = 3;
        console.log(a+b+c);
    }
    inner();          //3.进入inner函数上下文环境
}
out(); //2.进入out函数上下文环境

↑以上代码的执行会经历以下过程:

  1. 当代码开始执行时就创建全局执行上下文环境,全局上下文入栈。
  2. 全局上下文入栈后,其中的代码开始执行,进行赋值、函数调用等操作,执行到out()时,激活函数out创建自己的执行上下文环境,out函数上下文入栈。
  3. out函数上下文入栈后,其中的代码开始执行,进行赋值、函数调用等操作,执行到inner()时,激活函数inner创建自己的执行上下文环境,inner函数上下文入栈。
  4. inner函数上下文入栈后,其中的代码开始执行,进行赋值、函数调用、打印等操作,由于里面没有可以生成其他执行上下文的需要,所有代码执行完毕后,inner函数上下文出栈。
  5. inner函数上下文出栈,又回到了out函数执行上下文环境,接着执行out函数中后面剩下的代码,由于后面没有可以生成其他执行上下文的需要,所有代码执行完毕后,out函数上下文出栈。
  6. out函数上下文出栈后,又回到了全局执行上下文环境,直到浏览器窗口关闭,全局上下文出栈。

如下图:
在这里插入图片描述

总结

我们可以得到一些结论:

  • 全局上下文在代码开始执行时就创建,只有唯一的一个,永远在栈底,浏览器窗口关闭时出栈。
  • 函数被调用的时候创建上下文环境。
  • 只有栈顶的上下文处于活动状态,其变量对象成为活动对象,并执行其中的代码。
JavaScript进阶1之作用域、执行上下文的顺序执行、可执行代码、执行上下文栈 JavaScript采用静态作用域,于是执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。但是使用var表达式定义函数add1,只有变量声明提前了,变量初始化代码仍然在原来的位置,没法提前执行。用函数语句创建的函数add2,函数名称和函数体均被提前,在声明它之前就使用它。 阅读详情

相关推荐

JavaScript中的执行上下文和执行栈

通过了解执行上下文的类型和执行栈的工作原理,我们可以更好地理解代码的执行过程,包括变量和函数的作用域以及this关键字的值。每当JavaScript引擎执行一段可执行代码时,都会创建一个新的执行上下文。在JavaScript中,执行上下文和执行栈是理解代码执行过程中的重要概念。当JavaScript引擎执行代码时,会将执行上下文压入执行栈中。执行栈采用先进后出(LIFO)的原则,即最后压入的执行上下文会最先执行并在执行完毕后出栈。执行上下文分为三种类型:全局执行上下文、函数执行上下文和eval执行上下文。

syntax_api860的博客 199

关于执行上下文

一、什么是执行上下文? 简而言之,执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。 二、执行上下文的类型 JavaScript 中有包含三种类型。 全局执行上下文 — 这是默认或者说基础的上下文,任何不在函数内部的代码都在全局上下文中。它会执行两件事:创建一个全局的 window 对象(浏览器的情况下),并且设置 this 的值等于这个全局对象。一个程序中只会有一个全局执行上下文。 函数执行上下文 — 每当

qq_38261819的博客 1304

【Step-By-Step】一周面试题深入解析 / 周刊02

关于【Step-By-Step】Step-By-Step是我于 2019-05-20 开始的一个项目,每个工作日发布一道面试题。每个周末我会仔细阅读大家的答案,整理最一...

cpongo11的博客 215

执行上下文

this执行上下文也叫this执行环境?为什么呢就让我这个英语zz来解释下 context:环境; 上下文 执行环境:执行环境中定义了变量或函数有权访问的其他数据,决定了他们给各自行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保持在这个对象中,虽然我们无法访问到这个对象,但是解析器可以在处理数据的时候在后台使用他 ...

qq_39148344的博客 2304

使用VNC可视化Docker容器

Docker容器可视化

Robert_Q的博客 1万+

ADRV902x射频评估实战:手把手教你用TES GUI生成ARM bin与JESD204C配置文件

在射频前端系统设计中,ADRV902x系列收发器凭借其宽带性能和灵活配置能力,已成为5G基站、微波回传等场景的核心器件。然而当工程师面对非官方硬件平台时,如何高效利用Transceiver Evaluation Software(TES)完成关键配置,成为项目推进的第一道门槛。本文将彻底解析脱离ADS9母板后的完整离线工作流,从参数预设到文件生成,手把手解决真实工程中的配置痛点。在Demo模式下,所有硬件状态检测都会被跳过,但配置文件生成功能完全可用。作为基础模板,因其配置最为简洁,便于后续自定义修改。

weixin_33704591的博客 429

执行上下文、执行栈

执行上下文、执行栈

Lyrelion的博客 1806

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。

wdx012345的博客 966

进阶:JS 执行上下文与执行栈,变量对象

点击上方“IT平头哥联盟”,选择“置顶或者星标”与你一起成长~作者:以乐之名https://segmentfault.com/a/1190000017890535写在开篇已经不敢自称前端小...

画漫画的程序员∙苏南 176

ArcGIS新手必看:用Landsat 8数据计算植被覆盖度的完整流程(附DEM裁剪技巧)

本文为ArcGIS新手提供了使用Landsat 8数据计算植被覆盖度的完整流程指南。详细讲解了从数据预处理、NDVI计算到基于像元二分模型反演植被覆盖度的核心步骤,并重点分享了利用DEM进行精确裁剪的实用技巧,帮助用户高效完成地表信息提取与分析。

weixin_29279047的博客 239

别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么

摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 861

函数调用时的临时对象_进阶:JS 执行上下文与执行栈,变量对象

点击上方“IT平头哥联盟”,选择“置顶或者星标”与你一起成长~作者:以乐之名https://segmentfault.com/a/1190000017890535写在开篇已经不敢自称前端小白,曾经吹过的牛逼总要一点点去实现。正如前领导说的,自己喝酒吹过的牛皮,跪着都得含着泪去实现。那么没有年终完美总结,来个新年莽撞开始可好。进击巨人系列开篇,不忘初心,砥砺前行。理解执行上下文执行上下文(...

weixin_39559469的博客 126

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2621

js函数、js对象的这些点你真的懂吗?_js textcolor(1)

: 显式原型属性 : 隐式原型属性函数的prototype: 定义函数时被自动赋值, 值默认为{}, 即用为原型对象 实例对象的__proto__: 在创建实例对象时被自动添加, 并赋值为构造函数的prototype值 原型对象即为当前实例对象的父对象所有的实例对象都有__proto__属性, 它指向的就是原型对象 这样通过__proto__属性就形成了一个链的结构---->原型链 当查找对象内部的属性/方法时, js引擎自动沿着这个原型链查找 当给对象属性赋值时不会使用原型链, 而只是在当前对象中进行操作

2401_87555514的博客 1138

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

js函数、js对象的这些点你真的懂吗?_js textcolor

创建一个Function的实例对象给对象添加prototype属性, 其值为object空对象(原型对象)给原型对象添加constructor属性, 指向当前函数对象✨原创不易还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下。

2401_87555332的博客 804

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

2024年C C++最全js函数、js对象的这些点你真的懂吗?_js textcolor,2024年最新2024大厂C C++社招面试题

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新如果你需要这些资料,可以戳这里获取 : 显式原型属性 : 隐式原型属性函数的prototype: 定义函数时被自动赋值, 值默认为{}, 即用为原型对象 实例对象的__proto__: 在创建实例对象时被自动添加, 并赋值为构造函数的prototyp

2401_84976527的博客 852

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度解析 JavaScript:赋予 Web 灵魂的“全栈语言”

JavaScript 绝非一门简单的脚本语言,它的底层蕴含着深邃的计算机科学与语言哲学。从基础的语法糖到复杂的内存管理,从浏览器的单线程约束到 Node.js 的全栈拓展,掌握 JavaScript 就是掌握了一把开启现代数字世界大门的万能钥匙。对于开发者而言,真正的进阶始于对每一行代码背后运行机制的敬畏与追问。保持好奇,持续探索,方能在 JavaScript 的星辰大海中乘风破浪。

2602_95057108的博客 173

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【2021 第二期】简而不单,单而不简的执行上下文

大伙儿好~,我是小鹿,公众号:「小鹿动画学编程」 原创作者。 2021 第二期。 想必大伙儿看到本期的标题很有疑惑,为什么是简而不单,单而不简的执行上下文呢?我来先解释一下,对于 javaScript 上一些抽象的概念,我们可以把它讲的非常复杂,也可以把它讲的极其简单,更可以把它讲的既复杂又简单。 嗯~ 最近重新回顾了这些抽象的概念,发现有些概念之前并不能很好的融会贯通,所以把这些相对抽象难以理解的概念作为几期文章来写。 不妨打开在谷歌搜「执行上下文」关键词,几篇相对排名靠前的优秀文章回呈现出来。 .

小鹿动画学编程 616

「JavaScript进阶」一文吃透执行上下文和执行栈

前言 学习 JavaScript ,理解其内部执行逻辑是很重要的,今天这篇文章就来讲讲 JavaScript 执行上下文和执行栈。 JavaScript 系列文章:JavaScript进阶 什么是执行上下文和执行栈? 执行上下文 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念。 有全局执行上下文、函数执行上下文、Eval 函数执行上下文三种执行上下文类型。 类型 定义 全局执行上下文 Global code - 首次运行程序时创建的默认环境 函数执

荣荣 365

js总结篇下(看完你就学会整个js——进阶篇)

1.数据类型 # 数据类型 ## 基本(值)类型 * string: 任意字符串 * number: 任意数字 * boolean: true/false * undefined: undefined * null: null ## 对象类型 * object: 基本对象类型 * function: 特殊对象, 可以执行 * array: 特殊对象, 可通过下标执行, 内部有序 判断数据类型 * typeof 返回数据类型的字符串表达 可以判断数值, 字符串, undefined

Sakura1921的博客 317

JavaScript 作用域与作用域链:变量访问的底层规则

本文解析 JavaScript 作用域与作用域链,及与执行上下文的关联。作用域分全局、函数、块级,是变量访问范围(静态);作用域链是变量查找路径。二者与动态的执行上下文配合,共同支撑代码运行,影响变量访问规则。

ik_makabaka的博客 947

前端工程师成长路径:从HTML新手到全栈实践者

Web前端开发是一门融合界面构建、交互逻辑与系统思维的工程实践。其核心原理在于理解浏览器渲染机制、JavaScript执行上下文及前后端协同模型;技术价值体现在将抽象需求转化为可维护、高性能、跨终端的用户界面;典型应用场景覆盖企业官网、H5营销页、移动Web App及中后台系统。在真实项目压力下,开发者需经历HTML/CSS基础夯实、原生JS底层认知、组件化造轮子、服务端能力拓展、移动端深度适配等关键阶段——这些并非线性进阶,而是能力维度的螺旋上升。本文以一位普通前端工程师六年真实成长轨迹为样本,拆解可验证

diaozhiwa5526的博客 395

理解Javascript中的执行上下文和执行栈

前言 本文3356字,阅读大约需要9分钟。 总括: 本文深入的讲解了Javascript中的执行上下文和执行栈。 原文地址:Understanding Execution Context and Execution Stack in Javascript 公众号:「前端进阶学习」,回复「666」,获取一揽子前端技术书籍 流水在碰到底处时才会释放活力。 正文 如果你是或者想成为一名Java...

前端小渣 834

JavaScript进阶之执行上下文和执行栈

js引擎的执行过程 执行上下文和执行栈属于js引擎的执行过程的预编译阶段。 执行上下文(Execution Context) 执行上下文是当前 JavaScript 代码被解析和执行时所在环境的抽象概念。可以理解为当执行代码时做的准备工作。 执行上下文按照运行环境被分成三类: 全局执行上下文(JS代码加载完毕后,进入代码预编译即进入全局环境) ...

aoqiaozao4482的博客 184
上一篇: 【JS基础】DOM和BOM
下一篇: 【JS进阶】this指向
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值