TensorFlow笔记5-—优化手写数字识别模型之优化器

什么是优化器(Optimizer) 神经网络越复杂 , 数据量越大 , 我们需要在训练神经网络的过程上花费的时间也就越多. 原因很简单, 就是因为计算量太大了. 可是往往有时候为了解决复杂的问题, 复杂的结构和大数据又是不能避免的, 所以我们需要寻找一些方法, 让神经网络聪明起来, 快起来。那些可以加速神经网络训练的方法就叫做优化器(Optimizer) 推荐阅读:加速神经网络训练 (Speed Up Training) 常见的优化器 这个部分的理论知识实在太多了,我简单的整理了一点点,详见机器学习:各种优化器Optimizer的总结与比较 下面是TensorFlow中提供的相关优化器的API ...

plainify

一个科班小前端的大厂面经

「跟我来面试」系列的第一篇文章是关于前端的,发出后看到有读者反馈说内容较少,问的问题比较基础。因为博主是后端的,前端方面并不是非常了解,所以我找到了同组的小伙伴,让他分享一下自己春招时的一些经历。 他和我是同一个实验室的,就叫他 x 吧,目前研一,两年制硕士,今年实习。x 的本科前半段迷茫在科班的基础理论学习和课程作业中,大一大二对前端一无所知,没想关心太多,只想保研就好。大二暑假参加一项学校项目,机缘巧合接触到了前端,发现软件工程还有很多值得探寻的地方。大三时他的保研形势已定,于是参加各种比赛,摸索自己的兴趣所在,终于在一系列比赛中尝到了前端的甜头,于是决定正式入坑,带着起初“前端能让页面好看”这般粗浅好笑的见识,打开新世界,一步步丰富自身。终于在这次春招中取得了一些小成果: 网易雷火三轮技术+HR,拿到 offer。 字节跳动教育业务三轮技术+HR,拿到 offer。 美团两轮技术,leader 给了口头 offer。 阿里淘系目前三面结束,被大 leader 全方位调教,拿到 offer 腾讯 PCG 到第四面,战线很长,后续没有继续面腾讯,淘系 offer 拿到后就推掉了这里。 说实话,你可能不知道花一个月时间拿到 4 个大厂 offer 是什么体验,我们一般都管这种人叫“offer 收割机”。 在这里分享下面经,附带他的简要回答和思考。对于基础问题,大家可以查漏补缺,建议收藏;对于场景或者高层思考型问题,大家参考即可,这些都是面试官根据自己部门或每个人的履历定制的。轮次越多,问题也就越偏向高层,需要大家更多的总结思考,找到平衡,甚至再生产。 点击文章底部**「阅读原文」,即可查看他的个人主页。以下是他的整理,篇幅较长,建议大家收藏**,方便复习 👇 网易雷火三轮技术+HR 一面 一面一般都是基础,在回答问题的基础上,最好能主动发散广度深度,面试官印象会很好。 介绍下自己并聊聊项目。 这个因人而异,要大方得体,讲出重点。主要围绕项目是什么,为何要做这个项目,解决了什么痛点,你在其中负责了什么工作,遇到并解决了什么问题,如何和不同模块合作,把控了多少架构。后两点需要一定思考和积累,把前面的讲清楚能满足一些面试官,但是大厂面试官常常会希望你说一些架构和整体方面的理解,是加分项。 如何用 await 和 async 写一个睡眠函数? function sleep(time){ return new Promise(function(resolve,reject){ setTimeout(()=>resolve('over'),time); }); } async function run(time){ let result = await sleep(time); console.log(result); } run(3000);复制代码 说说 inline 元素和 inline-block 元素的区别。 CSS 基础题,我从布局方面不换行和尺寸方面 inline 设置宽高无效,inline-block 可以来讲,还发散了一些 CSS 元素体系讲了讲。 inline 元素的 margin 有用吗? 是一个很刁钻的切入口,大家常常忽略对 inline 元素的研究,还好我平时比较喜欢捣鼓 CSS,其实再默认水平方向的文档下,设定水平方向 margin 是有效的,垂直方向无效。 讲讲 html 如何添加事件监听,事件处理有哪些阶段? 添加事件监听很简单,document.addEventListener 就能直接来,事件阶段按时间顺序有捕获,目标,冒泡三段。 说出三个你知道的不常用的 html 标签。 一般都问那些常用的,结果面试官反其道行之,很佩服。当时只答出<iframe><strong><i><audio>,可以百度一下,其实有很多。 二面 因为我 React 技术栈比较多,所以这方面问题也多,大家按需食用。 ...

plainify

一次跨域问题的分析

事件起因 一个需求让我开放一个 HTTP 接口给前端,在联调的过程中,前端请求时出现了一个 CORS 错误,也即跨域问题,错误如下 👇 一开始我的想法是,跨域问题,这我熟啊,在学校写代码的时候就经常遇到,这解决起来不是分分钟的吗。 可更改之后我傻眼了,为什么一直不生效?我陷入了沉思。 在继续描述之前,我们先来了解下到底什么是跨域以及常见的解决方案有哪些。 什么是跨域 所谓跨域,全称是 跨源资源共享 (CORS) Cross- Origin Resource Sharing ,是一种基于 HTTP Header 的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),这样浏览器可以访问加载这些资源。 举个例子:运行在 https://domain-a.com 的 JavaScript 代码使用 XMLHttpRequest 分别发起两个请求 👇 请求A: https://domain-a.com/query 请求B: https://domain-b.com/query 由于发请求的页面站点为 domain-a.com,所以请求 A 属于同源请求,domain-a.com 的后台服务器是允许请求。但是请求 B 的站点域是 domain-b.com,如果要发请求到 domain-b.com,就属于跨源访问,出于安全性考虑,浏览器限制脚本内发起的跨源 HTTP 请求。如下图所示: 因此,为了解决上述问题,跨源域资源共享( CORS )机制就应运而生了。该机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。 CORS 工作机制 跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。 而且对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。 只有在服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。 ...

plainify

一统江湖?——Flutter for All Screens初体验

前言 2018 年 2 月 27 日,Google 发布了 Flutter 的第一个 Beta 版本,由于自己是一个 Google 粉,所以很快就下载尝鲜了,之后还在简书上发过一篇博客《你好,Flutter》,是我的第一篇阅读量过 10w 的文章。在学习 flutter 期间也做过一些零散的笔记,但由于当时觉悟不高,并没整理成册,而且当时正准备保研,手头事情很多加上可学习的资料很少,中途便放弃了。 机缘巧合,最近阅读到了一篇谷歌开发者的文章《Flutter: a Portable UI Framework for Mobile, Web, Embedded, and Desktop》,说是现在的 Flutter 已经可以运行在 Android、ios、MacOS、Linux、Windows 和嵌入式设备上了。在好奇心的作祟下,我尝试着利用 Flutter 在一些平台上运行了一些 demo,本文便是记录我利用 Flutter 实现了移动端、桌面端和 Web 端的过程,由于移动端应用的 demo 网上教程很多,所以本文尽快略过,重点将放在桌面端和 web 端。 Flutter for Mobile 初次了解到 Flutter 的时候便是一个横跨 iOS 和 Android 两个平台的框架,无论是在 Mac/Linux 还是 Windows 上搭建 Flutter 的开发环境都很简单,Windows 上的环境搭建可以参考这篇文章 👉《安装搭建 Flutter 环境》,Mac/Linux 可以参考中文官网给出的教程 👉《安装和环境配置》 如果你在中国的网络环境下使用 Flutter,注意一定要按照要求设置好两个环境变量 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn 配置好 Flutter 开发环境后,我们通过 Android Studio 新建一个 Flutter 项目,然后启动 iOS/Android 模拟器,选中要运行的模拟器,直接运行 Flutter 项目即可。运行结果如下: ...

plainify

不是总结的年终总结

年底照例要写一篇总结,从 12 月初我就说要写,如今都要元旦了,我还没想好写什么。往前翻了翻,前两年的总结更像是陈列了自己一年所做的事,等开始回顾今年,才发现整个人仿佛停滞了,竟没有什么值得总结的事情。既然这样,就趁着这个机会好好吐槽一下自己吧。 我是 2018 年开始写的总结,那是我人生重要转变的一年,那年我 20 岁。也是那一年,我开始变的上进,开始不断尝试自己的上限。如今 3 年过去了,我的各项能力确实有了提升,现在的我控制得了自己的体重,能静下心看几个小时的书,可以一个人悠闲的听歌、扫街拍照,也不会和以前一样羞于和女生交谈。最重要的是,我变强了,头还没秃。 而今年是我三年计划的最后一年,对我来说是既平凡又不平凡的一年。疫情对这个国家有很大的冲击不假,但对我而言,受到的冲击可能并没有那么大。年初在家不让出门,刚好给我了安心学习、健身的机会;美股熔断对我这个不炒股、偶尔玩玩基金的人来说鲜有影响;年初火起来的网课刚好给了我安心准备春招的机会,毕竟只要登入会议系统就不会算你翘课。这么一看这一年太过平淡,1 月过年、2、3 月准备春招实习、4、5 月在家躺着,6、7、8、9 在外实习提前体验社畜生活,10、11、12 月忙活毕设、论文。一眨眼,一年就到头了。 可真有这么好吗? 今天我翻了翻我 2018 年的总结,虽然这两年我的文笔依旧没什么变化,但可以真切的感受到那一年的自己是一个多么积极乐观的人。然后到了 2019 年,我给自己的评价是**「想法太多,行动太少」,但总归是积极向上的一年。2020 这一年,我给自己的评价是「被自己安排的明明白白」。**这一年我依旧按照给自己设置的条条框框去做事,去阿里实习、定时更文、写代码做东西,仿佛一切都井然有序,不曾变化。 yoga 之前问过我,你这样像 todo list 一样一件一件去安排自己,就像完成任务一样,做事情是,谈恋爱也是,不会很累吗?我当时的回答是不会,因为这几年我认为井然有序的生活会避免自己犯错的可能。可最近发生的一些事情让我有些崩溃,我想变得更优秀,这没什么错,只是我忘了,在追求的过程中,有期待就会有遗憾,有的遗憾可以坦然面对,有的遗憾却会让你花一辈子时间去后悔。听起来很可惜,却也无能无力。 害,写了这么多字都不知道自己在写什么,现在看看,这篇文章可能就和我这一年一样真的没什么好看的吧。 GitHub 提交 282 次,上半年准备春招、中间忙着实习,码代码的时间都集中在今年的后半段了,不多不少。 公众号涨粉 1500 左右,和去年基本一致,对于公众号我没什么想说的,目下高质量的公众号越来越少,虽然感觉什么公众号粉丝都比我多,但我还是想按照自己的思路走下去,争取每篇都是高质量的原创文章。 目前掘金的年度报告还没出,自己也懒得统计了,就用简书的代替一下。 在浏览了几个 APP 的年度报告后,我终于明白了,原来我的 2020 只是 2019 的延续罢了。这一年在我身上并没有发生任何新鲜事,反倒被前几年犯下的错误反噬,我想我这一年的不快乐也是源于此吧。 朋友们都说我是凡尔赛本赛,毕竟我有很多别人羡慕不来的东西,只是于我而言,现下我所得到的并不能减少遗憾给我带来的痛苦。很快我就要开始新的人生旅程了,2021,希望可以收起自己的凡尔赛,正视心中所想,回到三年前快乐的自己,也希望老天眷顾,让我不再留有遗憾。 这篇文章与其说是总结倒不如说是对自己的一个反思,因此也没有发在首页,如果你看到这里,非常感谢,我用我的好运气祝你在新的一年里可以牛气冲天 🐂。

plainify

为了更好的运营,我剖析了某公众号的数据

完整源码可在公众号:「01 二进制」后台回复:「公众号数据分析」获取 1. 前言 在同学的影响下,我在 18 年 9 月注册了一个公众号「01 二进制」,因为种种原因(其实就是懒)直到 11 月 11 日才在这个公众号上发布了第一篇文章。到写这篇文的时候,我已经发布过 21 篇文章,用户也只有 86 人,这不禁引发了我深深的思考。为啥我的公号没有用户? 为此我还特地请教了我的好友 🐔 哥,他告诉我,文笔是一方面,另一方面还要能抓住热点,说完便给我发了一份某知名公众号的相关数据,让我给安排安排。 这不,一分析才发现原来想让公众号有阅读量也是要讲究套路的,接下来就让我们以一个 coder 的角度去分析下究竟是哪些套路吧。 2. 分析目的 笔者在本项目中的分析目的主要有 3 个: (1)对某知名公众号内容运营方面的若干分析,主要是对发文量、点赞量、发文时间等方面的描述性分析; (2)通过对标题的分析,来说明什么样标题更受人喜欢; (3)将冗杂无序的结构化数据和非结构化数据进行可视化,展现数据之美。 3. 实验环境 工欲善其事,必先利其器,在开始分析之前,我先说明此次分析所处的实验环境,以免出现异常: MacOS 10.14.3 Python 3.6.8(Anaconda) Visual Studio Code(开发) Jupyter Notebook(调试环境) 使用的包有: pkuseg(分词) pyecharts(绘图) numpy(数学计算) pandas(数据计算) 4. 数据获取及预览 4.1 数据获取 本次数据集是通过网络爬虫爬取某公众号的所以文章整理而成,该部分不进行阐述,需要数据集可以直接下载源码查看或者在公众号:「01 二进制」后台回复:「公众号数据集」获取。 4.2 数据预览 在该项目中,我使用了 Pandas 进行数据的读取和预览,Pandas 在数据科学中使用非常广泛,有兴趣的小伙伴可以去搜索相关资料了解下。 数据预览代码如下: import pandas as pd # 读取数据集 df=pd.read_excel('data/data.xlsx') # 显示前五行数据 df.head() 此次的数据集长下面这样 👇: ...

plainify

为了预测股票,我用TensorFlow深度学习了股市数据

完整源码可在微信公众号:「01 二进制」后台回复:「股市分析」获取 阅读此文前建议先阅读《找对象的过程中,我竟然理解了什么是机器学习!》 前言 相信大家这几天或多或少的都开始关注到股市了,虽然我还不是很懂里面的一些套路,但是从最近各个公众号的推送里面,我也看到最近的股市确实是形势大好。对很多人来说,股票就和房价一样,他的升与降牵动着众多人的心。这几天很多 qq 群、微信群都开始讨论起股票了,各位坊间大神也纷纷开始预测各种股票走势了。 股票价格是典型的时间序列数据(简称时序数据),会受到经济环境、政府政策、人为操作多种复杂因素的影响,所以说股票价格预测是一件非常唬人的事情。但是基于历史数据,以股票价格为例,介绍如何对时序数据进行预测,仍然值得一做。 不过今天我们不聊股市,因为我也不是很懂,今天我们来聊聊我们知道的东西。如今深度学习在金融市场的应用越来越广泛,我们能否利用已有的历史数据通过深度学习的方式来进行预测呢? 准备工作 答案自然是可以的,虽然我们无法非常准确的进行预测,但是作为一个深度学习入手的项目是完完全全可以的。 实验环境 老样子,以免出现因环境导致的问题,先将实验环境列出: MacOS 10.14.3 Python 3.6.8(Anaconda) Jupyter Notebook 使用的包有: TensorFlow Keras matplotlib pandas 数据 此次实验,我们采用STATWORX的S&P 500股价数据,该数据集爬取自 Google Finance API,已经进行过缺失值处理。他们的官方网站是:https://www.statworx.com/。 数据集可在微信公众号:「01 二进制」后台回复:「股市数据集」获取 数据预览 在这里我们还是使用 pandas,主要用于数据清洗和整理 import pandas as pd data=pd.read_csv('data/data_stocks.csv') data.info() 执行data.info()可以查看特征的概要: <class 'pandas.core.frame.DataFrame'> RangeIndex: 41266 entries, 0 to 41265 Columns: 502 entries, DATE to NYSE.ZTS dtypes: float64(501), int64(1) memory usage: 158.0 MB 从上述结果可知:该数据集数据共 502 列,41266 行,502 列分别为: DATE:该行数据的时间戳 SP500:可以理解为大盘指数 其他:可以理解为 500 支个股的股价 查看数据的前五行 ...

plainify

为什么不在 for 循环里捕获异常?

在回答标题这个问题之前,我们先试想一下,在没有 try…catch 的情况下,如果想要对函数的异常结果进行判断,我们应该怎么做? 异常 第一个想法肯定就是 if…else 了,一般情况下,相关的代码段我们都是放在一起的,如果此时你的程序中有大量的代码段要做这做判断,这就意味着后面执行的逻辑会依赖你前面语句的执行情况,也就意味着你每调用一个可能会出现错误的函数的时候,都要先判断是否成功,然后再继续执行后面的语句。这就会导致你的代码中会充斥着大量的 if…else。 Java 是一门工程性的语言,而工程也是一种艺术,因此采用这样的做法显然是很不优雅的。《Thinking in Java》中提到“badly formed code will not be run.”,意思是结构不优雅的代码不应该被执行,于是一个适用于 Java 的异常处理机制便应运而生了。 Java 的异常处理其目的在于通过使用少于目前数量的代码来简化大型程序,举个简单的例子 🌰 不用 try…catch FileReader fr = new FileReader("path"); if (fr == null) { System.err.println("Open File Error"); } else { BufferedReader br = new BufferedReader(fr); while (br.ready()) { String line = br.readLine(); if (line == null) { System.err.println("Read Line Error"); } else { System.out.println(line); } } } 用了 try…catch ...

plainify

为什么我们需要批量操作?

背景 实习的时候被问过一个问题,为什么 redis 会有 pipline,mysql 会有 batch,这些东西都具有批量操作的共性,是什么原因让我们在处理数据时需要批量操作? 这么说可能有些抽象,举一个和 API 调用有关的例子 🌰: 现有三个服务 service A、service B 和 service C。因业务需要,我们需要在 service A 中调用 service B 获取一组 id,然后根据 id 从 service C 中读取最终内容。然后组织成结果返回前端。由于 service C 只提供了单个 id 查询内容的 API,所以如果我们想要获取批量的信息,最先想到的办法是通过 for 循环多次调用 service C。但是这样的办法是极其不优雅的,接下来我们从以下两个方面来分析。 网络通信 鉴于现在的分布式架构,每个 service 都分布在不同的服务、不同的机器中,所以我们每次调用都要通过 RPC 来实现,这就要求我们不得不构造同等数量的请求来获取数据。这样就会导致了一些效率问题。如下图所示: 所以我们通常会通过在 service C 中提供一个批量查询的接口来解决多次通信的问题。如下图所示 👇 我们知道,并不是每一次网络传输都非常稳定,中途可能会遇到丢包等一系列问题,而用批量查询代替 for 循环单个查询,这样做的好处是,我们可以减少网络通信的次数,一定程度上可以增加整个系统的健壮性。 数据查询 解释完多次 rpc 调用可能造成的网络延迟的问题后,我们再往深一点的地方看。 一般情况下,数据都是存放在数据库中的,所以无论是单个查询还是批量查询,我们最终都是要访问到数据库的。 现假设,我们需要从数据库中查询一个 id 为 123 的用户信息,我们可以用类似下面这样的代码。 long id = 123; Person p = serviceA.getPersonById(id); 那如果我们需要查询一组 id 为 123、456、789 的用户信息,在没有批量查询接口的情况下,我们可以用 for 循环的方式实现: ...

plainify

为什么我建议你去写博客?

每次有学弟学妹问我如何学编程的时候,我都会在最后告诉他们最好写篇博客记录下。现在是 2020 年的 11 月,我自己写博客也已经有 3 年多了,零零散散也写了有 200 多篇了,虽然不如一些大佬写的多且快,但自己佛系更新倒也开心。刚开始写的时候,也没想着能坚持到现在,现在写了几年,渐渐也成了一种习惯,今后应该还会继续写下去。 维基百科对于博客的解释是: 博客(英语:Blog)是一种在线日记型式的个人网站,借由张帖子章、图片或影片来记录生活、抒发情感或分享信息。博客上的文章通常根据张贴时间,以倒序方式由新到旧排列。 说白了就是记录自己的一些想法、学习心得、总结之类的,主要还是看自己想写什么。 我是一个文笔很差的人,高考语文也是勉强及格,所以如果一开始你告诉我,我的文字将会对我产生很大的影响,我肯定是不相信的。直到后来本科学了软件工程之后,想着要整理一些自己的学习笔记,但是代码也不方便用纸记下来,这便开始有了用电脑做笔记的想法。当时的做法也很土,就是新建一个 word 文档记笔记,然后用一个文件夹收录,后来经学长提点,索性就把笔记整理到 csdn 上,这样就不用每次记笔记还要新建一个 word 文档了。 再之后,看到了阮一峰、池建强的博客网站,也学到了很多有用的知识,也萌生出弄一个自己的博客的想法。期间也尝试了很多,有在掘金、简书等第三方平台上发布博客,也自己玩了玩 wordpress、hexo 这样的自建博客,现在也算是确定了写作的位置,最终选择了自建博客(hexo)+掘金/简书/公众号的搭配。掘金和简书主要是发布一些技术性的文章,例如实战教程这些,公众号吹水的比较多,科普一些我学到的技术、聊一聊我的想法之类的,然后所有的这些都存放到我的自建博客中去。 之所以会选择 hexo 这种自建博客,一方面是因为他的颜值比较高(虽然 wordpress 也可以安装各种主题),只要下载别人的主题简单的配置下就可以弄出一个好看的博客了。另一个原因就是部署、同步相较于 wordpress 更加方便,hexo 是用 markdown 的形式进行写作,这样的好处就是我可以无缝迁移到简书、掘金、公众号等平台,而且和 wordpress 这种需要自己购买服务器的自建博客相比,hexo 可以依赖 GitHubPages 免费使用,这对于我这种白嫖党来说无疑是最好的选择。 其实写博客的这几年也有人问过我,你又不接广告,也没什么人打赏,还要花那么多时间来写博客,不觉得累吗?为什么还坚持写了几年? 说实话,写博客确实是很花时间的,但是我认为和单纯的学习笔记相比,博客是对笔记的又一种成体系的整理,一方面可以加深记忆,另一方面也方便日后的查找翻阅。 不仅如此,如果你的博客内容质量很高,在一定程度上是可以提高自己的影响力。在如今这个浮躁的社会,很多人的文章都是东拼西凑,如果你的内容有足够的深度,那么物以稀为贵,你会更加容易、持久的建立起自己的影响力。 而且就算你的文笔不够好,也可以在写博客的过程中锻炼自己的思维能力、知识储备能力,以及思维的严谨程度。我相信,在写作过程中得到的锻炼,对于你在其他领域的工作,依然会有所帮助。 功利点说,如果你的内容质量非常高,也是可以通过写作赚钱的。我们正处在一个“知识付费”的年代,写达人课、写书、写推广文、写公众号,这些赚钱方式不一而足。而且不同于工作,你在写作上所花费时间可以被多次售卖,你可以通过你的写作,构建出属于自己的**「睡后收入」**。 当然了,博客也不单单可以用来整理学习笔记,我时常会通过博客来帮助我探索、梳理和记录生活。写一篇博客所花费的时间,比整理笔记要多得多,但另一方面,我们又会浪费很多时间。坚持抽一些时间写一篇博客,一定程度上可以让自己学会管理时间,毕竟谁不希望可以成为一个“时间管理大师”呢? 以上就是我对于写博客这件事的一些简单想法,就个人而言,写博客的这几年,我的知识储备得到了提升,也获得了一些收入,还通过博客认识到了一些有趣的人。当然,如果你觉得你想说的东西不适宜让他人知道,其实也可以在自己的电脑里写,不用放到网上。但我还是强烈建议,每一个朋友(尤其是计算机专业),都应该有一个属于自己的 Blog,尝试将自己的生活和想法记录下来,留下一些印记,说不定未来的某一天你的博客就让你的人生有了一些变化,毕竟,我女朋友就是写博客认识的(逃)。