前端面试复习3---异步与 promise

小米前端面试、字节跳动前端面试、百分点前端面试-面试总结 百分点 一面: 二面: 阅读详情

异步与 Promise

计算机原理:进程与线程

  • 进程:CPU 资源分配的最小单位
  • 线程:CPU 调度的最小单位
  • 解读:每一辆车代表我们日常用的每个程序,洗车场代表电脑的内存空间。每个停车位就代表了每个进程,小轿车占用小车位,大巴车占用大车位,等同于每个应用程序也会根基自身的需要的运行内存,分配不一样的进程空间。每个洗车工人代表一个线程,一个洗车位可以用多个洗车工人在干活,例如:洗车外面的,清理内饰的同时在进行;等同于一个应用程序的进程空间可以多个线程在同时干活,例如:网易云音乐,在播发音乐的同时,你还可以发表评论。同一个洗车位内的工人可以共用这个洗车位内的所以工具资源,同一个进程内的线程共用这个进程内的资源空间。一个车位至少一位洗车工,一个进程至少一个线程。

[外链图片转存中…(img-Bgpf0KIE-1692330469647)]

面试题:浏览器新开一个窗口,是进程还是线程?

  1. 答案:进程,从区别概念回答
  2. 发散 1:窗口(进程间)通信怎么通讯?storage、session、cookie => storage、cookie 的区别? => 怎么样操作 cookie,前端操作 cookie 有什么风险?=> cookie 的应用场景?
  3. 发散 2:浏览器原理?

浏览器原理-网页

  1. GUI 渲染线程:
    1. 解析 HTML CSS 构建 DOM 树->布局->绘制
    2. 与 JS 引擎线程互斥,当执行 JS 引擎线程时,GUI 渲染会被挂起,当任务队列空闲时,主线程才回去执行 GUI
  2. JS 引擎线程:
    1. 处理 JS,解析执行脚本
    2. 分配、处理、执行了待执行脚本同时,处理待执行事件,维护事件队列
    3. 阻塞 GUI 渲染。js 为何会阻塞 GUI 渲染:因为网页是单线程的,js 执行的时候,渲染会被挂起。
  3. 定时器触发线程:
    1. 异步定时器的处理和执行 - setTimeout / setInterval
    2. 接收 JS 引擎分配的定时器任务,并执行
    3. 处理完成后交于事件触发线程
  4. 异步 HTTP 请求线程:
    1. 异步执行请求类操作
    2. 接收 JS 引起线程异步请求操作
    3. 监听回调,交给事件触发线程做处理
  5. 事件触发线程:
    1. 接收所有来源的事件
    2. 将回调的事件依次加入到任务队列的队尾,交给 JS 引擎执行

event loop

事件循环(Event Loop)是 JavaScript 的执行机制之一,用于管理和调度异步任务的执行顺序。

事件循环的核心思想是基于一个事件队列(Event Queue)和一个调用栈(Call Stack)来实现。当 JavaScript 引擎执行代码时,同步任务会被直接放入调用栈中执行,而异步任务则会被放入事件队列中等待执行。

事件队列中的任务分为宏任务(macrotask)和微任务(microtask)两种类型。

当调用栈为空时,事件循环开始执行。首先,事件循环会将队列中的微任务一次性地全部取出并执行完毕,然后检查浏览器是否需要进行页面渲染。接下来,事件循环会从宏任务队列中取出一个任务,并放入调用栈中执行。当宏任务执行完毕后,再次执行微任务,然后重新渲染页面(如果需要),继续循环这个过程。

通过事件循环的机制,JavaScript 可以实现非阻塞的异步编程,使得程序能够同时处理多个任务,并提高了程序的响应性和性能。同时,了解事件循环的原理也有助于我们更好地理解 JavaScript 的执行过程,并编写出更高效的异步代码。

微任务与宏任务

宏任务(macro-task)和微任务(micro-task)是指在 JavaScript 执行过程中,不同类型的任务分类。

宏任务通常包括以下几种类型:

  • 渲染事件(如页面加载、重新渲染)
  • 用户交互事件(如点击、滚动)
  • 定时器事件(如 setTimeout、setInterval)
  • 网络请求完成、文件读写完成等 I/O 操作的回调
  • 执行整体的 JavaScript 代码(同步代码)

而微任务则包括以下几种类型:

  • Promise 的 resolve 回调函数
  • MutationObserver 的回调函数

在事件循环中,当一个宏任务执行完毕后,事件循环会检查微任务队列,并将其中的所有微任务连续执行,直到微任务队列为空。这意味着,微任务会在当前宏任务执行结束后立即执行,而不会等待下一个宏任务。

具体来说,当浏览器遇到一个宏任务时,它会进入宏任务队列,并等待执行。而当浏览器遇到一个微任务时,它会立即执行,并将所有产生的新的微任务加入微任务队列中。

通过合理利用微任务,我们可以在宏任务的执行间隙执行一些高优先级的任务,从而提高页面的响应性和交互性。常见的应用场景是使用 Promise 进行异步操作,并在操作完成后立即执行相关的处理逻辑。

总结来说,宏任务表示较为宏观的、需要较长时间才能执行完毕的任务,而微任务则表示较小粒度、需要快速执行的任务。掌握宏任务和微任务的执行顺序和使用场景,可以帮助我们更好地处理异步代码和优化程序性能。

event loop 基本过程

  1. 初始化阶段:事件循环从全局上下文开始,并执行同步代码。任何遇到的异步任务将被放入相应的任务队列中。
  2. 宏任务阶段:执行异步任务队列中的微任务。
  3. 渲染阶段:如果 DOM 被改变,渲染 DOM。
  4. 宏任务阶段:在微任务阶段结束后,事件循环会从宏任务队列中选择一个任务。这个任务将被推送到调用栈中执行,直到任务执行完毕。
  5. 重复循环:重复进行微任务阶段、宏任务阶段和渲染阶段,直到没有更多的任务。

这就是事件循环的基本过程,它通过不断地处理微任务和宏任务,以及渲染阶段的操作,使得 JavaScript 能够处理异步任务并保持页面的响应性。注意,这只是一个简化的描述,实际的事件循环机制可能会有更多的细节和特殊情况。

存放
存放
拥有
拥有
拥有
拥有
拥有
拥有
执行
执行
执行
所有微任务执行完后执行
event loop
event loop
同步代码
微任务队列
宏任务队列
微任务 1
微任务 2
微任务..
宏任务 1
宏任务2
宏任务..
微任务队列被全部执行
DOM如果被改变就重新渲染

上面整个流程图就是 event loop 的流程,在执行宏任务 1时会继续产生一个这样的 event loop 流程,直至宏任务 1被执行完,然后执行宏任务 2再产生这样的 event loop 流程,直到所有宏任务执行结束

执行栈/调用栈示例 demo

function fn2() {
   
   
  throw new Error('抛出一个错误')
}
function fn1() {
   
   
  fn2()
}
function run() {
   
   
  fn1()
  console.log('fn2抛出错误后,这里已经不执行了')
}
run()

// 执行栈后进先出
// 执行栈:run->fn1->fn2
// 执行完成顺序:fn2->fn1->run
// 先执行完成fn2再往下执行fn1,执行完成fn1再往下执行run,因为fn2报错了,所以fn1和run都无法往下执行完成

面试题 1:死循环

js 堆栈执行顺序与堆栈溢出/ 爆栈 / 性能卡顿 / => js 性能优化

死循环例子:

function fn() {
   
   
  fn()
}
fn()

正确情况下不会写出这样的死循环,如果在 vue 的 computed 中, 对某个和 computed 有关系的的变量进行复制就会造成这样的死循环。
例如:

{
   
   
  data() {
   
   
    return {
   
   
      bbb: 222,
      ccc: 333,
    }
  },
  computed: {
   
   
    aaa() {
   
   
      this.bbb = 111
      return this.bbb + this.ccc
    }
  }
}

面试题 2:执行顺序

setTimeout(() => {
   
   
  console.log('setTimeout') // 5. 宏任务2
})

new Promise((resolve, reject) => {
   
   
  console.log('new Promise') // 1. 属于同步进入主线程 宏任务1
  resolve()
})
  .then(() => {
   
   
    console.log('Promise then') // 3. 微任务1
  })
  .then(() => {
   
   
    console.log('Promise then then') // 4. 微任务2
  })

console.log('hi') // 2. 同步代码 宏任务1

解题思路:任务维度

promise 有哪些状态?

  1. pending/待处理的, fulfilled/满足的, rejected/被驳回的
  2. executor: new Promise() 的时候立即执行,接收两个参数 resolve, reject

promise 的默认状态是什么?状态是如何流转的?

  1. 默认:pending
  2. 状态流转:pending => fulfilled | rejected

手写 Promise

Promise 规范

  1. Promise 实例有三个状态: pending fulfilled rejected,默认状态为 pending
  2. 状态只能从 pending 向 fulfilled | rejected 流转
  3. Promise(executor) 接收一个参数 executor
  4. executor(resolve, reject) 是同步执行的,同时接收两个两个参数 resolve reject
  5. resolve(value) 成功的回调,接收一个任何类型的参数作为成功的返回值,执行 resolve(value) 会把实例的状态变为 fulfilled
  6. reject(reason) 失败的回调,接收一个参数通常是字符串作为失败的原因,执行 reject(reason) 会把实例的状态变为 rejected
  7. 实例内部需要有一个 result 属性,用来存储 resolve(value) reject(reason) 传进来的的 value 或 reason
  8. Promise 的 then(onResolved, onRejected) 方法接收两个参数 onResolved, onRejected,目的是为了可以拿到内部的 result
  9. 当状态为 fulfilled 时执行 onResolved,result 为 resolve(value) 传进来的 value
  10. 当状态为 rejected 时执行 onRejected,result 为 reject(reason) 传进来的 reason
  11. then 返回的是一个 Promise 实例,这个实例的状态是由 onResolved onRejected 的返回结果决定的,onResolved onRejected 的返回结果不是一个 Promise 实例时,then 方法都会返回一个状态为 fulfilled 的 Promise 实例, onResolved onRejected 的返回结果是一个 Promise 实例时,这个 实例的状态就是 then 方法返回实例的状态
  12. Promise 的 catch(onRejected) 方法接收一个参数 onRejected
  13. catch 返回的同样是一个 Promise 实例,这个实例的状态是由 onRejected 的返回结果决定的

1. 基本框架

class Promise {
   
   
  // 用静态属性定义三个状态,方便后面使用
  static PENDING = 'pending'
  static FULFILLED = 'fulfilled'
  static REJECTED = 'rejected'

  constructor(executor) {
   
   
    this.result = undefined // 存储 resolve(value) reject(reason) 传进来的的 value 或 reason
    this.state = Promise.PENDING // 默认状态为 pending

    const resolve = (value) => {
   
   
      if (this.state === Promise.PENDING) {
   
   
        this.state = Promise.FULFILLED
        this.result = value
      }
    }

    const reject = (reason) => {
   
   
      if (this.state === Promise.PENDING) {
   
   
        this.state = Promise.REJECTED
        this.result = reason
      }
    }

    // 这里用 try catch 是为了解决像 p3 的情况,在 executor 实参的函数体中有报错
    try {
   
   
      executor(resolve, reject)
    } catch (error) {
   
   
      reject(error)
    }
  }
}

const p1 = new Promise((resolve, reject) => {
   
   
  resolve('test')
})
console.log(p1)

const p2 = new Promise((resolve, reject) => {
   
   
  reject('test')
})
console.log(p2)

const p3 = new Promise((resolve, reject) => {
   
   
  throw 'test'
})
console.log(p3)

2. 添加 then 方法

class Promise {
   
   
  static
2020年前端面试复习必读精选文章【赠复习导图】 前言 之前写过一篇 一年半经验如何准备阿里巴巴前端面试,给大家分享了一个面试复习导图,有很多朋友说希望能够针对每个 case 提供一个参考答案。 写答案就算了,一是精力有限,二是我觉得大家还是需要自己理解总结会比较好。 给大家整理了一下每个 case 一些还算不错的文章吧(还包括一些躺在我收藏夹里的好文章),大家可以自己看文章总结一下答案,这样也会理解更深刻。 并不是所有文章都需要看,希望是一个... 阅读详情

相关推荐

前端面试知识点复习(持续更新)

前端全自学小白周一收到周三面试通知,情急之下的佛脚一则。 html html5的新特性 html5总的来说比html4多了十个新特性,但其不支持ie8及ie8以下版本的浏览器 语义标签 标签 描述 0302183817629.png) 增强型表单 视频和音频 Canvas绘图 SVG绘图 地理定位 拖放API WebWorker WebStorage WebSocket ...

weixin_43483930的博客 667

前端技能树,面试复习第 54 天—— 手写代码:情景题

前端修罗场提供全网最专业的前端优质文章与社区服务,为应届生,初中级前端工程师提供全面、优质的面试服务、技能提升、职场解惑服务!内容包含:前端面试辅导,前端面试题,前端交流,前端答疑,前端基础知识,前端知识体系,技能树搭建,Javascript,CSS,CSS3,HTML,React,Vue,小程序,前端简历,职业交流,远程工作,英文交流,英文提升,外企,互联网,国企,大厂,牛客面试题,掘金面试题,面经,优质前端文章分享...

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 981

2023前端大厂面试题之JavaScript篇(1)

js中的同步和异步 异步编程的实现方式 回调地狱 JavaScript this 关键字 JavaScript中基本数据类型和引用数据类型的区别 原型 原型链 原型链面试题 原型继承 防抖和节流 宏任务与微任务 宏任务与微任务面试题......

zag666的博客 6649

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 253

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9740

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 769

固定翼飞行器建模(一)——六自由度动力学

前两期文章讲完了气动力和气动力矩的模型,本期将来讲解一下六自由度部分的动力学与运动学方程。

2302_80148937的博客 1万+

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 103

协方差矩阵

对两个类内协方差矩阵进行对角化,可以将它们变换为对角矩阵。这个过程可以通过对每个协方差矩阵进行特征值分解来实现,从而得到它们的特征向量和特征值,进而得到它们的对角矩阵形式。这个过程的意义在于,它可以帮助我们找到一个新的坐标系,使得在这个坐标系下,每个特征之间都是独立的,从而简化了计算。具体来说,当我们使用对角协方差矩阵作为特征向量的坐标系时,它意味着每个特征之间都是相互独立的,从而方便了进一步的分析和处理。在实际应用中,对角化协方差矩阵可以用于降维、特征选择和分类等任务。

m0_55196097的博客 1万+

5G 模组 FM650 USB模式查询及网络配置

完成以上配置后,5G模组可进行搜网,入网成功后,上位机获取 5G IP。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 1312

详细指南:如何在TI C2000基于C28x的微控制器上部署FreeRTOS_C语言实现

FreeRTOS是一个小型、开源、实时的嵌入式操作系统内核。它为多种微控制器和处理器提供了支持,包括ARM、AVR、MSP430和PIC等。小型和轻量级:适合资源受限的嵌入式系统。实时性:可以满足严格的实时要求。多任务支持:支持多任务并发执行。内存管理:提供了多种内存管理策略。模块化设计:用户可以根据需要选择所需的功能模块。TI C2000系列微控制器是专为实时控制应用设计的。高性能C28x核:提供了高速的浮点运算能力。丰富的外设:包括PWM、ADC、DAC、通信接口等。低功耗。

qq_38334677的博客 1600

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 前端面试复习2---面向对象编程/原型及原型链
下一篇: 前端面试复习4---JS 模块化基本认识
ChycoSmile
博客等级 码龄10年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值