首页> 搜索结果页
"神经网络入门 知乎" 检索
共 46 条结果
如何用 TensorFlow 搞定知乎验证码;深层神经网络的致命问题详解 | AI 开发者日报
利用 TensorFlow 搞定知乎验证码之《让你找中文倒转汉字》 本文来自知乎专栏,作者 ID “想飞的石头”。文中用 TensorFlow 实现了一个验证码识别模型,即如何从一排汉字中挑出倒置的汉字。作者首先利用网上的开源代码实现了汉字自动生成(当然其中有一些是倒置的)。然后因为所有的验证码长度都是 10,因此用 0 表示正常,1 表示倒置,构造了一个 input 到 10 个 binary classification 的网络。最后用数据对模型展开训练,经过一些调试和修正过程,实现了倒置汉字识别。 原文地址:https://zhuanlan.zhihu.com/p/25297378 源代码:https://github.com/burness/tensorflow-101/tree/master/zhihu_code/src 深层神经网络结构及可能存在的致命问题详解 本文作者孙飞,网名 Sunface,是开源组织泰坦 (Taitan.org) 的创始人, Gomqtt.com 和 OpenAPM.io 两大开源项目的负责人。本文分为四大部分:一是 Logistic 回归、传统多层神经网络,二是特征学习与 Pre-Training,三是深度学习的层数问题,四是一些最新进展。总体上,文中详细阐述了深层神经网络可能存在的各种致命问题,通过学习本文可以帮助避免一些常见的坑。 原文地址:http://sunface.io/post/scsjwlzmwt/?utm_source=tuicool&utm_medium=referral 如何用计算机视觉技术识别并标记行车记录仪中的道路? 本文作者 Milutin N. Nikolic,是一位知名的机器人爱好者。本文同时也是优达学城(Udacity)自动驾驶课程的一次课堂项目,文中详细介绍了如何利用 OpenCV 计算机视觉库识别并标记行车记录仪中记录的道路信息,同时还要在标记出车道的基础上计算车道曲率,以及车道与汽车的相对位置信息。 原文地址:https://medium.com/@ajsmilutin/advanced-lane-finding-5d0be4072514#.fs5eun6yg 高效的 C++ 机器学习框架 mlpack 入门指南 mlpack 是一个基于 C++ 语言的机器学习库,目标是为用户提供高性能、可拓展的机器学习高级算法实现。本文作者 Chris McCormick,是 in2H2 创业公司的软件工程师。文章源自作者自己在工程中的亲身经历,对 mlpack 框架感兴趣的读者不妨按照本文的描述开始 mlpack 的学习吧。 原文地址:http://mccormickml.com/2017/02/01/getting-started-with-mlpack/ mlpack官网:http://www.mlpack.org/ 如何基于 TensorFlow 实现图片解释图片? 本文作者 Christopher Hesse,是知名消息传输应用 Pushbullet 的联合创始人。本文介绍了如何用 TensorFlow 构造一个图片解释器,即将一张图片输入系统,系统将输出一张类似的图片对其进行解释。本文源于另一个在 Torch 框架下实现的开源版本,作者将其搬到了 TensorFlow 框架下。 原文地址:http://affinelayer.com/pix2pix/ 代码地址:https://github.com/affinelayer/pix2pix-tensorflow 本文作者:恒亮 本文转自雷锋网禁止二次转载,原文链接
文章
机器学习/深度学习  ·  人工智能  ·  TensorFlow  ·  算法框架/工具  ·  C++
2017-08-02
学机器学习要走弯路?不存在的!
营长的一位转型AI的朋友,最近对营长抱怨,“走过的最远的路,就是机器学习过程中的弯路”,然后开始各种blablabla,从论文的坑,到模型的坑,再到培训的坑...一路吐槽。 尤其是论文,他骂道:“最讨厌的就是那种,高高在上、假装清高、站着说话不腰疼、戳不到痛点的论文。比如那一堆只能在理论中刷存在感,实际落地中只能‘呵呵哒’的论文,根本就是浪费时间。” 的确,对于现在刚刚入行的机器学习新人来说,不怕吃苦,但最怕走弯路,最怕白白浪费时间。 那么,总结起来,都有怎样的弯路呢?来看几位点赞量颇高的知乎答主的总结: 那些年,他们在机器学习中走过的弯路... 在知乎答主张馨宇(就职于百度地图)看来,机器学习的弯路有以下四个: 最大的弯路就是自己xjb学xjb试,和加入一个真正能做出东西的团队或跟随真正的牛人一起学习相比,速度要慢十倍都不止。学是要学,但不要以为自己xjb学就够了,差得远呢。 第二大的弯路就是成天xjb看论文,以为这样就能打通任督二脉,从来不复现论文或者尝试自己做出一些东西,这都是〇。 第三大弯路浅尝辄止,有些东西不往死里怼屁都做不出来。 第四大弯路迷信复杂的东西和新技术,以为新东西怼上去肯定就效果爆棚。其实都是不存在的。 还有一位知乎答主ycszen,在他看来,最大弯路,就是迷信论文,不去实验。 DL\ML其实是一门实践性的学科,只有通过实验才能把握到其中的细节与真谛。虽说也是在写程序,但是DL的程序基本上无法直观地debug,所以非得自己去复现一下,实践一下,用performance来说话,才知道有没有出错。 尤其是DL,研究发展到现在,论文和实际做的东西脱节已经是心照不宣的事了。正因为NN+GD的鲁棒性,你xjb搞好像也能搞上去,所以写论文很多纯粹在编故事(好论文除外) 所以,我们最好不要一味相信论文所说,尤其是各种解释(经典算法,优秀论文除外)。NN就是个黑盒,谁也别说谁。而我们能做的,更重要的是,去实践去复现,去去伪存真,去发现其中真正的本质所在。 而知乎答主:YukiRain(CV/ML方向研究生在读)则认为,非科班出身,刚转型AI的程序员最大的弯路是:没学好数学。 而对于数学基础好,科班出生的AI程序员来说,则应注意以下几个问题: 1.一开始没人带的时候,看论文喜欢看最新的,很大程度上忽视了很多比较老比较基础的论文,嫌弃以前的方法performance不好什么的......感觉我身边一些人也走进过这个误区...... 2.永远不要迷信某个特定的模型,不要因为random forest在某个任务上效果好,就以后遇到什么任务都上random forest;也不要觉得深度学习就是万能的,什么都可以套神经网络解决;不要看到比赛里面大家整天用xgboost就整人云亦云地复制。学各种算法的时候,书上一般会告诉你这个算法有balabala优点一堆,但是一般不会告诉你这个算法也有balabala一堆缺点,我花了蛮长时间在这个坑里,慢慢摸索各种不同模型的特性。 3. 不要迷信一些理论性很强的论文,我一开始的时候,经常看到一大堆公式就下意识会觉得这个模型可能效果不错。事实上很多论文的理论推导和它的代码毫无关联(参见已经彻底回归炼丹的WGAN GP),还有很多论文的推导需要很强的assumption支持(参见每年都会出现在顶会的一些给模型加riemannian geometry的论文),等等。 那么面对这些弯路,又应该如何解决呢? 那就是走正统的教育路线,你follow的人一定是真正做事情的人。机器学习还没有达到批量化流水生产的阶段,因此一个好的“老师傅”比自学效果好很多。不仅如此,老师傅们一般都有自己多年经验总结出来的经验,往往可以避免很多不必要弯路。目前机器学习的资料有很多,动辄就有几个G的材料可以下载或者观看。而很多朋友都有“收集癖”,一下子购买十几本书的人我也常常能够看到。而机器学习的发展和变化速度很快,在入门期间,建议“小而精”的选择资料。这不仅可以节约重复学习的时间,也可以读有品位的材料。 为了防止我们走更多的弯路,小象给我们提供了一个follow大牛的机会,帮助我们强化机器学习中需要的数学基础知识,深入理解经典算法的数学原理,不仅可以掌握工业界广泛应用的机器学习模型,还会培养用机器学习解决问题的思路。 原文发布时间为:2018-09-19 本文作者:小象学院 本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区””。
文章
机器学习/深度学习  ·  人工智能  ·  算法  ·  程序员
2018-09-20
浏览器自动填充存漏洞,可能泄露你的个人隐私
当你在注册新账号,或者填写收货地址时,大堆信息是否让你头疼?所幸的是,大多数浏览器都自带了的自动填充表单的功能,一秒钟就能帮你填好所有的所有输入框。 可是,最近一个芬兰的网页开发者和黑客 Viljami Kuosmanen 发现了一个自动填写表单功能重大的潜在安全漏洞,他表示诸如 Chrome、Safari 和 Opera 等浏览器,或是 LastPass 这样带自动填充功能的浏览器插件,都可能会泄露用户的隐私。 自动填表如何泄露你的隐私 一般来说,在使用自动填充功能之前,用户需要提前把需要自动填充的个人信息存储在浏览器或者工具中,以 Chrome 浏览器为例: 其自动填写的信息包括邮编、详细地址、组织(公司)、用户名、电话、和电子邮件等,通常可用来快速填写收货地址。 浏览器自动填充存漏洞,可能泄露你的个人隐私 再以自动登录工具 Lastpass 为例,它提供了更为详细的资料填写项目,几乎可以帮你自动填写能想到的所有资料,包括除了基础的用户名、姓名、生日、社会保险号码(身份证号),还有详细地址、联系人、银行账户等等。 浏览器自动填充存漏洞,可能泄露你的个人隐私 然而这些 Viljami 发现,通过极其简单的手段将一些文本输入框隐藏起来,就可以在你不知情的情况下,得到你表单中的所有个人资料。 为了实际展示该功能,Viljami 做了一个简单的演示 Demo 网站,看起来,网页上只要求输入姓名和邮箱,但是按提交键后,通过浏览器抓取信息显示,除了页面上能看到的两项信息以外,用户的电话、地址等信息也被上传了。 浏览器自动填充存漏洞,可能泄露你的个人隐私 【图片来自:Viljami 提供的演示 demo 】 雷锋网宅客频道按照这种思路绘制了一个钓鱼网站骗取用户信息的示意图如下: 浏览器自动填充存漏洞,可能泄露你的个人隐私 钓鱼网站会将一些用户电话、地址等信息的输入框隐藏起来,虽然用户的肉眼看不到,但是自动填写程序能捕捉到,并在用户不知情的情况下“帮” 用户把信息填进去。 据雷锋网了解,喜欢海淘的人经常需要填写如信用卡卡号、有效日期和安全码等信息,此外,人们在参加“特价秒杀”等抢购活动时也需要争分多秒地填写表单,这时许多人会 选择将住址、电话等资料保存在浏览器或插件中,以便自动填充。 一旦用户在钓鱼网站使用了自动填充功能,就很可能会泄露自己的详细地址、信用卡号、安全码等信息。 问题的发现者 Viljami 表示:“该问题在 Chromium 内核中存在6年之久,这就是我不爱用自动填写表单的原因。” 他还表示 Mozilla 的 Firefox 火狐浏览器并没有此类问题,因为它只支持自动填写单个文本框而不支持一键填写整个表单,用户需要逐个点击输入框,因此那些隐藏起来的文本输入框就是去了作用。 应对建议 虽然 Viljami 建议关闭网页自动填充功能,但雷锋网(公众号:雷锋网)宅客频道认为这未免有些因噎废食的意思。自动填写功能可以用,但建议用户在使用该功能前确认网站是否可信任,切勿在来历不明的小网站使用,以免遭遇钓鱼。 对于懂技术又不怕麻烦的人,在小网站使用自动填写功能时,不妨花几秒钟手动检查一下网页源代码。不过话说回来,既然都不怕麻烦地检查代码了,为何不直接手动填写呢…… 浏览器自动填充存漏洞,可能泄露你的个人隐私 雷锋网原创文章,未经授权禁止转载。详情见转载须知。 0人收藏 分享:知乎的「野心与终局」 知乎的「野心与终局」龙芯推出新一代处理器,离 Intel 还有多大差距?龙芯推出新一代处理器,离 Intel 还有多大差距?亚马逊的秘密部队和差点成笑话的Amazon Echo亚马逊的秘密部队和差点成笑话的Amazon EchoGAN学习指南:从原理入门到制作生成Demo,总共分几步?GAN学习指南:从原理入门到制作生成Demo,总共分几步?文章点评: 我有话要说……表情 同步到新浪微博 提交 谢幺编辑关注网络安全、黑客、白帽子那些事, 欢迎来聊聊你的故事。发私信当月热门文章最新文章黑客随便修改价格,1美元就能买到 Macbook Pro?以激光舞开场,有陌陌 SRC 赞助的摇滚趴?这个黑客大会八卦和干货齐飞FBI 抓了一个上海教师,说他偷了美国政府 2210 万份数据看到机器人拿螺丝刀捅向西红柿,我都要吓尿了窃取徐玉玉信息的19岁黑客被判了6年他们造了一个自动挖掘工具,能找到比核武器更可怕的漏洞热门搜索融资iPhone应用雷锋微视点CES锤子手机电子商务摄像头电信Arduino迅雷CarPlay引入神经网络,谷歌将语音识别错误率降低30%本文作者:周翔 2017-01-12 15:04导语:此前,微软已经将错词率降到了6.3%。引入神经网络,谷歌将语音识别错误率降低30% 雷锋网(公众号:雷锋网)消息:今天(1月12日),在加州圣克拉拉举行的AI前沿大会上,谷歌高级研究员Jeff Dean分享了有关谷歌语音识别准确率的最新消息:在引入神经网络之后,谷歌语音识别的错词率(word error rate)下降了30%。 神经网络是谷歌以及其他公司在深度学习中使用的一种系统。人们利用大量的数据,比如演讲片段,来训练神经网络,然后让这些神经网络能够自动对新的数据做出判断。2012年,谷歌首次将神经网络运用于语音识别。 在深度语音和文字识别这一重要领域,谷歌向来很少公布其最新进展,虽然这些技术与谷歌的一些产品息息相关,比如智能音箱Google Home以及转为手机设计的虚拟键盘Gboard。不过,谷歌CEO 桑达尔·皮查伊在2015年的时候曾公布,谷歌在语音识别方面的错词率为8%。 2016年8月份,苹果Siri部门的高级总监Alex Acero曾表示,Siri在所有语言的语音识别中错误率下降了50%。 同年9月,微软宣布,在语音识别准确率上面超过了IBM的超级电脑沃森,错词率降到了6.3%,打破了沃森之前保持的6.9%的出错率纪录。 本文作者:谢幺 本文转自雷锋网禁止二次转载,原文链接
文章
Web App开发  ·  机器学习/深度学习  ·  安全  ·  语音技术
2017-08-09
开源大数据周刊-第27期
阿里云E-Mapreduce动态 E-Mapreduce产品即将发布的版本信息如下: 1.6.0版本 交互式查询(支持Hive、Spark) 资讯 大数据有多火:盘点54家,A轮占比27.8%,增速41.1% ,北京占比57.4% 本文重点汇总了54家从事大数据的初创企业,从地理分布、融资情况、企业定位、市场趋势、以及业务类型角度对大数据的热火程度进行描绘。 2016年大数据技术发展趋势概述对大规模数据集进行分析能够帮助我们掌握隐藏模式、客户偏好、未知关联性、市场趋势以及其它极具价值的业务信息。在此基础之上,企业能够实现成本削减、促进决策制定并提供更多有针对性的产品与服务。在这篇文章中共享了解2016年内出现的几项大数据技术发展趋势。包括Apache Spark、基于Hadoop的多核心服务器、数据湖泊等等。 DaaS调研与简要分析:市场现状、商业模式及展望文章介绍了DaaS的基本定义和当前市面上的典型产品(Amazon EMR、Altiscale、Qubole等),并分析了DaaS可能存在的商业模式:DaaS提供上承担合约和数据保护的成本,行业巨头需要释放数据价值获取更多的数据。 (技术)一文读懂 CNN、DNN、RNN 内部网络结构区别这一篇知乎的答案介绍了神经网络技术的起源和演进,三类典型的神经网络的内部结构和使用场景。推荐神经网络的初学者入门。 (技术)流处理和Lamda架构中的挑战这篇InfoQ翻译的文章介绍了LinkedIn公司在使用Apache Samza(一个流式计算框架,依赖于Kafka做消息传输,使用Hadoop Yarn做隔离、容错和资源管理等)做数据处理中避免Lambda架构的原因和具体的做法。 (技术)基于Scribe的奇虎360日志收集系统架构文章对Scribe日志系统做了简单介绍,并将Flume和Scribe框架进行了对比。在奇虎360日志收集系统架构里有日志服务器、中心服务器、存储服务器三层,文中介绍了日志的基本流动路线,以及日志系统的可用性、可靠性和可扩展性保证。 (技术)Predicting Breast Cancer Using Apache Spark Machine Learning Logistic Regression(英文)这篇博客文章介绍了用Spark机器学习库的逻辑回归算来预测乳腺癌的发病情况。MLlib是在Spark DataFrame基础上构建的一系列API和算法库,使用MLlib能极大的提升用户构建机器学习算法的性能和效率。逻辑回归是MLlib里比较典型的分类算法,提供二分模型预测功能。 欢迎加入阿里云开源大数据交流钉钉群 国内大数据相关会议 | 会议 | 地点 | 时间 | 费用 || --- | --- | --- | --- | | CBIS 2016中国(上海)大数据产业创新峰会 | 上海 | 2016.12.1 | 2080元起 | 版权声明 信息都是来自互联网,都给出了原文的链接,如果侵权,请联系我们,我们负责删除。 阿里云E-Mapreduce团队 出品
文章
机器学习/深度学习  ·  监控  ·  算法  ·  大数据  ·  Apache
2016-10-27
神经网络和机器学习基础入门分享
         最近在做知识图谱实体对齐和属性对齐中,简单用了下Word2vec谷歌开源代码。Word2vec是一个将单词表征成向量的形式,它可以把文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。         Word2vec采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型,涉及到神经网络和深度学习的一些知识。故这周给学弟和同学们分享PPT的主题就是《神经网络是个什么东东?》,参考了很多资料并简单讲述了机器学习和神经网络的入门知识。        希望文章对你有所帮助,文章中分享了很多参考资料和最后对吴老的赞扬~ 一. 机器学习入门介绍          以前转载过"数盟"的一篇关于机器学习入门介绍的文章,这里简单引入它的几张图片作为引入。参考原文地址和转载地址:          机器学习科普文章:“一文读懂机器学习,大数据/自然语言处理/算法全有了”          http://blog.csdn.net/eastmount/article/details/43673209          机器学习这个词是让人疑惑的,首先它是英文名称Machine Learning(简称ML)的直译,在计算界Machine一般指计算机。这个名字使用了拟人的手法,说明了这门技术是让机器“学习”的技术。但是计算机是死的,怎么可能像人类一样“学习”呢?          下图是非常形象的将机器学习的过程与人类对历史经验归纳的过程做个比对:          机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法。         常见的例子包括房价与面积、预测患病概率等等,详见斯坦福NG教授课程。         下图是机器学习所牵扯的一些相关范围的学科与研究领域。         简单的等价划分如下:         模式识别=机器学习: 两者的主要区别在于前者是从工业界发展起来的概念,后者则主要源自计算机学科。         数据挖掘=机器学习+数据库: 从数据中挖出金子,以及将废弃的数据转化为价值。         计算机视觉=图像处理+机器学习: 图像处理技术用于将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。例如百度识图、手写字符识别、车牌识别等等应用。         统计学习≈机器学习: 统计学习是个与机器学习高度重叠的学科。因为机器学习中的大多数方法来自统计学,甚至可认为统计学的发展促进机器学习的繁荣昌盛。例如著名的支持向量机算法,就是源自统计学科。区别在于统计学习者重点关注的是统计模型的发展与优化,偏数 学,而机器学习者更关注的是能够解决问题,偏实践。         语音识别=语音处理+机器学习: 语音识别就是音频处理技术与机器学习的结合。一般会结合自然语言处理的相关技术,目前的相关应用有苹果的语音助手siri。         自然语言处理=文本处理+机器学习: 让机器理解人类的语言,NLP中大量使用了编译原理相关的技术,例如词法分析、语法分析、语义理解等。         自然语言处理作为唯一由人类自身创造的符号,一直是机器学习界不断 研究的方向。按照百度机器学习专家余凯的说法“听与看,说白了就是阿猫和阿狗都会的,而只有语言才是人类独有的”。如何利用机器学习技术进行自然语言的的深度理解,一直是工业和学术界关注的焦点。        Deep Learning (深度学习)算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果。有一种说法是:        语言(词、句子、篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号,所以后两者更适合做deep learning来学习特征。        而将词用“词向量”的方式表示可谓是将 Deep Learning 算法引入 NLP 领域的一个核心技术。大多数宣称用了 Deep Learning 的论文,其中往往也用了词向量。显然Word2vec也引入了词向量。参考licstar文章:        Deep Learning in NLP (一)词向量和语言模型         机器学习的方法很多,其中经典的方法包括:回归算法、神经网络、支持向量机SVM、聚类算法、降维算法、推荐算法、朴素贝叶斯、决策树等。详见这两篇文章:        常见的机器学习&数据挖掘知识点 - 作者:一只鸟的天空        [转载] 机器学习面试之算法思想简单梳理 二. 神经网络入门介绍         该部分主要通过白话文的方式讲述神经网络,其中主要转载吴老的文章。链接:         吴祖增前辈:神经网络入门(连载之一)         吴祖增前辈:神经网络入门(连载之二)         斯坦福机器学习视频NG教授 https://class.coursera.org/ml/class/index         书籍《游戏开发中的人工智能》、《游戏编程中的人工智能技术》         神经网络(也称之为人工神经网络,ANN)算法是80年代机器学习界非常流行的算法,不过在90年代中途衰落。现在,携着“深度学习”之势,神经网络重装归来,重新成为最强大的机器学习算法之一。         人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。其来源于生物,故吴老先先讲述了生物神经网络的基础知识,从而进行引入。         神经细胞通过轴突将信号传递给其他的神经细胞,通过树突向各个方向接受信号。         神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触(synapse),信号就从树突上的突触进入本细胞。         信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一样,利用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。             神经细胞利用一种我们还不知道的方法,把所有从树突突触上进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋(fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单化,但已能满足我们的目的。         由于人脑具有一下几个特点:         1.能实现无监督的学习         大脑能够自己进行学习,而不需要导师的监督教导。如果一个神经细胞在一段时间内受到高频率的刺激,则它和输入信号的神经细胞之间的连接强度就会按某种过程改变,使得该神经细胞下一次受到激励时更容易兴奋。         2.对损伤有冗余性(tolerance)         大脑即使有很大一部分受到了损伤, 它仍然能够执行复杂的工作。         3.处理信息的效率极高         神经细胞之间电-化学信号的传递,与一台数字计算机中CPU的数据传输相比,速度是非常慢的,但因神经细胞采用了并行的工作方式,使得大脑能够同时处理大量的数据。例如,大脑视觉皮层在处理通过我们的视网膜输入的一幅图象信号时,大约只要100ms的时间就能完成,眼睛并发执行。         4.善于归纳推广         大脑和数字计算机不同,它极擅长的事情之一就是模式识别,并能根据已熟悉信息进行归纳推广(generlize)。例如,我们能够阅读他人所写的手稿上的文字,即使我们以前从来没见过他所写的东西。         5.它是有意识的         如下图所示,它表示的是一个人工神经细胞。其中:        输入(Input);权重(Weight):左边五个灰色圆底字母w代表浮点数;激励函数(Activation Function):大圆,所有经过权重调整后的输入加起来,形成单个的激励值;输出(Output):神经细胞的输出。         进入人工神经细胞的每一个input(输入)都与一个权重w相联系,正是这些权重将决定神经网络的整体活跃性。假设权重为-1和1之间的一个随机数,权重可正可负(激发和抑制作用)。当输入信号进入神经细胞时,它们的值将与它们对应的权重相乘,作为图中大圆的输入。如果激励值超过某个阀值(假设阀值为1.0),就会产生一个值为1的信号输出;如果激励值小于阀值1.0,则输出一个0。这是人工神经细胞激励函数的一种最简单的类型。涉及的数学知识如下图所示:         如果最后计算的结果激励值大于阈值1.0,则神经细胞就输出1;如果激励值小于阈值则输出0。这和一个生物神经细胞的兴奋状态或抑制状态是等价的。下面图是通过神经网络实现逻辑表达式与运算:(参考NG斯坦福机器学习讲义)         可以看到x1和x2变量作为神经网络的输入,当它们取不同的0或1值时,其结果通过sigmod函数计算的值是不同的。它模拟了整个AND运算。         该图中神经网络共有三层 ( 注输入层不是神经细胞,神经细胞只有两层 ):         输入层中的每个输入都馈送到了隐藏层,作为该层每一个神经细胞的输入;然后,从隐藏层的每个神经细胞的输出都连到了它下一层(即输出层)的每一个神经细胞。         注意:         1.图中仅仅画了一个隐藏层,作为前馈网络,一般地可以有任意多个隐藏层。但在对付你将处理的大多数问题时一层通常是足够的。         2.事实上,有一些问题甚至根本不需要任何隐藏单元,你只要把那些输入直接连结到输出神经细胞就行了。         3.每一层实际都可以有任何数目的神经细胞,这完全取决于要解决的问题的复杂性。但神经细胞数目愈多,网络的工作速度也就愈低,网络的规模总是要求保持尽可能的小。         神经网络体系创建成功后,它必须接受训练来认出数字4,方法:         1.先把神经网络的所有权重初始化为任意值;         2.然后给他一系列输入代表面板不同配置的输入,对每种输入配置,检查它的输出是什么,并调整相应的权重;         3.如果我们送给网络的输入模式不是4,则我们知道网络应该输出一个0。因此每个非4字符时,网络权重应进行调整,使得它的输出趋向于0;当代表4的模式输送给网络时,则应把权重调整到使其输出趋向于1;         4.我们可以进一步识别0到9的所有数字或字母,其本质是手写识别的工作原理。        5.最后,网络不单能认识已经训练的笔迹,还显示了它有显著的归纳和推广能力。        正是这种归纳推广能力,使得神经网络已经成为能够用于无数应用的一种无价的工具,从人脸识别、医学诊断,直到跑马赛的预测,另外还有电脑游戏中的bot(作为游戏角色的机器人)的导航,或者硬件的robot(真正的机器人)的导航。         上图会演示神经网络在图像识别领域的一个著名应用,这个程序叫做LeNet,是一个基于多个隐层构建的神经网络。通过LeNet可以识别多种手写数字,并且达到很高的识别精度与拥有较好的鲁棒性。LeNet的发明人是机器学习的大牛Yann LeCun(目前google)。        右下方的方形中显示的是输入计算机的图像,方形上方的红色字样“answer”后面显示的是计算机的输出。左边的三条竖直的图像列显示的是神经网络中三个隐藏层的输出,可以看出,随着层次的不断深入,越深的层次处理的细节越低,例如层3基本处理的都已经是线的细节了。         推荐我自己非常喜欢的&牛逼的CSDN机器学习"一只鸟的天空"博主的一篇文章:         当今世界最NB的25位大数据科学家         这种类型的训练称作有监督的学习(supervised learnig),用来训练的数据称为训练集(training set)。调整权重可以采用许多不同的方法。对本类问题最常用的方法就是反向传播(backpropagation,简称backprop或BP)方法,即BP神经网络。         你自己可以去学习另外的一种训练方式,即根本不需要任何导师来监督的训练,或称无监督学习(unsupervised learnig)。         下图是神经网络的简单回顾与总结:         最后给大家看一个利用神经网络对图片进行分类的例子:过程就不详细论述了,图片很清晰,对人、汽车、摩托车、卡车进行图片识别,而具体的隐藏层函数需要大家去深入研究,我自己研究得也很浅显,抱歉~        参考资料包括NG教授的课程讲义和CSDN一位很厉害的女博主Rachel-Zhang:         Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning 三. 监督学习和无监督学习         因为给刚入学的学弟们讲的PPT,所以也简单讲述了监督学习和无监督学习的区别。下图是刘斌《Web数据挖掘》书的整体框架,当年我讲过。         在给它们解释监督学习和无监督学习的过程中,主要通过知乎的五个问题进行讲解。         第一个问题:什么是学习(Learning)?         一个成语就可以概括:举一反三 。以高考为例,高考的题目在上考场前我们未必做过,但在高三做过很多题目,懂得解题方法,因此考场上也能算出答案。         机器学习的思路类似:我们能不能利用一些训练数据(已经做过的题)使机器能够利用它们(解题方法)分析未知数据(高考题目)。         第二个问题:最普遍也是最简单的机器学习算法?         分类(Classification):输入的训练数据有特征(feature),有标签(label)。学习的本质就是找到特征和标签间的关系(mapping)。这样当有特征而无标签的未知数据输入时,我们可以通过已有的关系得到未知数据的标签。         第三个问题:上述分类所有训练数据都有标签,如果没有呢?         所有训练数据都有标签则为有监督学习(Supervised Learning),如果数据没有标签则是无监督学习(Unsupervised Learning),也即聚类(Clustering)。但有监督学习并非全是分类还有回归(Regression)。         无监督学习本身的特点使其难以得到如分类一样近乎完美的结果。这也正如我们在高中做题,答案(标签)是非常重要的,假设两个完全相同的人进入高中,一个正常学习,另一人做的所有题目都没有答案,那么想必第一个人高考会发挥更好,第二个人会发疯。         第四个问题:既然分类如此之好,聚类如此之不靠谱,那为何我们还可以容忍聚类的存在?         在实际应用中,标签的获取常常需要极大的人工工作量,有时甚至非常困难。例如在自然语言处理NLP中,Penn Chinese Treebank在2年里只完成了4000句话的标签。         第五个问题:难道有监督学习和无监督学习就是非黑即白的关系吗?有没有灰呢?         Good idea。灰是存在的。二者的中间带就是半监督学习(semi-supervised learning)。对于半监督学习,其训练数据的一部分是有标签的,另一部分没有标签,而没标签数据的数量常常极大于有标签数据数量(这也是符合现实情况的)。 四. 总结         这篇文章主要是一篇基础介绍神经网络和机器学习的入门文章,同时参考了很多资料,主要是自己分享的PPT给学弟的新知识。同时由于我自己也只是入门,所以很多高深的东西也在学习,在此需要向上面文章中的个位大牛虚心学习。但作为入门文章,感觉还是不错的~         最近发生的事情太多太多,其中包括拒绝了一些互联网公司或航天院的offer、面试,一心准备回家乡贵州的一些大学教书。怎么说呢?贵州那里确实承载了太多的东西,有亲情、有梦想,更有一些根深蒂固的东西。从小就在校园长大,父母都是老师,家住校园,到了高中也独自去到了省会贵阳住校三年,大学更是来到了北理,异地他乡的我,一呆就是六年。从小玩到大的姐姐也成为了初中老师,似乎我这一生与学校挂钩后,就再也脱不了关系了。         这并没有什么情怀,没有什么了不起,更没有什么高大上。更多的是自己从小一直希望成为一名教师吧!尽管父母都不愿意让孩子再从事这一行业,但我已毅然决定。确实,我自己也舍弃了很东西,如每月的高工资福利、发布一款产品后的欣喜若狂等等,但同时有舍才有得,希望自己能在大学中获得一些东西吧!还是《当幸福来敲门》那句话:         在你的人生路上,总有很多人说你这也不行,那也不行,梦想是你自己的;有梦想就需要学会自己去保护它。         别拿着青春的幌子,浪费自己的年轻时光。我一直都喜欢深夜写文章,深夜是思考的好时间,更是寂寞的好时光。一个人行走在这个世界,很多路都需要自己去孤独的前行,需要让自己的内心强大起来。但每每写完一篇博客或想到当老师上课,都能让我心灵为之一颤。这就够了~        下面是我看到吴祖增老师80多岁高龄后,依然坚持写作的感慨!见笑了~         侠之为大,为国为民。行止无定,随遇而安。心安乐处,便是深安乐处。         最后希望自己能够找到一所大学,成为一名教师!同时也希望文章对你有所帮助~        (By:Eastmount 2015-11-03 深夜5点   http://blog.csdn.net/eastmount/)
文章
机器学习/深度学习  ·  自然语言处理  ·  算法  ·  数据挖掘  ·  计算机视觉
2015-11-03
一小时神经网络从入门到精通(放弃)
前言 本文主要是学习BP神经网络的一个总结,其本身也是机器学习中比较基础、适合入门的模型。 目前本人对于机器学习也还只是入门状态,对于很多名词仍然是一知半解(感觉机器学习中的很多术语本身也是模棱两可的),对于很多公式也是不求甚解,因此这篇文章是尝试用自己的语言和理解来复述所学习到的知识,如果有错误之处还望大牛们不吝斧正。 霍金说过每多一个数学公式,就会少一半的读者,因此这里也会尽量少用公式,要用也只用简单易懂的公式。而且个人觉得神经网络中的很多公式是可以感性地去认识的,能完全明白推导过程自然最好,但在不求甚解的状态下能达到感性的认知也未必不是一个快速掌握的好方法。 另外本文中用到了不少矩阵相关的知识,忘记了的同学可以看附录中的整理。 神经元与激励函数 神经元 神经元是神经网络的基本组成,如果把它画出来,大概就长成下面这样: 图中神经元左边的x表示对神经元的多个输入,w表示每个输入对应的权重,神经元右边的箭头表示它仅有一个输出。 当然神经元也有很多种,下面介绍两种比较基础的。 神经元1:感知器 神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),其中的单个神经元我们可以叫作感知器。感知器的特点具有浓厚的时代气息:其输入输出都是二进制形式的(据说由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的)。 如上图所示,感知器有多个二进制输入(值只能是0或1)X1、X2..Xn,每个输入有对应的权值W1、W2..Wn(图中没画出来),将每个输入值乘以对应的权值再求和( ∑XjWj ),然后与一个阈值(threshold) 比较,大于阈值则输出1、小于阈值则输出0。  写成公式的话如下: 如果把公式写成矩阵形式,再用b来表示负数的阈值(即b=-threshold),那就得到了如下公式: 举个栗子 例如你所在的城市将有一个你的偶像的演唱会,你正决定是否观看,你可能会通过以下三个方面来权衡你的决定: 天气好吗? 你的好基友是否愿意陪你去? 是否这个活动距离公共交通很近?(你自己没车) 我们将这三个因素用对应的二进制变量x1,x2和x3表示。比如,当天气还不错时,我们有x1=1,天气不好时x1=0;相似的,如果好基友愿意去,x2=1,否则x2=0;对于公共交通x3同理赋值。 然后根据你的意愿,比如让天气权重 w1=6,其他条件权重分别为w2=2,w3=2。权重w1值越大表示天气影响最大,比起好基友加入或者交通距离的影响都大。最后,假设你选择5做为感知器阈值(即b为-5),按照这种选择,这个感知器就能实现这个决策模型:当天气好时候输出1,天气不好时候输出0,无论你的好基友是否愿意去,或者交通是否比较近。 神经元2:Sigmoid神经元 先来认识一个函数:Sigmoid函数,这个单词在某些工具上直译是“乙状结肠”、也还真有某些资料把Sigmoid神经元叫作乙状结肠神经元的。 其实它是一个常用的“S”型函数,可以把变量映射到(0,1)区间内,其公式如下: 它的函数图像是如下图如示的“S”型:   那么Sigmoid神经元是什么呢?与感知器有什么区别? 首先,在Sigmoid神经元中,输入的值不再是二进制,而是0到1之间的任意值。即Xi取值是0到1之间的任意实数。 其次,而Sigmoid神经元的输出也不再是0或1,而是 σ(wx+b)。 注意"wx+b"是简写(矩阵)形式,请对照上面的感知器的公式。 因此我们可以得出Sigmoid神经元的公式: 可以发现当z=w⋅x+b是一个大的正数时,那么σ(z)≈1,而当z=w⋅x+b是一个很小的负数(“绝对值很大的负数”比较好理解)时,σ(z)≈0。处于这两种情况时,Sigmoid神经元的输出跟感知器是很接近的。只有当w⋅x+b在一个适度的值,sigmoid神经元和感知器偏差才较大。 激励函数 神经元的输入和输出之间具有函数关系,这个函数就称为激励函数。所以上面提到的Sigmoid函数就是激励函数的一种,感知器的那个函数也可以称为阈值(或阶跃)激励函数。 激励函数也叫点火规则,这使它与人脑的工作联系起来。当一个神经元的输入足够大时,就会点火,也就是从它的轴突(输出连接)发送电信号。同样,在人工神经网络中,只要输入超过一定标准时才会产生输出,这就是点火规则的思想。 神经网络的结构 神经网络简单地说就是将多个神经元连接起来、组成一个网络。 本文介绍的是最简单、历史悠久的一种:“多层感知机”(但我们讲的这个它里面的神经元并不是感知器、而是Sigmoid神经元,名词混乱+1),或称之为“多层向前神经网络(Multilayer Feed-Forward Neural Network)”,它的特点是有多层(废话),且神经元之间是全连接的,即后一层的神经元会连接到前一层的每个神经元(这里定义下从输入层到输出层为从“后”向“前”)。 一个多层感知机的示意图如下,网络的最左边一层被称为输入层,其中的神经元被称为输入神经元。最右边及输出层包含输出神经元,在这个例子中,只有一个单一的输出神经元,但一般情况下输出层也会有多个神经元。中间层被称为隐含层,因为里面的神经元既不是输入也不是输出。 训练神经网络的意义 现在神经元有了,神经网络的结构也有了,现在回到核心的问题上来:我们拿神经网络干什么? 要怎样使它做到? 训练的目标 按照常识、用人话来说,神经网络的作用就是我们预先给它大量的数据(包含输入和输出)来进行训练,训练完成后,我们希望它对于将来的真实环境的输入也能给出一个令我们满意的输出。 损失函数/代价函数(Loss函数) 那么怎样用数学的方式来表示一个输出有多么令我们满意呢? 这里我们引入损失函数(或称代价函数、Loss函数)的概念。 现假设有n组包含了输入和真实结果(或称期望结果、期望输出)的样本数据,对于每组输入,我们的神经网络输出的结果记为fi,真实结果(期望结果)记为yi。 使用数学工具中的MAE(Mean Absolute Error,平均绝对误差),可以非常直观地表达出输出结果和真实结果的偏差,因此我们可以用MAE来写出一个下面这样的Loss函数,Loss值越大、说明神经网络的输出结果越远离我们的期望。 也可以用MSE(Mean Squared Error,均方误差)作为损失函数,MSE能更好地评价数据的变化程度,简单地说因为平方了一下、偏差是会被放大的。 将Sigmoid神经元的表达式f(x)=σ(wx+b)代入上面的损失函数中,可以发现x(输入)是固定的,yi(期望结果)也是固定的,让我们感性地想象一下:实际上影响Loss的只有w和b,而最重要的任务也就是寻找w和b使得Loss最小。 再具象一点,其实对神经网络进行训练的目的就是为每个神经元找到最适合它的w和b的值,从而使得整个神经网络的输出最接近我们的期望(说“最”其实有点违反广告法,神经网络最终达到的很难说是问题的最优解)。 注:下面将真正用到的损失函数 在实际中,为了方便求导,一般使用如下的Loss函数: 梯度下降 根据上面的结论,可以把损失(Loss)记作C,而C又只与w和b有关,那么可以看成C是一个关于w和b的函数,如下图所示。注意由于神经网络中其实有大量的“w”和“b”(回忆一下、每个神经元都有多个权重和一个阈值),因此这里也需要感性的认知。 如果把图画出来,它可能是下面这样的: 我们的目标是找到w和b使C最小,当然上面这张图很容易看出来合适的w和b在哪,但当面对更复杂的情况时、比如下图这样的,应该如何快速地找到C最小的点呢? 这里我们引入梯度下降算法,原理很简单:把上图看作是一个丘陵地带,想象我们有一个球放在某个位置,让它“自然地向低处滚”,滚得越低,C就越小,我们就越高兴。 那么怎样使得它往低处滚呢?  (注意这里要搬出全文中第一个比较烧脑的概念了)  微分法则告诉我们,当w移动Δw、b移动Δb时,有: 由于C表示的是损失,我们想让球往低处滚,当然是希望C不断变小,那ΔC应该恒为负,那么Δw、Δb应该如何取值呢? 梯度下降法是这么设计的: 可以看出如此取值可以使ΔC恒为负,其中的η称为学习率。 那么现在问题变成了∂C/∂w、∂C/∂b,即 C对w 和 C对b 的偏导,这两个鬼东西要怎么求? 反向传播 反向传播(back propagation)是在这种场景下快速求解∂C/∂w、∂C/∂b的算法,用了这个算法的多层感知机--也就是这篇文章讲的神经网络--也就叫作BP神经网络(名词混乱+1)。 这一章包含了比较复杂的公式推导过程,个人认为不了解其细节也没有关系、可以跳过这一章(只看“正向传播”一节就行),只要知道有个经典的反向传播算法可以快速求解∂C/∂w、∂C/∂b,从而算出Δw和Δb,使得ΔC恒为负、即使得Loss越来越小即可。 正向传播 正向传播也可以叫作前馈(所以又有个前馈神经网络的词...),正向传播就是指给神经网络的输入,然后一层一层向前计算输出,最终得到一个输出,这就是正向传播了。 推导前的基本定义 w、a、b的定义 我们使用 wljk 表示从 (l−1)th 层的 kth 个神经元到 (l)th 层的 jth 个神经元的链接上的权重。例如,下图给出了第二隐藏层的第四个神经元到第三隐藏层的第二个神经元的链接上的权重: 我们使用 blj 表示在 lth 层 jth 个神经元的偏差,使用 alj 表示 lth 层 jth 个神经元的激活值。下面的图清楚地解释了这样表示的含义: 基于上面的定义,可以写出关于单个神经元激活值alj的公式,其中sum(l-1)表示(l−1)th 层的神经元数量: 上面w的表示方法或许很奇怪,但我们把它写成矩阵形式或许就能发现它的妙处了。用wl矩阵来表示第(l)th 层的w的值,用j作为行,k行为列,那么上面的神经网络中的w3就可以写成: 那么也可以用al矩阵来表示第(l)th 层的a的值,用j作为行,但只有一列,那么al其实是一个列向量。那么上面的a2可以写成下面非常形象的列向量形式: 同理,b3可以也可以写成一个列向量: 那么由上面的单个神经元激活值alj的公式,可以得出al矩阵的公式: 单个神经元的带权输入zlj 从上面的公式中可以提取出一个中间量zlj: 当然也可以简写成矩阵形式: zlj其实就是第 l 层第 j 个神经元的激活函数带权输入。 单组数据的损失 前面介绍了损失函数,那么对于某一组输入,其损失(大写的“L”表示输出层)可以写作如下公式(这里比上面的Loss公式少了个n,因为这里只考虑一组输入,而上面的Loss设定是考虑n组数据)。 这个公式同样可以写成矩阵的形式,这里用到了矩阵的模(可以看附录),模的平方即为向量各元素的平方和。 单个神经元的误差δlj测试 定义 l 层的第 jth 个神经元上的误差 δlj 为: 然后可以再推演两步: 推导 输出层的误差矩阵 由上面的单个神经元误差公式,可以得出输出层误差矩阵公式(注意这里使用大写的“L”表示输出层,圆圈表示的Hadamard乘积可以看附录): 而由于我们采用的损失函数非常容易求出C对aL的导,所以公式可以进一步简化成: 某一层的误差矩阵 首先推导下单个神经元误差δlj与下一层(l+1层)的关系: 上面推导中比较难理解的可能是累加k的由来,这是因为第lth层第jth个神经元会影响到第(l+1)th层的所有神经元,所以在反向计算偏导时需要考虑第(l+1)th层的所有神经元。 然后可以得出第lth层的误差矩阵(向量)δl的公式: 这次变换出现了矩阵转置,可能也比较难以理解其由来。仔细观察上面wkj会发现其中的j与k的顺序与w的原始定义中的顺序发生了对调,这可以理解成转置的原因。自己拿一个示例演算一下也能发现从单个神经元误差到某层神经元的误差矩阵变换时的规律。 误差与权重w的关系 在得到了单个神经元的误差之后,再来看看误差与w的关系: 和上节的推演一样,若写成矩阵,则是如下形式: 误差与偏差b的关系 与上面w的推导过程一致,容易得到误差与b的关系: 这个的矩阵形式就很简单了: 总结 通过上面惨无人道的推导,可以发现在经过一次正向传播之后,可以通过输出层的误差、快速求解出C对每个w和b的偏导,即∂C/∂w、∂C/∂b,再对每个w和b加上Δw、Δb,从而使得“球往下滚”,C、即Loss越来越小,神经网络在朝着我们期望的方向进行调整。 BP神经网络的训练流程 基于上面的知识,我们现在可以总结出训练一个神经网络的全流程: 初始化神经网络,对每个神经元的w和b赋予随机值; 输入训练样本集合,对于每个样本,将输入给到神经网络的输入层,进行一次正向传播得到输出层各个神经元的输出值; 求出输出层的误差,再通过反向传播算法,向后求出每一层(的每个神经元)的误差; 通过误差可以得出每个神经元的∂C/∂w、∂C/∂b,再乘上负的学习率(-η),就得到了Δw、Δb,将每个神经元的w和b更新为 w+Δw、b+Δb; 完成训练之后,一般情况下我们都能得到一个损失比较小的神经网络。  附录 矩阵 矩阵加法、减法 要求两个矩阵大小(行数、列数)相同,然后相同位置的元素相加/相减。 矩阵乘法 这个应该都还记得,即左边矩阵的一行乘上右边矩阵的一列,因此矩阵相乘要求左边矩阵的列数等于右边矩阵的行数。 转置 把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵(即第m行第n列元素转为第n行第m列元素),用符号T表示: 向量 只有一行的矩阵称为行向量,只有一列的矩阵称为列向量。 行向量例如: 列向量例如: PS:向量只是一种特殊的矩阵,矩阵乘法和转置都是可以用在向量上的。 Hadamard乘积:⨀ 假设S和T是两个同样维度的向量,使用S⨀T来表示按元素的乘积。所以 S⨀T 的元素就是(S⨀T)j=SjTj。 向量的模(长度或大小) 在线性代数中,向量的大小用向量两边加双竖线表示,向量的大小就是向量各分量平方和的平方根。 如有向量S: 则其模为: 参考资料 知乎:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? http://www.tensorfly.cn/home/?p=80
文章
机器学习/深度学习  ·  算法
2018-06-18
【干货】我的机器学习入门路线图
因为之前有不少朋友在微信或 QQ 上问我,机器学习、深度学习应该如何入门呢?对应这一问题,红色石头碰巧也在知乎上看到有人提问,就把自己的入门学习经验好好总结了一番,包括各种资源、课程笔记和建议,以及红色石头切身经历的机器学习路线图。希望对你有所帮助。1. 放弃海量资料!没错,就是放弃海量资料!在我们想要入门机器学习的时候,往往会搜集很多资料,什么 xx学院机器学习内部资源、机器学习从入门到进阶百 G 资源、xx 人工智能教程,等等。很多时候我们拿着十几 G、几百 G 的学习资源,然后踏踏实实地放到了某云盘里存着,等着日后慢慢学习。殊不知,有 90% 的人仅仅只是搜集资料、保存资料而已,放在云盘里一年半载也忘了打开学习。躺在云盘的资料很多时候只是大多数人“以后好好学习”的自我安慰和“自我”安全感而已。而且,面对海量的学习资料,很容易陷入到一种迷茫的状态,最直接的感觉就是:天啊,有这么多东西要学!天啊,还有这么多东西没学!简单来说,就是选择越多,越容易让人陷入无从选择的困境。所以,第一步就是要放弃海量资料,放弃你的云盘!2. 放弃从零起步! 说到入门,很多人会想着那就要从最基础的知识开始学起!机器学习是一门融合概率论、线性代数、凸优化、计算机、神经科学等多方面的复杂技术。学好机器学习需要的理论知识很多,有些人可能基础不是特别扎实,就想着从最底层的知识开始学起,概率论、线性代数、机器学习凸优化公式推导,等等。但是这样做的坏处是比较耗时间,而且容易造成“懈怠学习”,打消学习的积极性。因为啃书本和推导公式相对来说是比较枯燥的,远不如自己搭建一个简单的回归模型更能激发自己的学习积极性。当然,不是说不需要钻研基础知识,基础理论知识非常重要!只是说,在入门的时候,最好先从顶层框架上有个系统的认识,然后再从实践到理论,有的放矢的查缺补漏机器学习知识点。从宏观到微观,从整体到细节,更有利于机器学习快速入门!而且从学习的积极性来说,也起到了“正反馈”的作用。3. 机器学习入门学习路线 好了,谈完了机器学习入门之前的两个“放弃”之后,我就来系统介绍下红色石头整理的机器学习入门路线。1)Andrew Ng《Machine Learning》首先,非常推荐吴恩达(Andrew Ng)在 Coursera 上开设的机器学习入门课《Machine Learning》,授课地址是:https://www.coursera.org/learn/machine-learning关于这门课的官方介绍是:本课程将广泛介绍机器学习、数据挖掘和统计模式识别。相关主题包括:(i) 监督式学习(参数和非参数算法、支持向量机、核函数和神经网络)。(ii) 无监督学习(集群、降维、推荐系统和深度学习)。(iii) 机器学习实例(偏见/方差理论;机器学习和AI领域的创新)。课程将引用很多案例和应用,您还需要学习如何在不同领域应用学习算法,例如智能机器人(感知和控制)、文本理解(网络搜索和垃圾邮件过滤)、计算机视觉、医学信息学、音频、数据库挖掘等领域。 这门课基本涵盖了机器学习的主要知识点,例如:线性回归、逻辑回归、支持向量机、神经网络、K-Means、异常检测等等。而且课程中没有复杂的公式推导和理论分析。Ng 的目的是让机器学习初学者能够快速对整个机器学习知识点有比较整体的认识,便于快速入门。 红色石头整理了这门课所有知识点的思维导图:这门课每个知识点都会配套相应的练习题。大家可以在 Coursera 上下载,线下完成并提交。唯一的缺点可能是该习题都是基于 matlab 平台的。但是,Github 上已经有人把作业整理成为 Python 的形式了。有 .py 和 .ipynb 两种格式。https://github.com/nsoojin/coursera-ml-pyhttps://github.com/kaleko/CourseraML这门课所有的视频、课件PPT、作业,红色石头都放在了百度云盘上,需要的请在本公众号后台回复:ng 即可获得。2)台大林轩田《机器学习基石》台湾大学林轩田老师的《机器学习基石》课程由浅入深、内容全面,基本涵盖了机器学习领域的很多方面。其作为机器学习的入门和进阶资料非常适合。而且林老师的教学风格也很幽默风趣,总让读者在轻松愉快的氛围中掌握知识。这门课比 Ng 的《Machine Learning》稍难一些,侧重于机器学习理论知识。 首先附上这门课的主页:https://www.csie.ntu.edu.tw/~htlin/林轩田机器学习基石这门课有一个配套教材:《Learning From Data》,林轩田也是编者之一。这本书的主页为:http://amlbook.com/红色石头整理了这门课 16 节课的精炼笔记,供大家参考: 【1】The Learning Problem【2】Learning to Answer Yes/No【3】Types of Learning【4】Feasibility of Learning【5】Training versus Testing【6】Theory of Generalization【7】The VC Dimension【8】Noise and Error【9】Linear Regression【10】Logistic Regression【11】Linear Models for Classification【12】Nonlinear Transformation【13】Hazard of Overfitting【14】Regularization【15】Validation【16】Three Learning Principles3)台大林轩田《机器学习技法》《机器学习技法》课程是《机器学习基石》的进阶课程。主要介绍了机器学习领域经典的一些算法,包括支持向量机、决策树、随机森林、神经网络等等。难度要略高于《机器学习基石》,具有很强的实用性。首先附上这门课的主页:https://www.csie.ntu.edu.tw/~htlin/课程视频在B站上可以直接观看哦~这里附上传送门:https://www.bilibili.com/video/av12469267/红色石头整理了这门课 16 节课的精炼笔记,供大家参考:【1】Linear Support Vector Machine【2】Dual Support Vector Machine【3】Kernel Support Vector Machine【4】Soft-Margin Support Vector Machine【5】Kernel Logistic Regression【6】Support Vector Regression【7】Blending and Bagging【8】Adaptive Boosting【9】Decision Tree【10】Random Forest【11】Gradient Boosted Decision Tree【12】Neural Network【13】Deep Learning【14】Radial Basis Function Network【15】Matrix Factorization【16】Finale关于《机器学习基石》和《机器学习技法》的所有资源请在本公众号后台回复:lin 即可获得。4)Andrew Ng 《深度学习专项课程》从去年 8 月份开始,AI 界大IP吴恩达在 Coursera 上开设了由 5 门课组成的深度学习专项课程,掀起了一股人工智能深度学习热潮。这里附上 deeplearning.ai 的官网:https://www.deeplearning.ai/关于该深度学习专项课程,红色石头非常推荐!它对于理解各种算法背后的原理非常有帮助,同时提供了大量的应用场景,涉及图像、语音、自然语言理解等各方面,还提供了一些工具函数、数据集。这个系列课程是从机器学习过渡到深度学习的必备课程!该专项课程分为五门课,每门课的读书笔记汇总:神经网络与深度学习:【1】深度学习概述【2】神经网络基础之逻辑回归【3】神经网络基础之Python与向量化【4】浅层神经网络【5】深层神经网络优化神经网络:【1】深度学习的实用层面【2】优化算法【3】超参数调试、Batch正则化和编程框架构建机器学习项目:【1】机器学习策略(上)【2】机器学习策略(下)卷积神经网络CNN:【1】卷积神经网络基础【2】深度卷积模型:案例研究【3】目标检测【4】人脸识别与神经风格迁移序列模型RNN:【1】循环神经网络(RNN)【2】NLP和Word Embeddings【3】序列模型和注意力机制今年,Ng 又在斯坦福大学又开设了高质量的深度学习课程 CS230。这门课的主页是:https://web.stanford.edu/class/cs230/这门课是 deeplearning.ai 的线上、线下综合课程。这门课采用翻转课堂的教学形式,你可以在家观看教学视频,完成深度编程作业和在线测试,然后来到课程做进一步讨论并完成项目。这门课将以一个开放式的最终项目作为结束,此过程中教学团队会提供一些帮助。 该门课的线上部分与 deeplearning.ai 一致,线下部分包含了一个课程项目。目前 CS230 的项目报告与 Poster 展示都已经发布。包含多种主题,如音乐生成、情绪检测、电影情感分类、癌症检测等。https://web.stanford.edu/class/cs230/proj-spring-2018.html关于 CS230 所有的课程资料 pdf 文件,包括最终项目等文件请在本公众号后台回复:CS230 即可获得。4. 进阶基本上完成上述课程就算是入门了。接下来可以根据自己的兴趣和方向,有的放矢。例如主攻 CV 方向,可以继续学习斯坦福 CS231n 课程:http://cs231n.stanford.edu/如果主攻 NLP 方向可以学习斯坦福 CS224n 课程:http://web.stanford.edu/class/cs224n/当然,台大李宏毅的课程也很不错:http://speech.ee.ntu.edu.tw/~tlkagk/courses.html
文章
机器学习/深度学习  ·  人工智能  ·  自然语言处理  ·  运维  ·  算法  ·  数据挖掘  ·  机器人  ·  数据库  ·  计算机视觉  ·  Python
2021-12-18
《21个项目玩转深度学习》| 每日读本书
编辑推荐 1.本书以TensorFlow为工具,从基础的MNIST手写体识别开始,介绍了基础的卷积神经网络、循环神经网络,还包括正处于前沿的对抗生成网络、深度强化学习等课题。 2.书中所有内容由21个可以动手实验的项目组织起来,并在其中穿插TensorFlow的教学,让你可以在实践中比较轻松地学习到深度学习领域的基础知识,掌握TensorFlow的使用方法,并积累丰富的深度学习实战经验。 3.通过本书,可以学到: 在动手实践中快速入门深度学习领域。 通过实验快速掌握TensorFlow的操作方法。 掌握卷积神经网络、循环神经网络、对抗生成网络和深度强化学习等深度学习积累丰富的深度学习实战项目,如图像分类、目标检测、人脸识别、图像生成、文本生成、序列分类、时间序列预测等。 学习TensorFlow的一些新特性,如Time Series模块、RNNCell等。 何之源 编著 / 2018年3月出版 内容提要 《21 个项目玩转深度学习——基于TensorFlow 的实践详解》以实践为导向,深入介绍了深度学习技术和TensorFlow 框架编程内容。 通过本书,读者可以训练自己的图像识别模型、进行目标检测和人脸识别、完成一个风格迁移应用,还可以使用神经网络生成图像和文本,进行时间序列预测、搭建机器翻译引擎,训练机器玩游戏。全书共包含21 个项目,分为深度卷积网络、RNN网络、深度强化学习三部分。读者可以在自己动手实践的过程中找到学习的乐趣,了解算法和编程框架的细节,让学习深度学习算法和TensorFlow 的过程变得轻松和高效。本书代码基于TensorFlow 1.4 及以上版本,并介绍了TensorFlow 中的一些新特性。 本书适合有一定机器学习基础的学生、研究者或从业者阅读,尤其是希望深入研究TensorFlow 和深度学习算法的数据工程师,也适合对人工智能、深度学习感兴趣的在校学生,以及希望进入大数据应用的研究者。 作者简介 何之源 现为复旦大学人工智能方向在读硕士生。针对Tensorflow早期学习案例不足的情况,在知乎等网站上发表了多篇实践文章,获得了广大读者的肯定。何之源于2012年通过信息学竞赛保送进入复旦大学学习,2016获得复旦大学理学学士学位,并荣获复旦大学优秀学生的称号。同年进入复旦大学计算机学院攻读硕士学位。在编程和机器学习领域有多年一线实践经验。 精彩导读 前言 我们正处在一个日新月异、飞速变革的时代,层出不穷的新技术每天都在冲击和改变我们的生活。人工智能无疑是其中最受关注、也是影响最深远的技术领域。它为计算机插上了翅膀,演变出许多从前根本无法想象的新技术、新应用。AlphaGo Zero,一台没有任何先验知识的人工智能机器,可以在几天内通过自我博弈成长为世界第一的围棋大师,超越人类几千年积累的经验;风格迁移应用能够自动将用户的照片转变为著名的绘画艺术风格;机器可以在零点几秒内完成翻译,把一种语言译成另一种语言。此外,有关人脸识别、自动驾驶等新技术的应用也都纷纷开始落地。在过去的几年内,人工智能技术不仅在学术上取得了巨大的突破,也开始走向寻常百姓家,真正为人们的生活提供便利。 本书主要为读者介绍这次人工智能浪潮最重要的组成部分——深度学习技术,使用的编程框架是谷歌的TensorFlow。借助于谷歌巨大的影响力,TensorFlow一经发布就引起了广泛的关注,目前(截止至2017年底)TensorFlow在Github上已经有了8万4千多个Star,是所有深度学习框架中最多的。 鉴于目前市场上已有很多深度学习和TensorFlow的入门书籍,下面我们着重谈一谈本书与它们的不同之处,主要有以下几点: 实践、应用导向。深度学习需要深厚的数理基础,对于初学者来说不是很友好。本书希望从实践出发,用具体的例子来引导读者学习深度学习技术和TensorFlow编程技巧。我们主要从实用性和趣味性两个方面考量,选择了21个实践项目,其中既有MNIST图像识别这样的入门项目,也有目标检测、人脸识别、时间序列预测这样的实用性项目,还有一些诸如Deep Dream这样的趣味性项目。读者可以在实践中找到乐趣,逐渐进步,让学习深度学习和TensorFlow的过程不再那么痛苦。 清晰、有深度的介绍。在写书过程中,我们尽量用简单的语言来描述算法的原理,做到清晰有条理。此外,深度学习是一门还在快速发展的新技术,限于篇幅所限,很多内容不能完全写到书中,我们在大部分章节的末尾列出了拓展阅读材料,有兴趣的读者可以参考拓展材料进一步学习细节知识。 基于TensorFlow 1.4版本。TensorFlow的发展非常迅速,本书代码全部基于TensorFlow 最新的1.4版本(包括1.4.0和1.4.1),并介绍了TensorFlow的一些新特性,如Time Series模块(1.3版本添加)、新的MultiRNNCell函数(1.2版本更改)等。本书的代码会在如下Github地址上提供,并会随新的TensorFlow版本的发布而同步更新:https://github.com/hzy46/Deep-Learning-21-Examples。 本书代码推荐的运行环境为:Ubuntu 14.04,Python 2.7、TensorFlow 1.4.0。请尽量使用类Unix系统和Python 2来运行本书的代码。 积跬步以至千里。每天读本书,为您搜罗最具权威专业书籍,更多图书推荐请关注每日读书。 好知识需要分享,如您有喜欢的书籍想与广大开发者分享,请在文章下方评论留言,我们将为大家推荐您的爱书!
文章
机器学习/深度学习  ·  算法框架/工具  ·  TensorFlow  ·  计算机视觉  ·  人工智能
2019-08-29
神经网络和数学之间的联系在哪里?看完你就明白
在我们了解过神经网络的人中,都了解神经网络一个有很常见的训练方法,BP 训练算法。通过 BP 算法,我们可以不断的训练网络,最终使得网络可以无限的逼近一种我们想要拟合的函数,最终训练好的网络它既能在训练集上表现好,也能在测试集上表现不错! 那么 BP 算法具体是什么呢?为什么通过 BP 算法,我们就可以一步一步的走向最优值(即使有可能是局部最优,不是全局最优,我们也可以通过其它的方法也达到全局最优),有没有一些什么数学原理在里面支撑呢?这几天梳理了一下这方面的知识点,写下来,一是为了记录,二也可以分享给大家,防止理解错误,一起学习交流。 BP 算法具体是什么,可以参考我这篇文章知乎专栏(详细的将 BP 过程走了一遍,加深理解),那么下面解决这个问题,为什么通过 BP 算法,就可以一步一步的走向更好的结果。首先我们从神经网络的运行原理来看,假如现在有下面这个简单的网络,如图: 我们定义符号说明如下: 则我们正向传播一次可以得到下面公式: 如果损失函数 C 定义为 那么我们希望训练出来的网络预测出来的值和真实的值越接近越好。我们先暂时不管 SGD 这种方法,最暴力的我们希望对于一个训练数据,C 能达到最小,而在 C 表达式中,我们可以把 C 表达式看做是所有 w 参数的函数,也就是求这个多元函数的最值问题。那么成功的将一个神经网络的问题引入到数学中最优化的路上了。 ---------------------------分割线--------------------------- 好,我们现在顺利的将一个神经网络要解决的事情转变为一个多元函数的最优化上面来了。现在的问题是怎么修改 w,来使得 C 越来越往最小值靠近呢。常见的方法我们可以采取梯度下降法(为什么梯度下降法中梯度的反方向是最快的方向,可以参考我下篇文章,不是这篇文章主旨)。可能到这还有点抽象,下面举一个特别简单的例子。 假如我们的网络非常简单,如下图(符号说明跟上面一样): 那么我们可以得到: 其中 只有 w 参数是未知的,那么 C 就可以看做是关于 w 的二元函数(二元函数的好处就是我们可以在三维坐标上将它可视化出来,便于理解~)。 图片来自于网络: 下面走一遍算法过程: 我们先开始随机初始化 w 参数,相当于我们可以在图上对应 A 点。 下面我们的目标是到达最低点 F 点,于是我们进行往梯度反方向进行移动,公式如下: 每走一步的步伐大小由前面的学习率决定,假如下一步到了 B 点,这样迭代下去,如果全局只有一个最优点的话,我们在迭代数次后,可以到达 F 点,从而解决我们的问题。 那么好了,上面我们给出二元函数这种简单例子,从分析到最后求出结果,我们能够直观可视化最后的步骤,那么如果网络复杂后,变成多元函数的最优值求法原理是一模一样的!到此,我结束了该文要讲的知识点了。 欢迎各位朋友指错交流~ ---------------------------分割线--------------------------- 在我学习的时候,我已经理解了上面的知识了,但是我在思考既然我最后已经得到一个关于 w 的多元函数了,那么我为什么不直接对每一个 w 进行求偏导呢,然后直接进行更新即可,为什么神经网络的火起还需要 bp 算法的提出才复兴呢!我的疑惑就是为什么不可以直接求偏导,而必须出现 BP 算法之后才使得神经网络如此的适用呢?下面给出我的思考和理解(欢迎交流~) 1. 为什么不可以直接求导数? 在神经网络中,由于激活函数的存在,很多时候我们在最后的代价函数的时候,包含 w 参数的代价函数并不是线性函数,比如最简单的 这个函数对 w 进行求导是无法得到解析解的,那么说明了无法直接求导的原因。 2. 那么既然我们我们不能够直接求导,我们是否可以近似的求导呢?比如可以利用 根据这个公式我们可以近似的求出对每个参数的导数,间距越小就越接近,那么为什么不可以这样,而必须等到 BP 算法提出来的时候呢?思考中…… 答:是因为计算机量的问题,假设我们的网络中有 100 万个权重,那么我们每一次算权重的偏导时候,都需要计算一遍改变值,而改变值必须要走一遍完整的正向传播。那么对于每一个训练样例,我们需要 100 万零一次的正向传播(还有一次是需要算出 C),而我们的 BP 算法求所有参数的偏导只需要一次反向传播即可,总共为俩次传播计时。到这里我想已经解决了为什么不能够用近似的办法,因为速度太慢,计算复杂度太大了~ 每一次的传播,如果参数多的话,每次的矩阵运算量非常大,以前的机器速度根本无法承受~ 所以直到有了 BP 这个利器之后,加快了神经网络的应用速度。 以上仅个人理解,感谢德川的帮助!欢迎知友提出问题交流~ 以下是我学习用到的资料和博客: 《neural networks and deep learning》需要中文版的欢迎留言邮箱零基础入门深度学习 (1) - 感知器 ====================================分割线================================ 本文作者:AI研习社 本文转自雷锋网禁止二次转载,原文链接
文章
机器学习/深度学习  ·  算法
2017-08-23
小白学CNN以及Keras的速成
一、为何要用Keras 如今在深度学习大火的时候,第三方工具也层出不穷,比较出名的有Tensorflow,Caffe,Theano,MXNet,在如此多的第三方框架中频繁的更换无疑是很低效的,只要你能够好好掌握其中一个框架,熟悉其原理,那么之后因为各种要求你想要更换框架也是很容易的。 那么sherlock用的是哪个框架呢?sherlock使用的是Google的开源框架Tensorflow,因为Google开源了tensorflow之后其社区非常活跃,而且版本更新也非常稳定,所以我就选择了这个框架。对于框架之争,在知乎上已经有很多人在撕逼了,这个就好比哪种编程语言好这个问题一样。对于我们来讲,选择一个稳定的框架,好好的学习deep learning才是重中之重,对于哪种框架更好的问题,我们学好之后自然有自己的见解,所以前期切忌在刷知乎听完大神撕逼之后频繁更换框架。 对于Tensorflow的安装,以及CPU和GPU版本,各种系统的安装网上已经有很多人详细的写过攻略了,可以自己去网上搜一搜,很容易就可以安装成功。 选择了Tensorflow之后,我们就可以愉快的开始我们的深度学习之旅了。去Tensorflow的中文社区,可以看到有一些新手教程,网上也有很多学习材料,推荐看看stanford大学cs224d的课件,http://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf, 很详细的介绍了tensorflow。然后你就可以写tensorflow的程序了。虽然说tensorflow已经是一个封装好的框架,但是你发现你写一个简单的神经网络也需要很多行才能够写完,这个时候,就有很多的第三方插架来帮助你写网络,也就是说你用tensorflow要写10行,第三方插架帮你封装了一个函数,就是把这10行集合在这个函数里面,那么你用1行,传入相同的参数,就能够达到10行相同的效果,如此简便并且节约时间,可以帮助很快的实现我们的想法。 Keras Documentation 就是Keras的官方文档,里面可以查阅所有的函数,并且可以在github上看他的开源代码,非常方便。安装也很简单,打开终端,输入pip install keras 就可以等待安装了。 下面就给一个简单的例子,来看一看Keras到底有多简单。 from keras.models import Sequential model = Sequential() 引入sequential,这个就是一个空的网络结构,并且这个结构是一个顺序的序列,所以叫Sequential,Keras里面还有一些其他的网络结构。 from keras.layers import Dense, Activation model.add(Dense(units=64, input_dim=100)) model.add(Activation('relu')) model.add(Dense(units=10)) model.add(Activation('softmax')) 可以看到加入层很简单,只需要写.add,后面是要加的层的类型。 model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) 一旦你写好了网络之后,就可以用compile编译整个网络,看参数设置有没有问题 model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True)) 你也可以自定义其中的优化函数,就像上面这样,’sgd’是Keras已经写好了一些默认参数的优化函数,你可以自己重新定义参数,得到一个优化函数。 model.fit(x_train,y_train,epochs=5,batch_size=32) 这个就像scikit-learn一样训练模型。 loss_and_metrics=model.evaluate(x_test,y_test,batch_size=128) 这个就是评估训练结果。 classes=model.predict(x_test,batch_size=128) 或者是通过predict进行预测。 看了上面的代码,相信很多熟悉scikit-learn的同学都很亲切,因为确实很简便,跟scikit-learn也有着类似的语法。 二、开始学习CNN 在理解CNN之前,我们有必要先理解一下什么是神经网络,这样才能开始了解更高级的卷积神经网络。 要学习神经网络当然有很多途径,网上不少的大牛写了很多攻略,有的推崇从理论到工程完成深度学习,有的希望从工程出发发现问题,解决问题。各种各样的方式都有不同的人去尝试,攻略也是一大推,这使得不少的小白直接倒在了选择材料的路上,一直在补先修知识,待到热情结束就放弃了学习,连卷积网络都不知道是什么,大大地打击了大家的学习热情。今天,sherlock在这里给大家推荐一个学习材料,保证你能够快速入门cnn,出去装逼也能够和别人聊几句。 这个材料是什么呢,就是大名鼎鼎的standford的cs231n这门课程。 CS231n Convolutional Neural Networks for Visual Recognition  stanford大学确实算是深度学习和人工智能领域非常牛逼的学校。 神经网络 废话不多说,开始学习我们的神经网络。 这是一张脑神经的图片,神经网络的发明也是由此开始的,这就是所谓的一个神经元,上面有各种接受突触,然后通过一个脑神经来接受,最后得到输出的结果。 那么由这张脑神经图能够抽象出来的神经网络是什么呢?就是下面这个神经网络模型。 这个怎么理解呢?就是输入一个向量,然后给向量的每一个元素分配一个权重,然后通过权重求和得到一个结果,然后将这个结果输入一个激活函数,得到最后的输出结果。 激活函数又是什么鬼?激活函数的出现是因为人脑的构造,人脑里面接受信息得到结果这个过程是非线性的,比如你看到一样东西,你不可能保留这个东西的全部特征,你会重点观察你感兴趣的地方,这就是非线性的,也就是说需要一个非线性变化将输入的结果变换为非线性的结果。现在常用的非线性函数就是Relu(x) = max(x, 0),就是将小于0的部分去掉,只保留大于0的部分。 这就是单元的输入和输出,将这些单元合在一起就是一个神经网络。 这就是简单的一层网络,也可以由多层网络 这里面的input layer就是所谓的单个训练集的维数,将所有的训练集输入就可以开始训练一个神经网络。 Keras实现简单的神经网络 知道了神经网络的基本结构和原理,我们就可以开始使用keras去实现一个简单的神经网络。 import keras from keras.models import Sequential from keras.layers import Dense import numpy as np 导入必要的package x=np.array([[0,1,0],[0,0,1],[1,3,2],[3,2,1]]) y=np.array([0,0,1,1]).T 设定输入的x和y simple_model=Sequential() simple_model.add(Dense(5,input_shape=(x.shape[1],),activation='relu',name='layer1')) simple_model.add(Dense(4,activation='relu',name='layer2')) simple_model.add(Dense(1,activation='sigmoid',name='layer3')) 输入一个三层的神经网络,中间的hidden layer的元素个数是5和4,最后一层输出一个结果 simple_model.compile(optimizer='sgd',loss='mean_squared_error') complie这个简单的模型 simple_model.fit(x,y,epochs=20000) 训练20000次模型 simple_model.predict(x[0:1]) 可以预测一下第一个输入的x的结果与实际的是否相符。 上面就是一个简单三层网络的keras实现,接下来我们将正式进入Convolutional Neural Network 三、Convolutional Neural Network 前面给大家推荐了一门好课cs231n,本篇文章也是按照这个思路来的。 基本结构 首先解释一下什么是卷积,这个卷积当然不是数学上的卷积,这里的卷积其实表示的是一个三维的权重,这么解释起来可能不太理解,我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网络结构上面的差别,也可以理解为卷积网络是立体的,而一般的网络结构是平面的。 卷积层 了解完了基本的结构之后,我们就要了解cnn最重要的一个部分,也是最为创新的一个部分,卷积层。首先用一张图片来比较一下卷积网络到底创新在什么地方。 我们通过这个结构就可以清晰地看到卷积网络到底是怎么实现的。首先右边是传统的网络结构,在前面我们已经详细的解释过了。而左边的图片,我们首先看看图中最左边的结构,你肯定会好奇为什么是32x32x3的一块立体方块。这个32x32代表的是像素点,说白了也就是图片的大小,这个大小是你可以设置的,你可以设置为50x50,也可以是256x256,这都取决与图片的大小,那么3表示什么呢?3其实表示的是RGB的三个通道,RGB也是什么?RGB表示red,green,blue,这三种颜色的各种组合叠加可以形成各种各样的颜色,所以任何一张照片都可以用左边这种图形来表示。 那么中间这个小方块又表示什么呢?这个就是我们要重点讲的卷积。所谓的卷积,就是这种小方块,我们设置一个小方块的大小,但是这个小方块的厚度必须和左边的这个大方块的厚度是一样的,大方块每一个像素点由一个0到255的数字表示,这样我们就可以赋予小方块权重,比如我们取小方块的大小是3x3,我们要求厚度必须要和左边的大方块厚度一样,那么小方块的的大小就为3x3x3,我们就可以赋予其3x3x3个权重,然后我们就可以开始计算卷积的结果,将小方块从大方块的左上角开始,一个卷积小方块所覆盖的范围是3x3x3,然后我们将大方块中3x3x3的数字和小方块中的权重分别相乘相加,再加上一个偏差,就可以得到一个卷积的结果,可以抽象的写成Wx+b这种形式,这就是图上所显示的结果,然后我们可以设置小方块的滑动距离,每次滑动就可以形成一个卷积的计算结果,然后将整张大图片滑动覆盖之后就可以形成一层卷积的结果,我们看到图中的卷积结果是很厚的,也就是设置了很多层卷积。总结来说,每层卷积就是一个卷积核在图片上滑动求值,然后设置多个卷积核就可以形成多层的卷积层。 池化层 讲完卷积层,接下来就要讲一下池化层。为什么会有池化层的出现呢?是因为不断的做卷积,得到的中间结果会越来越厚,卷积就相当于提取图片中的特征,所以卷积层一般会设置得越来越厚,不然你就无法从前面的结果来提取更多的特征。这样就会导致中间的结果会越来越大,计算会越来越慢,所以提出了池化层。 所谓的池化层,就是将图片的大小缩小的一种处理方式。我们可以先看看下面的图片。 通过这个图片,我们可以清楚地看到池化层是怎么处理的。池化层也是需要先设置一个窗口,但是这个小窗口的厚度是1,而不再是前一层输出的结果的厚度。然后有两种处理方式,一种是取这个小窗口里面所有元素的最大值来代表这个小窗口,一种是取平均值,然后将小窗口滑动,在第二的位置再做同样的处理,上层网络输出方块的每一层做完之后就进入这个大方块的下一层做同样的操作,这个处理办法就可以让整个大方块的大小变小,可以看看上面的图片的左边。右边是一个简单的一层厚度,取最大值的例子。 实现Lenet 讲完了卷积网络的基本结构之后,你是不是已经迫不及待希望能够实现一个简单的神经网络了呢?卷积网络发展的特别迅速,最早是由Lecun提出来的,Lenet成为cnn的鼻祖,接下来他的学生Alex提出了层数更深的Alexnet,然后2013年又提出了VGGnet,有16层和19层两种,这些都只是在层数上面的加深,并没有什么其他的创新,而之后google提出了inception net在网络结构上实现了创新,提出了一种inception的机构,facebook ai 实验室又提出了resnet,残差网络,实现了150层的网络结构可训练化,这些我们之后会慢慢讲到。 接下来我们就来实现一下最简单的Lenet,使用mnist手写子体作为训练集。 import keras from keras.datasets import mnist (x_train, y_train), (x_test,y_test) =mnist.load_data() 导入必要的库和数据集 x_train=x_train.reshape(-1,28,28,1) x_test=x_test.reshape(-1,28,28,1) x_train=x_train/255. x_test=x_test/255. y_train=keras.utils.to_categorical(y_train) y_test=keras.utils.to_categorical(y_test) 处理数据,让数据的shape是(28, 28, 1),然后label做一个one-hot encoding处理,比如类别是3,那么变成[0, 0, 1 ,0, 0, 0, 0, 0, 0, 0]。 from keras.layers import Conv2D,MaxPool2D,Dense,Flatten from keras.models import Sequential lenet=Sequential() lenet.add(Conv2D(6,kernel_size=3,strides=1,padding='same',input_shape=(28, 28, 1))) lenet.add(MaxPool2D(pool_size=2,strides=2)) lenet.add(Conv2D(16,kernel_size=5,strides=1,padding='valid')) lenet.add(MaxPool2D(pool_size=2,strides=2)) lenet.add(Flatten()) lenet.add(Dense(120)) lenet.add(Dense(84)) lenet.add(Dense(10,activation='softmax')) 构建lenet lenet.compile('sgd',loss='categorical_crossentropy',metrics=['accuracy']) 编译 lenet.fit(x_train,y_train,batch_size=64,epochs=50,validation_data=[x_test,y_test]) 训练50次,得到结果如下 lenet.save('myletnet.h5') 可以保存训练好的模型 总结 OK, 这就是我们写的一个超级简单的Lenet,训练50次得到的训练准确率已经达到0.9939,测试准确率达到0.9852。 欢迎关注我的知乎专栏,深度炼丹 欢迎关注我的github主页 欢迎访问我的博客 这篇文章的代码都已传到了github上SherlockLiao/lenet ====================================分割线================================ 本文作者:思颖 本文转自雷锋网禁止二次转载,原文链接
文章
机器学习/深度学习  ·  TensorFlow  ·  算法框架/工具
2017-08-23
跳转至:
雷锋网
32 人关注 | 0 讨论 | 4445 内容
+ 订阅
查看更多 >
阿里云E-MapReduce
2034 人关注 | 79 讨论 | 395 内容
+ 订阅
  • StarRocks X Flink CDC,打造端到端实时链路
  • EMR-StarRocks 白皮书来啦!
  • 技术揭秘 | 阿里云EMR StarRocks 线上发布会预约开启!
查看更多 >
每日读本书
137 人关注 | 0 讨论 | 60 内容
+ 订阅
  • 送书福利!从《模型思维》学做一个多模型思考者
  • 你不可错过的4本区块链必读进阶书籍
  • 带你读《Java并发编程的艺术》之三:Java内存模型
查看更多 >
Python中文社区
806 人关注 | 7 讨论 | 144 内容
+ 订阅
查看更多 >
AI有道
0 人关注 | 0 讨论 | 214 内容
+ 订阅
查看更多 >