求暮光之城全集纯英文字幕!!!百度云网址谢谢O(∩_∩)O

家里同时接10台电脑上网,需要什么设备?-带连接10台电脑,需要些什 _最新参考文摘
没有你要的?请搜索……
你现在正在浏览:
家里同时接10台电脑上网,需要什么设备? 带连接10台电脑,需要些什
家里同时接10台电脑上网,需要什么设备?
相关说明:
谢谢大家,看上TP-LINK TL-R1660+这款了,16口的路由,带限速,不知道怎么样
你的宽带营运商如果允许你10台电脑共享上网的话,路由可以共享外网。可以去电脑城了解下,你就可以去接路由设置共享。)。可以买个8口路由加一个8口交换机。可以限制流量的就不太清楚了、辐射不清楚,路由器用网线接交换机,多余出来的接口就可以拉线出去接电脑了。一起200多块钱,猫用网线连路由器。2。路由器和交换机一般TPlink就可以了、交换机接好后、用路由共享的话。交换机应该无法限速吧,是不需要设置主机的。这个不太清楚。3。交换机只能建内部局域网(交换机接路由后可以共享外网、限制流量的路由器应该有1,价格太高了。一个4扣路由加一个8口交换机、密码、路由、路由器与交换机的区别在于。5,就能满足你的需求了:电话线接猫、连接方式,猫。4、带IP限速。电扇应该不需要,单独的交换机不可以。就ok了。如果需要限制流量那就要看你买的什么路由器了,两个一起200左右吧。然后再路由器里简单设置下账号,好像不需要买16口的路由器吧,价格实惠,去市场上问问吧。然后加一个8口交换机。价格不太了解。具体10台电脑的连接方式很简单的:推荐路由器 TP-LINK TL-WR541G+ 带无线。6。 补充回答。10用户
你要是不想别人管理路由器那你把密码改
了就是了你的问题很大,麻烦,
你买的时候认准一个牌子型号货比三家就是了,定期除下尘。
第一个问题。但是各地方物价不一样。
第四个问题有限制流量的路由,而你
要五台或者更多的电脑同时上网这个时候就要用到交换机了。
第三个问题交换机和路由器的区别就是假如你有一个四口的路由器。
第六个放在楼道上通风良好的地方就行了,你可以直接让卖你路由的人帮
首先10个人2M同时上网的话会很卡。不用配单独配风扇,价格也各不相同,猫加路由(前提是你要有16个接口的路由)就可以了。
第五个猫跟路由连接用的就是普通的网线。
第二个设置路由不用固定主机
1.一般情况可以,有的地方运营商封杀路由就没办法了。2.用路由可以不设主机3.路由器就是加了路由功能的交换机。4.低端路由无此功能,价格600-1500不等5.猫接路由,路由接电脑。不用6.如果不是无线路由,辐射不大
我不是专家,就说些我知道的,不为分,仅供参考1..理论可以,实际不可以,2M带宽大概250KB/S的网速,10个人一起上这个网速,基本卡的脸网页都开不了2。可以3路由器和交换机最重要的区别是,,路由器可以使几台电脑同时使用一个宽带帐号上网,,而交换机不行4。TL-R4148路由器可以,900元左右5,猫合路由器就是直接相连,据我所知,路由器和交换器散失选一个连,不是连载一起6。电子产品都有辐射,但很小的,除非一天到晚坐那,基本没什么,你如果24小时开着就要降温,如果中间能间歇几个小时关的完全没有必要
1.可以.不过2M带宽10个人用,会慢得让人发疯的!!!2.不用设主机,只要在路由器中设置自动拔号即可3.最好是猫+四口路由+16口交换机,这样组网较灵活.4.有些路由器有限速功能,具体价格可去太平洋网,中关村在线等查询5.如果有16口路由,就不需交换机6.有线路由辐射不大,发散也不很厉害,放通风地方即可QQ
一个路由器(最好是无线路由器)+一个至少8个接口的交换机。比如 TP-Link SF1008+ 大概75块钱。一个路由器大概也就75块钱都可以了。比如水星网络 MW310R
大概72块钱。一般路由器有4个接口再加交换机上的8个就有12个外接口了,有两个口作为路由器和交换机的连接口就不算了,刚好可以有线连接十台电脑。如果你有笔记本,手机等平板电脑,也可以使用无线路由器上的无线网络!这是最划算的方法。
如何用一个网口使10台电脑接入网络 需要哪些设备:
一个交换机,十一根网线,不贵,简单操作,插上去就能用,无需设置。 本回答...1
2010-08-...
10台电脑上网用什么方法才能控制网速不会卡:
多少M 的带宽,理论上 路由器可以分配带宽,但是 路由器需要经常重启,否则相当影响速度 其次 尽量不...
同一个宽带账户,十来台电脑要装上网管理器吗?装上这个有什么用吗?:
除非企业对员工有严格的绩效考核,或者处于保密,否则应该不用
宿舍10台电脑,用交换机连接后为什么只能有两台同时上网?:
额 这个跟联通有什么关系啊~我的也是联通的线路8兆的网线大概有6个人在用~ 都能同时上网 路由上使用...
家庭用中国电信20兆光纤宽带,怎么样能正常同时使用10台电脑。:
家庭用中国电信20兆光纤宽带,怎么样能正常同时使用10台电脑。您好: 你要共享上网要用路由器和交换机...
买好10台电脑后该怎么安装网络,需要买什么设备:
1:买一个无线路由器和一个交换机,若干网线。交换机的话至少要11个口,12......
工作室有10多台电脑 每台都要拨号上网 就是要去电信牵10多条网线 有什么设备可以直接 接到电脑上:
一个猫进来 然后接到路由器 路由器再接到交换机 电脑都链接到交换机上就可以 多少电脑就买接口足够的交...
一个办公室有10台计算机,准备连接组网,并连接到因特网。请写出所需的所有网络设备:
去电脑城买个无线路由器,然后去电信申请ADSL,让他们帮忙设置一下就OK
公司有10台电脑,分出10条网线,都可以上网了。然后在10条网线中的一条网线接一个路由器,:
如果是路由器的话 wan端口不用接任何网线,只需直接把10条网线中的一条插到路由器上非wan端口的任...
单位里有十台电脑共用一个电信宽带。无线路由器还有其他的线之前都是插的好好的。现在又不能上网了。请问:
先用单独的一台电脑接上外线,拨号上网试试,如果能正常上网,那说明外线没事儿,无线路由器你用的是什么型...
也许你也感兴趣的内容扫一扫,上赶集群组
扫码使用“赶集群组”
交友&&寻爱&&找工作
聊天&&聚会&&不寂寞
信号强劲,没有任何问题,站闲置了,便宜出!
其他人还在看
其他人还在看
关注热点:
网友热搜:&p&&img src=&/4d3c39df8e2d6c90accaa_b.jpg& data-rawwidth=&3264& data-rawheight=&2448& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/4d3c39df8e2d6c90accaa_r.jpg&&谢邀,按照我们团队的内部会议评定标准和个人参会演讲经历讲一讲吧。这几年大概讲过这些比较大的会议,先讲大陆外的。&/p&&img src=&/v2-70e60eabe95c54d26cded_b.png& data-rawwidth=&2112& data-rawheight=&1556& class=&origin_image zh-lightbox-thumb& width=&2112& data-original=&/v2-70e60eabe95c54d26cded_r.png&&&br&&h1&Tier One(以下排名不分先后):&/h1&&br&&h2&BlackHat USA&/h2&&br&&p&工业界第一会议,毋庸置疑。规模最大,研究方向众多,参会人数最多,业界关注度最高。Blackhat USA作为全球顶尖的安全技术会议,是全球安全圈每一位研究者都梦想登上的舞台,也是全球安全界的盛大集会。Blackhat还没开始前邮箱里已经有五六个Party/Meetup的邀请了,包括来自于Google, Microsoft, Qualcomm, Facebook和BASec这样的华人大拿聚会。&/p&&br&&p&BlackHat USA上有哪些东西?&/p&&br&&p& Blackhat按日程分为三个部分:最早开始的是training。这一般是业界大佬来作为讲师,对某个方向做手把手的深入指导。当然学费也相当不菲,几千刀小意思,其中有很大一部分是作为了Blackhat主办方的分成。当然现在随着各大公司对信息安全的重视程度提高,很多人也以公费留学的形式来参加培训,这次来我也看到了很多3BATH的人员公费派来学习,挂着Training牌子。早些年信息安全还没这么火的时候,现在业界一些顶级大牛曾经不远万里自费来training学习,这种动力或许也是他们如今能站在技术之巅的原因。&/p&&br&&p& Training之后就是万众瞩目的Briefings了。Arsenal也和Briefings同时进行,同时在Business Area还有各大安全厂商的现场宣讲活动(无论是招人还是给产品做广告。相对来讲招人的会比较含蓄,卖产品的则五花八门招数应有尽有)。
Briefings分为25分钟和50分钟,还有100分钟的Workshop。其中25分钟今年开始提供机票但不提供住宿,50分钟则是全包,讲师费也多一倍。50分钟的Topic一般投的人会更多些,也相对更难中选,毕竟主办方要出更多的钱,而25分钟slot比较多,也相对好中一些。像国内的盘古团队是年年都中50分钟,非常厉害。今年投稿人数再创新高,根据官方消息中选率约在1/7,总共700多篇投稿选中了100多篇。&/p&&br&&p&Briefings一旦中选则会给所有的Speaker提供门票,所以往年也有一个Session下面挂了七八个演讲者的情况。Blackhat虽然不赞许这种做法但是最后也容忍了。
主办方会根据Topic的热门程度决定演讲的房间大小。最大最炫酷的当然是Keynote所在的地方,也就是Jeff Moss(Blackhat创始人)开场让大家high起来的地方,可以坐下几千人也就这一个房间有跟踪拍摄实时投影,简直不能更帅。&/p&&br&&p&附几张现场图片,有兴趣的同学可以看我去年去演讲的时候写过的专栏:&/p&&p&(&a href=&/p/& class=&internal&&知乎专栏&/a&: 白帽赌城演讲记:Trend, Tech, Team,还有打枪)&/p&&img src=&/f9bdc1af391ad98a3dea4_b.jpg& data-rawwidth=&2448& data-rawheight=&3264& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/f9bdc1af391ad98a3dea4_r.jpg&&&img src=&/b93fcac630f43fde71da_b.jpg& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/b93fcac630f43fde71da_r.jpg&&&img src=&/838fafc9e5dd89c3c17545_b.jpg& data-rawwidth=&720& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&/838fafc9e5dd89c3c17545_r.jpg&&&br&&p&去年还在那边顺便参加了Googe和Qualcomm的researcher party,Google请了一顿牛排,送了一个Pixel C笔记本,一个Nexus 5X,用这两个设备又挖了不少漏洞233.&/p&&br&&p&在现场还有Pwnie Award颁奖典礼,也是业界关注的一件大事。可惜现场主持人大佬们老喜欢开美式笑话,中国人理解不能。。&/p&&br&&img src=&/v2-c1506e80abe5996a92ecae9ab2e075ae_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-c1506e80abe5996a92ecae9ab2e075ae_r.jpg&&&img src=&/v2-fac0580abcf087eb9f53_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-fac0580abcf087eb9f53_r.jpg&&&p&拉斯维加斯也是个非常适宜于娱乐的地方,吃喝X赌打枪一应俱全,X这个请老司机来解答,我什么都不知道,其他的例如找个靶场实弹射击还是很high的。在那边打了M16, AK47, Glock, SCAR Red dot.&/p&&br&&p&乱入,打枪的时候碰到的美女233&/p&&img src=&/v2-2c823a21d3e5cfab0fa3_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-2c823a21d3e5cfab0fa3_r.jpg&&&br&&h2&学术界四大安全会议: Oakland, CCS, USENIX, NDSS&/h2&&br&&p&这四个会议是信息安全学术界的顶级会议。和国内一些安全学术界固步自封于密码学、合规之类的不同,国外安全圈还是有很多实干型研究的。ROP, ASLR, ret2dir, Control Flow Guard,
这些引领一时风骚的攻击技术都是在这些学术会议上最先被公布的。&/p&&br&&p&2015年我们团队的Wen Xu(前交大ACM班,Oops前副队长,现Georgia Tech PhD candidate) 通过Pingpong Root (CVE-)的杰出研究中选CCS,该成果也发表在了BlackHat USA 2015,得到了广泛认可。&/p&&br&&p&不过国内工业界的人士一般不太会有机会去这种会议,但建议把这些会议的论文都仔细读一读,非常有价值。&/p&&br&&h1&Tier Two:&/h1&&br&&h2&CanSecWest&/h2&&br&&img src=&/v2-b53fbaa2a6cb_b.jpg& data-rawwidth=&500& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-b53fbaa2a6cb_r.jpg&&&br&&p&在加拿大温哥华举办,老牌安全会议,主要关注二进制安全,包含Training和Briefings。随CanSecWest一起举办的Pwn2Own更是全球黑客顶级赛事。&/p&&p&&img src=&/v2-8a54ffafaec7abb30d9ea9_b.jpg& data-rawwidth=&1188& data-rawheight=&730& class=&origin_image zh-lightbox-thumb& width=&1188& data-original=&/v2-8a54ffafaec7abb30d9ea9_r.jpg&&(Pwn2Own上每一次攻破都激动人心)&/p&&p&去年我们在CanSecWest发表了对Apple Graphics的研究成果。&/p&&br&&img src=&/v2-c8bdaf71136_b.jpg& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-c8bdaf71136_r.jpg&&&br&&p&会场比BlackHat的小,但是大拿还是非常多。温哥华也是一个很漂亮的城市,有很多华人,Stanley Park也是会后散心好去处,downtown的越南米粉也是相当好吃。(去年我们打Pwn2Own之前在酒店通宵了两天,饭都是711盒饭解决,比赛打完才出去看了看风景)&/p&&br&&h2&RECON (&a href=&///?target=https%3A//recon.cx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RECON.CX&i class=&icon-external&&&/i&&/a&)&/h2&&br&&img src=&/v2-d358e1e536bda79ae23202_b.jpg& data-rawwidth=&828& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&828& data-original=&/v2-d358e1e536bda79ae23202_r.jpg&&&br&&p&北美顶尖二进制安全峰会,在加拿大蒙特利尔举办,偏向于底层(操作系统,硬件,固件安全)。我们去年在会上分享了Pwn2Own 2016中我们使用的内核漏洞。国外的会议和国内的会议有一个很大的不同点是,国外会议不会有赠票。想有票要么去投稿中了当Speaker,自然有门票。要么老老实实买票。所以在国外会议上,基本不会有国内这种人在上面讲,下面听的都跑出去唠嗑的现象。我们甚至在会场发现一个残疾人士依然坐着轮椅来现场听讲,令人感慨。&br&&img src=&/v2-f8faf24740fdc7b94ab1a_b.jpg& data-rawwidth=&3264& data-rawheight=&2448& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/v2-f8faf24740fdc7b94ab1a_r.jpg&&&img src=&/v2-53a31de6c2a7853dfa7d60_b.jpg& data-rawwidth=&3264& data-rawheight=&2448& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/v2-53a31de6c2a7853dfa7d60_r.jpg&&&/p&&br&&img src=&/v2-61e771f8b17a95da9506bfdcbc9b80eb_b.jpg& data-rawwidth=&2448& data-rawheight=&3264& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/v2-61e771f8b17a95da9506bfdcbc9b80eb_r.jpg&&&br&&p&我们在现场和Alex Ionescu (Windows圣经 Windows Internals作者, Windows内核第一专家,传闻微软专门把Windows源代码开放给了他)的合影。&br&&img src=&/v2-a90e70c6ae_b.jpg& data-rawwidth=&3264& data-rawheight=&2448& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/v2-a90e70c6ae_r.jpg&&&/p&&br&&p&蒙特利尔也是一个很美丽的地方,风景空气都让人心旷神怡,感叹下天朝…&br&&img src=&/v2-e0fd3f8b7b65abc4cf24da_b.jpg& data-rawwidth=&2448& data-rawheight=&3264& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/v2-e0fd3f8b7b65abc4cf24da_r.jpg&&&img src=&/v2-1b1c8d19bcbf_b.jpg& data-rawwidth=&2448& data-rawheight=&3264& class=&origin_image zh-lightbox-thumb& width=&2448& data-original=&/v2-1b1c8d19bcbf_r.jpg&&&/p&&br&&h2&DEFCON&/h2&&br&&img src=&/v2-f3cbd8f874f5f38115c2_b.png& data-rawwidth=&807& data-rawheight=&363& class=&origin_image zh-lightbox-thumb& width=&807& data-original=&/v2-f3cbd8f874f5f38115c2_r.png&&&br&&p&DEFCON和BlackHat USA一般都是前后脚举办。相对于BlackHat的逼格高大上,DEFCON则更像是一个安全大party,全民运动。在会场既可以看到白发苍苍的穿着 DEFCON 4纪念Tshirt的老大爷(DEFCON 4举办于1996年),也可以看到穿着DEFCON kids/girls衣服的被家长带去各个village黑客从小学抓起的小朋友们。Village里什么都搞,开锁,Car Hacking,etc…&br&Briefings里分享的话题也各式各样,但实战的话题永远最受人欢迎。我们去年分享了关于各种Sandbox bypass的技巧和原理,下来之后朋友告诉我一直到结束外面还有人在排队没挤进去。。&br&&br&&img src=&/v2-389a230a63f03c9af2bbbf_b.jpg& data-rawwidth=&3862& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&3862& data-original=&/v2-389a230a63f03c9af2bbbf_r.jpg&&&/p&&br&&p&Badge别具一格&br&&img src=&/v2-4ce117fb27fd73fbfa7fc_b.jpg& data-rawwidth=&727& data-rawheight=&1081& class=&origin_image zh-lightbox-thumb& width=&727& data-original=&/v2-4ce117fb27fd73fbfa7fc_r.jpg&&&/p&&br&&img src=&/v2-d2b3dd349d_b.jpg& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-d2b3dd349d_r.jpg&&&br&今年的DARPA CGC环节引入到了DEFCON CTF中,以Rise of the machine为主题,力图考察自动化挖掘和利用漏洞的研究,虽然最终机器由于比赛协议问题没能取得佳绩,但是还是大大推动了漏洞挖掘技术的发展。&br&&br&DEFCON CTF比赛中的蓝莲花,友情出镜我浙学弟zyf 清华大佬MaskRay&br&&img src=&/v2-dbdb99f3a508d_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-dbdb99f3a508d_r.jpg&&&br&CGC比赛现场&br&&img src=&/v2-8c5c2fedda_b.jpg& data-rawwidth=&1800& data-rawheight=&1200& class=&origin_image zh-lightbox-thumb& width=&1800& data-original=&/v2-8c5c2fedda_r.jpg&&&br&&h2&Qualcomm Security Summit&/h2&&br&高通举办的一年一度的移动安全会议,因为高通的号召力,基本业内所有安卓大佬都集齐了。会上干货满满,会后还会组织打paint ball,也是保留节目。我们去年分享了sandbox bypass和rooting两个议题。&br&&img src=&/v2-038d09c5ee6bedc2e7ae31d3f95d9047_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-038d09c5ee6bedc2e7ae31d3f95d9047_r.jpg&&&img src=&/v2-5b5bf984f8c0ff5b2132414dffe3dd67_b.jpg& data-rawwidth=&1024& data-rawheight=&766& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-5b5bf984f8c0ff5b2132414dffe3dd67_r.jpg&&&br&Android Security的老大:&br&&img src=&/v2-eca1fd6fa97f9100791de_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-eca1fd6fa97f9100791de_r.jpg&&我们团队的retme和jfang&br&&img src=&/v2-dfc2fb00b05a509ae0ebf9f181cb7c85_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-dfc2fb00b05a509ae0ebf9f181cb7c85_r.jpg&&高通园区和他们自己搞的一个自动行走机器人。&br&&img src=&/v2-8f351f54edf064cee2d6_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-8f351f54edf064cee2d6_r.jpg&&&img src=&/v2-0aeec07cc5cdcf18636d8a_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-0aeec07cc5cdcf18636d8a_r.jpg&&&br&&p&待续:&/p&&br&&h2&BlackHat Europe&/h2&&br&BlackHat在欧洲的分会,在阿姆斯特丹或者伦敦举办。在每年11月份左右举办。相对于USA逊色一些,但依然是欧洲地区顶级会议之一。我们团队的retme和jfang今年在BlackHat EU发表了 关于Android Rooting的演讲,主要涉及到厂商定制的Android内核中wireless extension代码引发的漏洞。&br&&br&阿姆斯特丹有两个东西世界闻名, 去那里开会的时候可以体验一下。&br&&h2&Infiltrate&/h2&这个会议国内知名度比较低,但事实上也是北美地区的顶会之一,每年都是各种大佬云集。在Miami主办方包5天4夜的住宿,风景宜人,冲浪也是好去处。这个会议一个特点是选稿使用投票制,主办方初审投稿之后会公布出来,由大家投票决定。&br&&br&因为老外们一般都比较直接,一些不太好的议题如果也在投票列表中,会被评论喷的很惨,实在是悲剧啊。&br&&h2&Zeronights&/h2&老毛子办的会,主要面向欧洲区域。我们团队的Peter,Marco,聂博都在Zeronights发表过演讲。&br&&h2&BlackHat Asia&/h2&&br&Blackhat在新加坡的亚洲分会场,一般在每年3、4月份举行。会场相对于USA主会场的奢华小了不&br&少,亚太地区的人参加的比较多。算是BlackHat三个区域中最小的一个了。去年我在会上分享了android binder攻击的议题。&br&&img src=&/v2-caddd0b5ff_b.jpg& data-rawwidth=&768& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-caddd0b5ff_r.jpg&&&img src=&/v2-4ce8d4f593e280dbfab755_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-4ce8d4f593e280dbfab755_r.jpg&&可能唯一的好处就是主办方提供的酒店是著名的新加坡Marina Bay Sands, 演讲之余可以体验下空中之船和空中泳池。&br&&h2&&br&HITB (Hack in the box, Singapore & Amsterdam)&/h2&HITB也是老牌会议,每年举办两次。其中HITB Singapore也是投票CFP制度,和Infiltrate有些类似。不过Amsterdam那场最近受BlackHat EU冲击有点大。&br&&h2&POC (Power of community)&/h2&韩国的新兴会议,最近几年质量稳步提升,也在承办Pwn2Own类似的比赛。韩国人的个性还是很认真务实的,会议质量也比较高。去年我和同事分享了Mobile Pwn2Own用到的一些研究成果。&br&&img src=&/v2-c464c6d7ba0d8ade090fca1604d2bee4_b.jpg& data-rawwidth=&1280& data-rawheight=&852& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-c464c6d7ba0d8ade090fca1604d2bee4_r.jpg&&&br&主办方的韩国妹子。&br&&img src=&/v2-f67d5eab79bdf_b.jpg& data-rawwidth=&1280& data-rawheight=&852& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-f67d5eab79bdf_r.jpg&&&br&&h1&Tier Three:&/h1&&br&&h2&HITCON&/h2&&br&HITCON之前分为community和enterprise两个分会场,类似于DEFCON和BlackHat的组合。但今年的HITCON因为政治因素,导致很多演讲者都没去成,逊色了不少,成色有所下降。在之前堪称大中华区第一安全会议,吸引了很多国际演讲者。&br&&br&2015年我在HITCON做过演讲,还是体验很好的。那一年geohot在现场做了keynote speech,介绍了他新开发的利器实时程序追踪框架qira,适合逆向和编写exp时的调试,现场参加的人也非常多,会议整体氛围不输于国外会议。&br&&br&&br&&img src=&/v2-7b1cbba87f21cd3f91176bbffe655e00_b.jpg& data-rawwidth=&2048& data-rawheight=&1367& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&/v2-7b1cbba87f21cd3f91176bbffe655e00_r.jpg&&&br&&img src=&/v2-fd015b087389eacfbd2c4cbea966daed_b.jpg& data-rawwidth=&2048& data-rawheight=&1367& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&/v2-fd015b087389eacfbd2c4cbea966daed_r.jpg&&&br&&br&&h1&适合普通开发者入门的会议:&/h1&&br&现在一般大的软件开发会议也都有安全分会场,例如QCON,会比较浅显易懂,适合开发者了解和入门。议题一般注重安全开发,安全产品和安全响应体系建设等. 2014年我在QCON分享了基于程序分析的Android App漏洞自动化检测系统的技术要点.
谢邀,按照我们团队的内部会议评定标准和个人参会演讲经历讲一讲吧。这几年大概讲过这些比较大的会议,先讲大陆外的。 Tier One(以下排名不分先后): BlackHat USA 工业界第一会议,毋庸置疑。规模最大,研究方向众多,参会人数最多,业界关注度最高。Blac…
这个方法目前仍然有效!!!教程现写的,图也是刚刚截的。&br&以下为原答案:&br&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&br&看了这个回答下的高票答案,不得不说,弱爆了。&br&百度网盘不限速,只需要IDM即可!!!&br&什么油猴脚本,什么百度网盘客户端,什么破解版,统统都不需要!&br&不限速,只需几步,简单粗暴!&br&1.去官网下载IDM&br&&a href=&///?target=http%3A///download.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&&/span&&span class=&invisible&&/download.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&2.登陆百度网盘网页版&br&&img src=&/v2-70edbe583f78ea6aea975_b.png& data-rawwidth=&905& data-rawheight=&762& class=&origin_image zh-lightbox-thumb& width=&905& data-original=&/v2-70edbe583f78ea6aea975_r.png&&3.将disk改成wap&br&&img src=&/v2-fc7feecf8bb57d6af6aded_b.png& data-rawwidth=&955& data-rawheight=&691& class=&origin_image zh-lightbox-thumb& width=&955& data-original=&/v2-fc7feecf8bb57d6af6aded_r.png&&4.转换成wap界面,随便点一个要下载的文件&br&&img src=&/v2-20b4c65bf65b63b1e27c_b.png& data-rawwidth=&926& data-rawheight=&654& class=&origin_image zh-lightbox-thumb& width=&926& data-original=&/v2-20b4c65bf65b63b1e27c_r.png&&5.&br&&img src=&/v2-d6fa12fc18_b.png& data-rawwidth=&1096& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&1096& data-original=&/v2-d6fa12fc18_r.png&&6.&img src=&/v2-1a85dfc68c1efa9963c92_b.png& data-rawwidth=&906& data-rawheight=&592& class=&origin_image zh-lightbox-thumb& width=&906& data-original=&/v2-1a85dfc68c1efa9963c92_r.png&&7.&br&&img src=&/v2-305d3e45d24a3eaf58e4782306abe875_b.png& data-rawwidth=&991& data-rawheight=&722& class=&origin_image zh-lightbox-thumb& width=&991& data-original=&/v2-305d3e45d24a3eaf58e4782306abe875_r.png&&以后就可以一直用idm下载,大多数情况下可以满速。此方法不受百度网盘版本限制。&br&我用的是firefox火狐浏览器,其他浏览器没试过,听说要跳转。&br&如果有些火狐浏览器仍然要自动跳转的话,不妨试试下面这个插件。&br&&a href=&///?target=https%3A//greasyfork.org/zh-CN/scripts/1E9%5BB%5AD%5E7%5BE%5BA%5E7%2525BD%5E7%2wap%589%5E8%5AA%58A%5E8%5B3%5BD%2525AC& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阻止百度网盘wap版自动跳转&i class=&icon-external&&&/i&&/a&&br&&br&关于idm,我一直用的正版,也是手动破解,不需要什么破解版。
这个方法目前仍然有效!!!教程现写的,图也是刚刚截的。 以下为原答案: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 看了这个回答下的高票答案,不得不说,弱爆了。 百度网盘不限速,只需要IDM即可!!! 什么油猴脚本,什么百…
&p&&b&网盘关闭不用怕:&/b&&/p&&p&&b&利用Docker和OSS轻松搭建ownCloud专属网盘:&/b&
&b&&a href=&///?target=http%3A///m/8688/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/m/8688&/span&&span class=&invisible&&/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
&/b&&/p&&br&&p&网盘关闭了怎么办?如何搭建个人网盘,怎样操作?文件共享是团队协作的刚需,面对说停就停的网盘服务,很多同学除了心塞已经开始盘算搭建自己的网盘应用了。&/p&&p&&a href=&///?target=https%3A//owncloud.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ownCloud&i class=&icon-external&&&/i&&/a& 是一个开源免费的存储管理工具,它能帮你快速架设一套专属的网盘服务,可以像 Dropbox 那样实现文件跨平台同步、共享、版本控制、团队协作等等。然而在VPS上搭建ownCloud是一件费时费力的工作,除此之外更需要考虑数据的可靠性、备份等工作。&/p&&p&本文将利用阿里云容器服务在几分钟内轻松搭建一个基于Docker的ownCloud专属网盘,并使用阿里云提供的对象存储OSS(Object Storage Service,对象存储服务)作为高可靠、低成本的云存储后端。&/p&&h2&创建 对象存储OSS bucket&/h2&&p&首先你需要创建一个和容器服务处于同一区域中的bucket,这样容器应用可以通过内网地址来访问bucket中存储的文件数据,提升访问速度并节省公网带宽&/p&&img src=&/v2-155f55a4b6fe1bff13cd_b.jpg& data-rawwidth=&598& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&598& data-original=&/v2-155f55a4b6fe1bff13cd_r.jpg&&&br&&h2&创建 对象存储OSS 数据卷&/h2&&p&数据卷是Docker提供的容器储存模型:可以实现容器和数据生命周期的解耦,当容器被删除或重建之后数据依然存在;提供了可扩展的插件机制,支持不同的存储实现。&/p&&p&阿里云容器服务内置了针对阿里云的数据卷驱动,支持不同类型的云存储服务:包括NAS(文件存储服务 NFS),对象存储OSS(对象存储服务,OSSFS)和云盘(即将推出)。关于数据卷的详细信息可以参阅&a href=&///?target=https%3A///document_detail/26033.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&帮助文档&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=https%3A///document_detail/32197.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OSSFS&i class=&icon-external&&&/i&&/a& 能把对象存储OSS bucket挂载到本地像访问本地文件一样操作云端存储数据,非常适合文件存储类型的应用。我们可以在容器服务控制台的“数据卷”页面,方便地为指定集群创建一个“OSS”类型的数据卷&/p&&img src=&/v2-9bdcd3efa0e_b.jpg& data-rawwidth=&596& data-rawheight=&601& class=&origin_image zh-lightbox-thumb& width=&596& data-original=&/v2-9bdcd3efa0e_r.jpg&&&p&配置如下:&/p&&p&数据卷名:owncloud ,也可以选择其他值,这个需要和下文模板中引用volume保持一致AccessKey ID和AccessKey Secret:可以从当前用户账号的“accesskeys”中获得&/p&&br&&img src=&/v2-70abb3a9f34cf8febc1fa6e9a3e23b23_b.jpg& data-rawwidth=&269& data-rawheight=&369& class=&content_image& width=&269&&&p&其他参数值:输入 -o noxattr 来提升数据卷性能&/p&&p&访问域名:根据当前集群的网络方式,选择“内网域名”或者“VPC域名”来访问对象存储OSS bucket。&/p&&p&文件缓存:选择 打开 可以提升访问性能&/p&&p&值得注意的是:对象存储OSS和NAS类型的数据卷都是全局(global)数据卷,会出现在集群中任何一个节点上。如果容器指明了重新调度配置,即使所在节点挂掉,可以自动在其他健康节点上重新恢复,而相同数据卷依然可以mount到容器指定目录上,不会导致数据丢失。&/p&&h2&创建编排模板&/h2&&p&在编排模板列表页面,创建如下编排模板&/p&&div class=&highlight&&&pre&&code class=&language-text&&owncloud:
image: owncloud:9
restart: always
- mysql:mysql
- owncloud:/owncloud
aliyun.routing.port_80: 'owncloud'
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: changeme
&/code&&/pre&&/div&&p&注释:&/p&&ul&&li&这里使用了&a href=&///?target=https%3A///_/owncloud/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ownCloud的官方Docker镜像&i class=&icon-external&&&/i&&/a& 和 &a href=&///?target=https%3A///_/owncloud/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL的官方Docker镜像&i class=&icon-external&&&/i&&/a&。ownCloud应用容器利用容器别名mysql来关联MySQL容器。&/li&&li&利用aliyun.routing.port_80: 'owncloud'标签指明了用于访问网盘应用的虚拟域名&/li&&li&利用 volumes 中的数据卷映射,把我们创建出来的对象存储OSS数据卷owncloud挂载到容器的/owncloud目录。&/li&&/ul&&h2&使用编排模板部署ownCloud应用&/h2&&p&选择编排模板,点击部署应用。片刻之后,应用就会部署成功&/p&&img src=&/v2-2ddf35d48b4fde1f7e9ad727dd902f5d_b.jpg& data-rawwidth=&1065& data-rawheight=&474& class=&origin_image zh-lightbox-thumb& width=&1065& data-original=&/v2-2ddf35d48b4fde1f7e9ad727dd902f5d_r.jpg&&&p&选择owncloud服务,并点击访问端点&/p&&img src=&/v2-11ac74d76b4f175e62fa_b.jpg& data-rawwidth=&1059& data-rawheight=&361& class=&origin_image zh-lightbox-thumb& width=&1059& data-original=&/v2-11ac74d76b4f175e62fa_r.jpg&&&p&在浏览器中就可以看到ownCloud的配置界面了
&/p&&img src=&/v2-ad9ef7d794dda27c6b00280_b.jpg& data-rawwidth=&527& data-rawheight=&751& class=&origin_image zh-lightbox-thumb& width=&527& data-original=&/v2-ad9ef7d794dda27c6b00280_r.jpg&&&p&输入管理员账号和密码之后,选择“存储&数据库”进行配置。ownCloud 缺省会使用SQLite作为数据库,并使用本地文件系统来保持数据文件。请按如下界面修改配置
&/p&&img src=&/v2-ef39a8f193bf8f866d76ca_b.jpg& data-rawwidth=&438& data-rawheight=&783& class=&origin_image zh-lightbox-thumb& width=&438& data-original=&/v2-ef39a8f193bf8f866d76ca_r.jpg&&&p&注意:&/p&&ul&&li&数据目录: 输入 /owncloud/data 这里面/owncloud是对象存储OSS bucket在容器中的挂载点&/li&&li&配置数据库:选择 MySQL/MariaDB&/li&&li&数据库用户: 输入 root&/li&&li&数据库密码: 输入编排模板中对应数据库ROOT密码&/li&&li&数据库名称: 输入 owncloud&/li&&li&数据库地址: 输入 mysql 连接MySQL数据库容器&/li&&/ul&&p&点击“安装完成”,片刻之后下面的页面会出现
&/p&&img src=&/v2-0a0b3b526_b.jpg& data-rawwidth=&1179& data-rawheight=&782& class=&origin_image zh-lightbox-thumb& width=&1179& data-original=&/v2-0a0b3b526_r.jpg&&&h2&使用ownCloud应用&/h2&&p&这时候你的专属网盘就成功建立起来了。不但可以上传文件,还可以为文件生成“分享链接”。
&/p&&img src=&/v2-ffef2b5dfc815db_b.jpg& data-rawwidth=&1272& data-rawheight=&660& class=&origin_image zh-lightbox-thumb& width=&1272& data-original=&/v2-ffef2b5dfc815db_r.jpg&&&br&&p&收到链接的小伙伴,就能看到你送来的满满的节日祝福了
&/p&&img src=&/v2-00aa7c8c3b656dd4391da79_b.jpg& data-rawwidth=&1059& data-rawheight=&759& class=&origin_image zh-lightbox-thumb& width=&1059& data-original=&/v2-00aa7c8c3b656dd4391da79_r.jpg&&&br&&p&ownCloud还有很多玩法,本文不再赘述。&/p&&h2&总结&/h2&&p&数据卷是Docker支持有状态应用的重要机制。合理选择不同的数据卷类型可以让你更好地管理应用中的持久化数据。&/p&&p&阿里云容器服务完全兼容Docker数据卷机制,同时内置了对阿里云存储服务的支持,无需编程就可以使用不同的存储能力。&/p&&p&想了解更多容器服务内容,请访问 &a href=&///?target=https%3A///product/containerservice& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&容器服务 Container Service_容器管理-阿里云&i class=&icon-external&&&/i&&/a&&/p&
网盘关闭不用怕:利用Docker和OSS轻松搭建ownCloud专属网盘:
网盘关闭了怎么办?如何搭建个人网盘,怎样操作?文件共享是团队协作的刚需,面对说停就停的网盘服务,很多同学除了心塞已经开始盘算搭建自己的网盘应用了。 是…
&img src=&/v2-ec7616035faa0bea9560b0_b.png& data-rawwidth=&1920& data-rawheight=&651& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-ec7616035faa0bea9560b0_r.png&&&blockquote&&p&&em&本文内容由机器之心编译自谷歌开发者博客的 Codelabs 项目。据介绍,Google Developers Codelabs 提供了有引导的、教程式的和上手式的编程体验。大多数 Codelabs 项目都能帮助你了解开发一个小应用或为一个已有的应用加入新功能的过程。这些应用涉及到很多主题,包括 Android Wear、Google Compute Engine、Project Tango、和 iOS 上的 Google API。&/em&&br&&/p&&/blockquote&&p&&em&本项目的原文可参阅:&a href=&/?target=https%3A//codelabs./codelabs/cloud-tensorflow-mnist/%2313& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&codelabs.&/span&&span class=&invisible&&/codelabs/cloud-tensorflow-mnist/#13&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/em&&/p&&br&&p&&strong&1、概述&/strong&&br&&/p&&img src=&/v2-6f695fb4d6cb5d691f19_b.png& data-rawheight=&790& data-rawwidth=&1401& class=&origin_image zh-lightbox-thumb& width=&1401& data-original=&/v2-6f695fb4d6cb5d691f19_r.png&&&p&在 codelab 项目中,你将学习如何构建并训练出能够识别手写数字的神经网络。在这过程中,当这个神经网络的准确度提升至 99%时,你还会发现深度学习专业人士用来有效训练模型的贸易工具。&/p&&br&&p&这个 codelab 项目使用的是 MNIST 数据集,这个包含 60,000 个有标记数字的集合是几届博士努力近二十年的成果。你将会用不到 100 行的 Python/TensorFlow 代码来解决上述问题。&/p&&br&&p&你将学到:&/p&&p& ①神经网络的定义及如何训练神经网络&/p&&p& ②如何使用 TensorFlow 构建基本的 1 层神经网络&/p&&p& ③如何添加多层神经网络&/p&&p& ④训练提示和技巧:过拟合、dropout、学习速率衰减等...&/p&&p& ⑤如何解决深度神经网络的问题&/p&&p& ⑥如何构建卷积网络&/p&&br&&p&对此,你将需要:&/p&&p& ①Python 2 或 3(建议使用 Python 3)&/p&&p& ②TensorFlow&/p&&p& ③Matplotlib(Python 的可视化库)&/p&&p&安装说明会在下一步中给出。&/p&&br&&p&&strong&2. 准备:安装 TensorFlow,获取示例代码&/strong&&/p&&br&&p&在你的计算机上安装必要软件:Python、TensorFlow 和 Matplotlib。完整的安装说明如下:INSTALL.txt&/p&&br&&p&克隆 GitHub 存储库:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&$ git clone /martin-gorner/tensorflow-mnist-tutorial
&/code&&/pre&&/div&&p&这个库包含了多个文件,而你将只在mnist_1.0_softmax.py中操作。其它文件是用于加载数据和可视化结果的解决方案或支持代码。&br&&/p&&p&当你启动初始python脚本时,应当能够看到训练过程的实时可视化:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&$ python3 mnist_1.0_softmax.py
&/code&&/pre&&/div&&img src=&/v2-37e6edfcc3b3dabd8df1850_b.png& data-rawheight=&900& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-37e6edfcc3b3dabd8df1850_r.png&&&p&疑难解答:如果无法运行实时可视化,或者如果你只想要使用文本输出,则可以通过注释掉一行并取消另一行的注释来禁用可视化。请参阅文件底部的说明。&/p&&br&&p&为 TensorFlow 构建的可视化工具是 TensorBoard,其主要目标比我们在这里所需的更宏大。它能使你能够跟踪你在远程服务器上的分布式 TensorFlow 工作。而对于我们的这个实验,matplotlib 将作为替代,并且我们还有额外收获——实时动画。但是如果你使用 TensorFlow 进行严谨的工作,你一定要试试 TensorBoard。&/p&&br&&p&&strong&3、理论:训练一个神经网络&/strong&&/p&&br&&p&我们首先来观察一个正在训练的神经网络。其代码会在下一节解释,所以现在不必查看。&/p&&br&&p&我们的神经网络可以输入手写数字并对它们进行分类,即将它们识别为 0、1、2……9。它基于内部变量(「权重(weights)」和「偏差(bias)」,会在后面进行解释),需要有一个正确的值来分类才能正常工作。这个「正确的值」通过训练过程进行学习,这也将在后面详细解释。你现在需要知道的是,训练回路看起来像这样:&/p&&br&&p&Training digits =& updates to weights and biases =& better recognition (loop)&/p&&br&&p&让我们逐个通过可视化的六个面板,了解训练神经网络需要什么。&/p&&img src=&/v2-914c6cff8b419ff53b375_b.png& data-rawheight=&500& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-914c6cff8b419ff53b375_r.png&&&br&&p&你可以看到训练数字每次 100 个被送入训练回路;也可以看到当前训练状态下的神经网络是已将数字正确识别(白色背景)还是误分类(红色背景,左侧印有正确的标示,每个数字右侧印有计算错误的标示)。&/p&&br&&p&此数据集中有 50,000 个训练数字。我们在每次迭代(iteration)中将 100 个数字送入训练循环中,因此系统将在 500 次迭代之后看到所有训练数字一次。我们称之为一个「epoch」。&/p&&br&&img src=&/v2-7bc52b66c5270069dcf5_b.png& data-rawheight=&788& data-rawwidth=&794& class=&origin_image zh-lightbox-thumb& width=&794& data-original=&/v2-7bc52b66c5270069dcf5_r.png&&&br&&p&为了测试在现实条件下的识别质量,我们必须使用系统在训练期间从未看过的数字。否则,它可能记住了所有的训练数字,却仍无法识别我刚才写的「8」。MNIST 数据集包含了 10,000 个测试数字。此处你能看到每个数字对应的大约 1000 种书写形式,其中所有错误识别的数字列在顶部(有红色背景)。左边的刻度会给你一个粗略的分辨率精确度(正确识别的百分比)。&/p&&br&&img src=&/v2-5f7de571ee4c7ddcafef538_b.png& data-rawheight=&500& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-5f7de571ee4c7ddcafef538_r.png&&&br&&p&为了驱动训练,我们来定义损失函数,即一个展示出系统数字识别能力有多糟的值,并且系统会尽力将其最小化。损失函数(loss function,此处为「交叉熵」)的选择稍后会做出解释。你会看到,随着训练的进行,训练和测试数据的损失会减少,而这个现象是好的,意味着神经网络正在学习。X 轴表示了学习过程中的迭代。&/p&&br&&img src=&/v2-6bc18bce623a743bd0d3_b.png& data-rawheight=&500& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-6bc18bce623a743bd0d3_r.png&&&br&&p&这个准确度只是正确识别的数字的百分比,是在训练和测试集上计算出的。如果训练顺利,它便会上升。&/p&&img src=&/v2-f7e7e79df81981baaf22b4561d13cfa0_b.png& data-rawheight=&500& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-f7e7e79df81981baaf22b4561d13cfa0_r.png&&&img src=&/v2-a5e3e04d14d871f9c4c9e179a476b259_b.png& data-rawheight=&500& data-rawwidth=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-a5e3e04d14d871f9c4c9e179a476b259_r.png&&&br&&p&最后的两幅图表说明了内部变量所取的所有值的扩展,即随训练进行而变化的权重和偏置。比如偏置从 0 开始,且最终得到的值大致均匀地分布在-1.5 和 1.5 之间。如果系统不能很好地收敛,那么这些图可能有用。倘若你发现权重和偏差扩展到上百或上千,那么就可能有问题了。&/p&&br&&p&图中的条带为百分数。此处有 7 条带,所以每条带是所有值的 100/7,也就是 14%。&/p&&br&&p&用于可视化 GUI 的键盘快捷键&/p&&br&&p&1 ......... display 1st graph only 仅显示第 1 张图&/p&&p&2 ......... display 2nd graph only 仅显示第 2 张图&/p&&p&3 ......... display 3rd graph only 仅显示第 3 张图&/p&&p&4 ......... display 4th graph only 仅显示第 4 张图&/p&&p&5 ......... display 5th graph only 仅显示第 5 张图&/p&&p&6 ......... display 6th graph only 仅显示第 6 张图&/p&&p&7 ......... display graphs 1 and 2 显示 1 和 2 图&/p&&p&8 ......... display graphs 4 and 5 显示 4 和 5 图&/p&&p&9 ......... display graphs 3 and 6 显示 3 和 6 图&/p&&p&ESC or 0 .. back to displaying all graphs 返回,显示所有图&/p&&p&空格 ..... pause/resume 暂停/继续&/p&&p&O ......... box zoom mode (then use mouse) 框缩放模式(然后使用鼠标)&/p&&p&H ......... reset all zooms 重置所有缩放&/p&&p&Ctrl-S .... save current image 保存当前图像&/p&&br&&p&什么是“权重”和“偏置”?“交叉熵”又是如何被计算的?训练算法究竟是如何工作的?请到下一部分一探究竟。&/p&&br&&p&&strong&4、理论 : 单层神经网络&/strong&&/p&&br&&img src=&/v2-c9cf33ab38eaf44c5c2e913f_b.png& data-rawheight=&790& data-rawwidth=&1401& class=&origin_image zh-lightbox-thumb& width=&1401& data-original=&/v2-c9cf33ab38eaf44c5c2e913f_r.png&&&br&&p&MNIST 数据集中,手写数字是 28x28 像素的灰度图像。将它们进行分类的最简单的方法就是使用 28x28=784 个像素作为单层神经网络的输入。&/p&&br&&img src=&/v2-ff1bbbbd1d615_b.png& data-rawheight=&449& data-rawwidth=&832& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&/v2-ff1bbbbd1d615_r.png&&&br&&p&神经网络中的每个「神经元」对其所有的输入进行加权求和,并添加一个被称为「偏置(bias)」的常数,然后通过一些非线性激活函数来反馈结果。&/p&&br&&p&为了将数字分为 10 类(0 到 9),我们设计了一个具有 10 个输出神经元的单层神经网络。对于分类问题,softmax 是一个不错的激活函数。通过取每个元素的指数,然后归一化向量(使用任意的范数(norm),比如向量的普通欧几里得距离)从而将 softmax 应用于向量。&/p&&img src=&/v2-bb662f3d3c8ac0f9c83f9f1811f9cae4_b.png& data-rawheight=&429& data-rawwidth=&466& class=&origin_image zh-lightbox-thumb& width=&466& data-original=&/v2-bb662f3d3c8ac0f9c83f9f1811f9cae4_r.png&&&br&&p&那么为什么「softmax」会被称为 softmax 呢?指数是一种骤增的函数。这将加大向量中每个元素的差异。它也会迅速地产生一个巨大的值。然后,当进行向量的标准化时,支配范数(norm)的最大的元素将会被标准化为一个接近 1 的数字,其他的元素将会被一个较大的值分割并被标准化为一个接近 0 的数字。所得到的向量清楚地显示出了哪个是其最大的值,即「max」,但是却又保留了其值的原始的相对排列顺序,因此即为「soft」。&/p&&br&&img src=&/v2-4e9df880b75859eec0318_b.png& data-rawheight=&588& data-rawwidth=&850& class=&origin_image zh-lightbox-thumb& width=&850& data-original=&/v2-4e9df880b75859eec0318_r.png&&&br&&p&我们现在将使用矩阵乘法将这个单层的神经元的行为总结进一个简单的公式当中。让我们直接这样做:100 个图像的「mini-batch」作为输入,产生 100 个预测(10 元素向量)作为输出。&/p&&br&&p&使用加权矩阵 W 的第一列权重,我们计算第一个图像所有像素的加权和。该和对应于第一神经元。使用第二列权重,我们对第二个神经元进行同样的操作,直到第 10 个神经元。然后,我们可以对剩余的 99 个图像重复操作。如果我们把一个包含 100 个图像的矩阵称为 X,那么我们的 10 个神经元在这 100 张图像上的加权和就是简单的 X.W(矩阵乘法)。&/p&&br&&p&每一个神经元都必须添加其偏置(一个常数)。因为我们有 10 个神经元,我们同样拥有 10 个偏置常数。我们将这个 10 个值的向量称为 b。它必须被添加到先前计算的矩阵中的每一行当中。使用一个称为 &broadcasting& 的魔法,我们将会用一个简单的加号写出它。&/p&&br&&p&「Broadcasting」是 Python 和 numpy(Python 的科学计算库)的一个标准技巧。它扩展了对不兼容维度的矩阵进行正常操作的方式。「Broadcasting add」意味着「如果你因为两个矩阵维度不同的原因而不能将其相加,那么你可以根据需要尝试复制一个小的矩阵使其工作。」&/p&&br&&p&我们最终应用 softmax 激活函数并且得到一个描述单层神经网络的公式,并将其应用于 100 张图像:&/p&&br&&img src=&/v2-f029db2dcffb81be2cdfb_b.png& data-rawheight=&534& data-rawwidth=&1282& class=&origin_image zh-lightbox-thumb& width=&1282& data-original=&/v2-f029db2dcffb81be2cdfb_r.png&&&br&&p&顺便说一下,什么是「tensor(张量)」?&/p&&br&&p&「张量(tensor)」像一个矩阵,但是却有着任意数量的维度。一个 1 维的张量是一个向量。一个二维的张量是一个矩阵。然后你可以有 3, 4, 5 或者更多维的张量。&/p&&br&&p&&strong&5、理论:梯度下降&/strong&&/p&&br&&p&现在我们的神经网络从输入图像中产生预测,我们需要知道它们可以做到什么样的程度,即在我们知道的事实和网络的预测之间到底有多大的距离。请记住,我们对于这个数据集中的所有图像都有一个真实的标签。&/p&&br&&p&任何一种定义的距离都可以进行这样的操作,普通欧几里得距离是可以的,但是对于分类问题,被称为「交叉熵(cross-entropy)」的距离更加有效。&/p&&img src=&/v2-30d9dbf9d64a4b32b4cc452a6173c09a_b.png& data-rawheight=&599& data-rawwidth=&1261& class=&origin_image zh-lightbox-thumb& width=&1261& data-original=&/v2-30d9dbf9d64a4b32b4cc452a6173c09a_r.png&&&br&&p&「one-hot」编码意味着你使用一个 10 个值的向量,其中除了第 6 个值为 1 以外的所有值都是 0。这非常方便,因为这样的格式和我们神经网络预测输出的格式非常相似,同时它也作为一个 10 值的向量。&/p&&br&&p&「训练」一个神经网络实际上意味着使用训练图像和标签来调整权重和偏置,以便最小化交叉熵损失函数。它是这样工作的。&/p&&br&&p&交叉熵是一个关于权重、偏置、训练图像的像素和其已知标签的函数。&/p&&br&&p&如果我们相对于所有的权重和所有的偏置计算交叉熵的偏导数,我们就得到一个对于给定图像、标签和当前权重和偏置的「梯度」。请记住,我们有 7850 个权重和偏置,所以计算梯度需要大量的工作。幸运的是,TensorFlow 可以来帮我们做这项工作。&/p&&br&&p&梯度的数学意义在于它指向「上(up)」。因为我们想要到达一个交叉熵低的地方,那么我们就去向相反的方向。我们用一小部分的梯度更新权重和偏置并且使用下一批训练图像再次做同样的事情。我们希望的是,这可以使我们到达交叉熵最小的凹点的低部。&/p&&br&&img src=&/v2-d6f243ed53a622ac725caab_b.png& data-rawheight=&366& data-rawwidth=&703& class=&origin_image zh-lightbox-thumb& width=&703& data-original=&/v2-d6f243ed53a622ac725caab_r.png&&&br&&p&在这副图片当中,交叉熵被表示为一个具有两个权重的函数。事实上,还有更多。梯度下降算法遵循着一个最陡的坡度下降到局部最小值的路径。训练图像在每一次迭代中同样会被改变,这使得我们向着一个适用于所有图像的局部最小值收敛。&/p&&br&&p&「学习率(learning rate)」: 在整个梯度的长度上,你不能在每一次迭代的时候都对权重和偏置进行更新。这就会像是你穿着七里靴却试图到达一个山谷的底部。你会直接从山谷的一边到达另一边。为了到达底部,你需要一些更小的步伐,即只使用梯度的一部分,通常在 1/1000 区域中。我们称这个部分为「学习率(Learning rate)」。&/p&&br&&p&总结一下,以下是训练过程的步骤:&/p&&br&&p&Training digits and labels =& loss function =& gradient (partial derivatives) =& steepest descent =& update weights and biases =& repeat with next mini-batch of training images and labels&br&&/p&&br&&p&训练数字和标签 =& 损失函数 =& 梯度(部分偏导数)=& 最陡的梯度 =& 更新权重和偏置 =& 使用下一个 mini-batch 的图像和标签重复这一过程&/p&&br&&p&为什么使用 100 个图像和标签的 mini-batch?&/p&&br&&p&你当然也可以只在一个示例图像中计算你的梯度并且立即更新权重和偏置(这在科学文献中被称为「随机梯度下降(stochastic gradient descent)」)。在 100 个样本上都这样做可以得到一个更好地表示由不同样本图像施加约束的梯度并且可能更快地朝着解决方案收敛。mini-batch 的大小是可调整的参数。还有一个更加技术化的原因:使用批处理也意味着使用较大的矩阵,而这些通常更容易在 GPU 上优化。&/p&&br&&p&常见问题&/p&&br&&p&为什么交叉熵是在分类问题中合适的定义距离?&/p&&p&解答链接:&a href=&/?target=https%3A////why-you-should-use-cross-entropy-error-instead-of-classification-error-or-mean-squared-error-for-neural-network-classifier-training/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Why You Should Use Cross-Entropy Error Instead Of Classification Error Or Mean Squared Error For Neural Network Classifier Training&i class=&icon-external&&&/i&&/a&&/p&&br&&p&&strong&6、实验:让我们来看看代码&/strong&&/p&&br&&p&单层神经网络的代码已经写好了。请打开 mnist_1.0_softmax.py 文件并按说明进行操作。&/p&&br&&p&你在本节的任务是理解开始代码,以便稍后对其改进。&/p&&br&&p&你应该看到,在文档中的说明和启动代码只有微小的差别。它们对应于可视化的函数,并且在注释中被标记。此处可忽略。&/p&&br&&p&mnist_1.0_softmax.py:&/p&&p&&a href=&/?target=https%3A///martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/martin-gorne&/span&&span class=&invisible&&r/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import tensorflow as tf
X = tf.placeholder(tf.float32, [None, 28, 28, 1])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))init = tf.initialize_all_variables()
&/code&&/pre&&/div&&br&&p&我们首先定义 TensorFlow 的变量和占位符。变量是你希望训练算法为你确定的所有的参数。在我们的例子中参数是权重和偏差。&br&&/p&&br&&p&占位符是在训练期间填充实际数据的参数,通常是训练图像。持有训练图像的张量的形式是 [None, 28, 28, 1],其中的参数代表:&/p&&ul&&li&&p&28, 28, 1: 图像是 28x28 每像素 x 1(灰度)。最后一个数字对于彩色图像是 3 但在这里并非是必须的。&/p&&/li&&li&&p&None: 这是代表图像在小批量(mini-batch)中的数量。在训练时可以得到。&/p&&/li&&/ul&&br&&p&mnist_1.0_softmax.py:&/p&&p&&a href=&/?target=https%3A///martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/martin-gorne&/span&&span class=&invisible&&r/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# model
Y = tf.nn.softmax(tf.matmul(tf.reshape(X, [-1, 784]), W) + b)
# placeholder for correct labels
Y_ = tf.placeholder(tf.float32, [None, 10])
# loss functioncross_entropy = -tf.reduce_sum(Y_ * tf.log(Y))
# % of correct answers found in batch
is_correct = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
&/code&&/pre&&/div&&br&&p&第一行是我们单层神经网络的模型。公式是我们在前面的理论部分建立的。tf.reshape 命令将我们的 28×28 的图像转化成 784 个像素的单向量。在 reshape 中的「-1」意味着「计算机,计算出来,这只有一种可能」。在实际当中,这会是图像在小批次(mini-batch)中的数量。&/p&&br&&p&然后,我们需要一个额外的占位符用于训练标签,这些标签与训练图像一起被提供。&/p&&p&现在我们有模型预测和正确的标签,所以我们计算交叉熵。tf.reduce_sum 是对向量的所有元素求和。&/p&&br&&p&最后两行计算了正确识别数字的百分比。这是留给读者的理解练习,使用 TensorFlow API 参考。你也可以跳过它们。&/p&&br&&p&mnist_1.0_softmax.py:&/p&&p&&a href=&/?target=https%3A///martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/martin-gorne&/span&&span class=&invisible&&r/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&optimizer = tf.train.GradientDescentOptimizer(0.003)
train_step = optimizer.minimize(cross_entropy)
&/code&&/pre&&/div&&br&&p&才是 TensorFlow 发挥它力量的地方。你选择一个适应器(optimiser,有许多可供选择)并且用它最小化交叉熵损失。在这一步中,TensorFlow 计算相对于所有权重和所有偏置(梯度)的损失函数的偏导数。这是一个形式衍生( formal derivation),并非是一个耗时的数值型衍生。&/p&&br&&p&梯度然后被用来更新权重和偏置。学习率为 0.003。&/p&&br&&p&最后,是时候来运行训练循环了。到目前为止,所有的 TensorFlow 指令都在内存中准备了一个计算图,但是还未进行计算。&/p&&br&&p&TensorFlow 的 “延迟执行(deferred execution)” 模型:TensorFlow 是为分布式计算构建的。它必须知道你要计算的是什么、你的执行图(execution graph),然后才开始发送计算任务到各种计算机。这就是为什么它有一个延迟执行模型,你首先使用 TensorFlow 函数在内存中创造一个计算图,然后启动一个执行 Session 并且使用 Session.run 执行实际计算任务。在此时,图形无法被更改。&/p&&br&&p&由于这个模型,TensorFlow 接管了分布式运算的大量运筹。例如,假如你指示它在计算机 1 上运行计算的一部分 ,而在计算机 2 上运行另一部分,它可以自动进行必要的数据传输。&/p&&br&&p&计算需要将实际数据反馈进你在 TensorFlow 代码中定义的占位符。这是以 Python 的 dictionary 的形式给出的,其中的键是占位符的名称。&/p&&br&&p&mnist_1.0_softmax.py:&/p&&p&&a href=&/?target=https%3A///martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/martin-gorne&/span&&span class=&invisible&&r/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sess = tf.Session()sess.run(init)for i in range(1000):
# load batch of images and correct answers
batch_X, batch_Y = mnist.train.next_batch(100)
train_data={X: batch_X, Y_: batch_Y}
sess.run(train_step, feed_dict=train_data)
&/code&&/pre&&/div&&br&&p&在这里执行的 train_step 是当我们要求 TensorFlow 最小化交叉熵时获得的。这是计算梯度和更新权重和偏置的步骤。&/p&&br&&p&最终,我们还需要一些值来显示,以便我们可以追踪我们模型的性能。&/p&&br&&p&在训练回路中使用该代码来计算准确度和交叉熵(例如每 10 次迭代):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# success ?a,c = sess.run([accuracy, cross_entropy], feed_dict=train_data)
&/code&&/pre&&/div&&p&通过在馈送 dictionary 中提供测试而不是训练数据,可以对测试数据进行同样的计算(例如每 100 次迭代计算一次。有 10,000 个测试数字,所以会耗费 CPU 一些时间):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# success on test data ?
test_data={X: mnist.test.images, Y_: mnist.test.labels}
a,c = sess.run([accuracy, cross_entropy], feed=test_data)
&/code&&/pre&&/div&&p&TensorFlow 和 Numpy 是朋友:在准备计算图时,你只需要操纵 TensorFlow 张量和命令,比如 tf.matmul, tf.reshape 等。&/p&&br&&p&然而,只要执行 Session.run 命令,它的返回值就是 Numpy 张量,即 Numpy 可以使用的 numpy.ndarray 对象以及基于它的所有科学计算库。这就是使用 matplotlib(基于 Numpy 的标准 Python 绘图库)为本实验构建实时可视化的方法。&/p&&br&&p&这个简单的模型已经能识别 92% 的数字了。这不错,但是你现在要显著地改善它。&/p&&br&&img src=&/v2-34ae21bd790b81e7c098ea3b3dcda25c_b.png& data-rawheight=&806& data-rawwidth=&1338& class=&origin_image zh-lightbox-thumb& width=&1338& data-original=&/v2-34ae21bd790b81e7c098ea3b3dcda25c_r.png&&&br&&p&&strong&7、实验:增加层&/strong&&/p&&br&&img src=&/v2-ed6ec841e_b.png& data-rawheight=&806& data-rawwidth=&1429& class=&origin_image zh-lightbox-thumb& width=&1429& data-original=&/v2-ed6ec841e_r.png&&&br&&p&为了提高识别的准确度,我们将为神经网络增加更多的层。第二层神经元将计算前一层神经元输出的加权和,而非计算像素的加权和。这里有一个 5 层全相连的神经网络的例子:&/p&&br&&img src=&/v2-6d45f00b594b73cd95f9df892e0b8b15_b.png& data-rawheight=&512& data-rawwidth=&835& class=&origin_image zh-lightbox-thumb& width=&835& data-original=&/v2-6d45f00b594b73cd95f9df892e0b8b15_r.png&&&br&&p&我们继续用 softmax 来作为最后一层的激活函数,这也是为什么在分类这个问题上它性能优异的原因。但在中间层,我们要使用最经典的激活函数:sigmoid:在这一节中你的任务是为你的模型增加一到两个中间层以提高它的性能。&/p&&img src=&/v2-a3b8cfff469c6bd32f50b61_b.png& data-rawheight=&282& data-rawwidth=&625& class=&origin_image zh-lightbox-thumb& width=&625& data-original=&/v2-a3b8cfff469c6bd32f50b61_r.png&&&p&答案可以在 mnist_2.0_five_layers_sigmoid.py 中找到。只有当你实在想不出来的时候再使用它!为了增加一个层,你需要为中间层增加一个额外的权重矩阵和一个额外的偏置向量:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&W1 = tf.Variable(tf.truncated_normal([28*28, 200] ,stddev=0.1))
B1 = tf.Variable(tf.zeros([200]))
W2 = tf.Variable(tf.truncated_normal([200, 10], stddev=0.1))
B2 = tf.Variable(tf.zeros([10]))
&/code&&/pre&&/div&&p&对,就这么做。通过 2 个中间层以及例子中 200 个和 100 个神经元,你现在应该能够把你的神经网络的准确度推高到 97% 了。&br&&/p&&br&&img src=&/v2-fbd42bf8d111_b.png& data-rawheight=&806& data-rawwidth=&1338& class=&origin_image zh-lightbox-thumb& width=&1338& data-original=&/v2-fbd42bf8d111_r.png&&&br&&p&&strong&8、实验:深度网络需要特别注意的地方&/strong&&/p&&br&&img src=&/v2-30dc5c6312eea1f447b36b5758ddc297_b.png& data-rawheight=&903& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-30dc5c6312eea1f447b36b5758ddc297_r.png&&&br&&p&随着层数的增加,神经网络越来越难以收敛。但现在我们知道如何控制它们的行为了。这里是一些只用 1 行就可以实现的改进,当你看到准确度曲线出现如下情况的时候,这些小技巧会帮到你:&img src=&/v2-bcdd8d56aec0_b.png& data-rawheight=&355& data-rawwidth=&401& class=&content_image& width=&401&&&/p&&br&&p&修正线性单元(ReLU)激活函数&/p&&br&&p&在深度网络里,sigmoid 激活函数确实能带来很多问题。它把所有的值都挤到了 0 到 1 之间,而且当你重复做的时候,神经元的输出和它们的梯度都归零了。值得一提的是,出于历史原因,一些现代神经网络使用了 ReLU(修正线性单元),它大致是如下这个样子:&/p&&br&&img src=&/v2-aedf7a430bcacea95d089c82_b.png& data-rawheight=&212& data-rawwidth=&399& class=&content_image& width=&399&&&br&&p&升级 1/4:用 RELU 替换你所有的 sigmoid,然后你会得到一个更快的初始收敛并且当我们继续增加层的时候也避免了一些后续问题的产生。仅仅在代码中简单地用 tf.nn.relu 来替换 tf.nn.sigmoid 就可以了。&/p&&br&&p&一个更好的优化器&/p&&br&&p&在一个特别多维的空间里,就像当前这个情况——我们有 10K 量级的权值和偏置值——「鞍点 (saddle points)」会频繁出现。这些点不是局部最小值点,但它的梯度却是零,那么梯度降的优化会卡在这里。TensorFlow 有一系列可以用的优化器,包括一些带有一定的惯性,能够安全越过鞍点的优化器。&/p&&br&&p&升级 2/4:现在将你的 tf.train.GradientDescentOptimiser 替换为 tf.train.AdamOptimizer。&/p&&br&&p&随机初始化&/p&&br&&p&准确性一直卡在 0.1?你把你的权值初始化成随机值了没?对于偏置值,如果用 ReLU 的话,最好的办法就是把它们都初始化成小的正值,这样神经元一开始就会工作在 ReLU 的非零区域内。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&W = tf.Variable(tf.truncated_normal([K, L] ,stddev=0.1))
B = tf.Variable(tf.ones([L])/10)
&/code&&/pre&&/div&&p&升级 3/4:现在检查是否你所有的权值和偏置值都被初始化好了。上图所示的 0.1 会作为偏置值。&/p&&br&&p&不定值(NaN)&/p&&img src=&/v2-a32beab4e356_b.png& data-rawheight=&524& data-rawwidth=&557& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&/v2-a32beab4e356_r.png&&&p&如果你看到你的精确曲线陡然下滑并且调试口输出的交叉熵是 NaN,不用感到头疼,你其实是正在尝试计算 log(0),而这肯定是个不定值(NaN)。还记得吗,交叉熵的计算涉及到对 softmax 层的输出取对数。鉴于 softmax 基本上是一个指数,它肯定不是 0,我们如果用 32 位精度的浮点运算就还好,exp(-100) 基本上可以算作是 0 了。&/p&&br&&p&很幸运,TensorFlow 有一个非常方便的函数可以在单步内计算 softmax 和交叉熵,它是以一种数值上较为稳定的方式实现的。如果要使用它,你需要在应用 softmax 之前将原始的权重和加上你最后一层的偏置隔离开来(在神经网络的术语里叫「logits」)。&/p&&br&&p&如果你模型的最后一行是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Y = tf.nn.softmax(tf.matmul(Y4, W5) + B5)
&/code&&/pre&&/div&&p&你需要把它替换成:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Ylogits = tf.matmul(Y4, W5) + B5
Y = tf.nn.softmax(Ylogits)
&/code&&/pre&&/div&&p&并且你现在能以一种安全的方式计算交叉熵了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cross_entropy = tf.nn.softmax_cross_entropy_with_logits(Ylogits, Y_)
&/code&&/pre&&/div&&p&同样加上下面这行代码使得测试和训练的交叉熵能够同框显示:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cross_entropy = tf.reduce_mean(cross_entropy)*100
&/code&&/pre&&/div&&p&升级 4/4:请把 tf.nn.softmax_cross_entropy_with_logits 加到你的代码里。你也可以跳过这一步,等你真在你的输出里看到 NaN 以后再来做这步。现在,你已经准备好实现「深度」了。&br&&/p&&br&&p&&strong&9、实验:学习速率衰退&/strong&&/p&&br&&img src=&/v2-718f2f50c8e9ae5c02bb097d6d86412b_b.png& data-rawheight=&903& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-718f2f50c8e9ae5c02bb097d6d86412b_r.png&&&br&&p&通过两个、三个或者四个中间层,你现在可以将准确度提升至接近 98%,当然,你的迭代次数要达到 5000 次以上。不过你会发现你并不总是会得到这样的结果。&/p&&img src=&/v2-0ac9cb04fab26c567a2b_b.png& data-rawheight=&650& data-rawwidth=&1210& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/v2-0ac9cb04fab26c567a2b_r.png&&&p&这些曲线很嘈杂,看看测试精确度吧:它在全百分比范围内跳上跳下。这意味着即使 0.003 的学习率我们还是太快了。但我们不能仅仅将学习率除以十或者永远不停地做训练。一个好的解决方案是开始很快随后将学习速率指数级衰减至比如说 0.0001。&br&&/p&&br&&p&这个小改变的影响是惊人的。你会看到大部分的噪声消失了并且测试精确度持续稳定在 98% 以上。&/p&&br&&img src=&/v2-fa5cc7cd6a5b8fd62c163a_b.png& data-rawheight=&540& data-rawwidth=&1210& class=&origin_image zh-lightbox-thumb& width=&1210& data-original=&/v2-fa5cc7cd6a5b8fd62c163a_r.png&&&br&&p&再看看训练精确度曲线。在好多个 epoch 里都达到了 100%(一个 epoch=500 次迭代=全部训练图片训练一次)。第一次我们能很好地识别训练图片了。&/p&&br&&p&请把学习率衰退加到你的代码里。为了把一个不同的学习率在每次迭代时传给 AdamOptimizer,你需要定义一个新的占位符(placeholder)并在每次迭代时通过 feed_dict 赋给它一个新的参数。&/p&&br&&p&这里是一个指数级衰减的方程:lr = lrmin+(lrmax-lrmin)*exp(-i/2000) 答案可以在这个文件里找到:mnist_2.1_five_layers_relu_lrdecay.py。如果你被卡住了可以用它。&/p&&br&&img src=&/v2-4fdff3ac6e6d_b.png& data-rawheight=&806& data-rawwidth=&1338& class=&origin_image zh-lightbox-thumb& width=&1338& data-original=&/v2-4fdff3ac6e6d_r.png&&&br&&p&&strong&10、实验:dropout、过拟合&/strong&&/p&&br&&img src=&/v2-7eeb75e83bf6fd170faa2_b.png& data-rawheight=&903& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-7eeb75e83bf6fd170faa2_r.png&&&br&&p&你可能已经注意到在数千次迭代之后,测试和训练数据的交叉熵曲线开始不相连。学习算法只是在训练数据上做工作并相应地优化训练的交叉熵。它再也看不到测试数据了,所以这一点也不奇怪:过了一会儿它的工作不再对测试交叉熵产生任何影响,交叉熵停止了下降,有时甚至反弹回来。&img src=&/v2-950a37a4bcc3166b1bec9_b.png& data-rawheight=&540& data-rawwidth=&1080& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-950a37a4bcc3166b1bec9_r.png&&&/p&&br&&p&它不会立刻影响你模型对于真实世界的识别能力,但是它会使你运行的众多迭代毫无用处,而且这基本上是一个信号——告诉我们训练已经不能再为模型提供进一步改进了。这种无法连接通常会被标明「过拟合(overfitting)」,而且当你看到这个的时候,你可以尝试采用一种规范化(regularization)技术,称之为「dropout」。&/p&&br&&img src=&/v2-6b0dc40a31accd49bef4ba9_b.png& data-rawheight=&720& data-rawwidth=&1256& class=&origin_image zh-lightbox-thumb& width=&1256& data-original=&/v2-6b0dc40a31accd49bef4ba9_r.png&&&br&&p&在 dropout 里,在每一次训练迭代的时候,你可以从网络中随机地放弃一些神经元。你可以选择一个使神经元继续保留的概率 pkeep,通常是 50% 到 75% 之间,然后在每一次训练的迭代时,随机地把一些神经元连同它们的权重和偏置一起去掉。在一次迭代里,不同的神经元可以被一起去掉(而且你也同样需要等比例地促进剩余神经元的输出,以确保下一层的激活不会移动)。当测试你神经网络性能的时候,你再把所有的神经元都装回来 (pkeep=1)。&/p&&br&&p&TensorFlow 提供一个 dropout 函数可以用在一层神经网络的输出上。它随机地清零一些输出并且把剩下的提升 1/pkeep。这里是如何把它用在一个两层神经网络上的例子。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# feed in 1 when testing, 0.75 when training
pkeep = tf.placeholder(tf.float32)
Y1 = tf.nn.relu(tf.matmul(X, W1) + B1)
Y1d = tf.nn.dropout(Y1, pkeep)
Y = tf.nn.softmax(tf.matmul(Y1d, W2) + B2)
&/code&&/pre&&/div&&p&你现在可以在网络中每个中间层以后插入 dropout。如果你没时间深入阅读的话,这是本项目里的可选步骤。&/p&&br&&p&该解决方案可以在 mnist_2.2_five_layers_relu_lrdecay_dropout.py:&/p&&p&(&a href=&/?target=https%3A///martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_2.2_five_layers_relu_lrdecay_dropout.py& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/martin-gorne&/span&&span class=&invisible&&r/tensorflow-mnist-tutorial/blob/master/mnist_2.2_five_layers_relu_lrdecay_dropout.py&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)&/p&&p&里找到。如果你被难住了,可以用它。&/p&&br&&img src=&/v2-711e2c25bc65fb501663_b.png& data-rawheight=&540& data-rawwidth=&1080& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-711e2c25bc65fb501663_r.png&&&br&&p&你会看到测试损失已经被搞回来了,已经在可控范围内了,不过至少在这个例子中噪声重新出现了(如果你知道 dropout 的工作原理的话,这一点也不奇怪)。测试的准确度依然没变,这倒是有点小失望。这个「过拟合」一定还有其它原因。在我们继续进行下一步之前,我们先扼要重述一下我们到目前为止用过的所有工具:&/p&&br&&img src=&/v2-22fab1cddfca53830dd0fcf_b.png& data-rawheight=&335& data-rawwidth=&797& class=&origin_image zh-lightbox-thumb& width=&797& data-original=&/v2-22fab1cddfca53830dd0fcf_r.png&&&br&&p&无论我们做什么,我们看上去都不可能很显著地解决 98% 的障碍,而且我们的损失曲线依然显示「过拟合」无法连接。什么是真正的「过拟合」?过拟合发生在该神经网络学得「不好」的时候,在这种情况下该神经网络对于训练样本做得很好,对真实场景却并不是很好。有一些像 dropout 一样的规范化技术能够迫使它学习得更好,不过过拟合还有更深层的原因。&/p&&br&&img src=&/v2-8be6be96accf7_b.png& data-rawheight=&903& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-8be6be96accf7_r.png&&&br&&p&基本的过拟合发生在一个神经网络针对手头的问题有太多的自由度的时候。想象一下我们有如此多的神经元以至于所组成的网络可以存储我们所有的训练图像并依靠特征匹配来识别它们。它会在真实世界的数据里迷失。一个神经网络必须有某种程度上的约束以使它能够归纳推理它在学习中所学到的东西。&/p&&br&&p&如果你只有很少的训练数据,甚至一个很小的网络都能够用心学习它。一般来说,你总是需要很多数据来训练神经网络。&/p&&br&&p&最后,如果你已经做完了所有的步骤,包括实验了不同大小的网络以确保它的自由度已经约束好了、采用了 dropout、并且训练了大量的数据,你可能会发现你还是被卡在了当前的性能层次上再也上不去了。这说明你的神经网络在它当前的形态下已经无法从你提供的数据中抽取到更多的信息了,就像我们这个例子这样。&/p&&br&&p&还记得我们如何使用我们的图像吗?是所有的像素都展平到一个向量里么?这是一个很糟糕的想法。手写的数字是由一个个形状组成的,当我们把像素展平后我们会丢掉这些形状信息。不过,有一种神经网络可以利用这些形状信息:卷积网络(convolutional network)。让我们来试试。&/p&&br&&p&&strong&11、理论:卷积网络&/strong&&/p&&br&&img src=&/v2-ef6e97e05e3f3001de5dee5_b.png& data-rawheight=&567& data-rawwidth=&707& class=&origin_image zh-lightbox-thumb& width=&707& data-original=&/v2-ef6e97e05e3f3001de5dee5_r.png&&&br&&p&在卷积网络层中,一个「神经元」仅对该图像上的一个小部分的像素求加权和。然后,它通常会添加一个偏置单元,并且将得到的加权和传递给激活函数。与全连接网络相比,其最大的区别在于卷积网络的每个神经元重复使用相同的权重,而不是每个神经元都有自己的权重。&/p&&br&&p&在上面的动画中,你可以看到通过连续修改图片上两个方向的权重(卷积),能够获得与图片上的像素点数量相同的输出值(尽管在边缘处需要填充(padding))。&/p&&br&&p&要产生一个输出值平面,我们使用了一张 4x4 大小的彩色图片作为出输入。在这个动画当中,我们需要 4x4x3=48 个权重,这还不够,为了增加更多自由度,我们还需要选取不同组的权重值重复实验。&/p&&br&&img src=&/v2-6c0a1aa82a7a2e5de12bfe9c4963ecdb_b.png& data-rawheight=&422& data-rawwidth=&1010& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&/v2-6c0a1aa82a7a2e5de12bfe9c4963ecdb_r.png&&&br&&p&通过向权重张量添加一个维度,能够将两组或更多组的权重重写为一组权重,这样就给出了一个卷积层的权重张量的通用实现。由于输入、输出通道的数量都是参数,我们可以开始堆叠式(stacking)和链式(chaining)的卷积层。&/p&&br&&img src=&/v2-f6abfe737f5c_b.png& data-rawheight=&516& data-rawwidth=&1004& class=&origin_image zh-lightbox-thumb& width=&1004& data-original=&/v2-f6abfe737f5c_r.png&&&br&&p&最后,我们需要提取信息。在最后一层中,我们仅仅想使用 10 个神经元来分类 0-9 十个不同的数字。传统上,这是通过「最大池化(max-pooling)」层来完成的。即使今天有许多更简单的方法能够实现这分类任务,但是,「最大池化」能够帮助我们直觉地理解卷积神经网络是怎么工作的。如果你认为在训练的过程中,我们的小块权重会发展成能够过滤基本形状(水平线、垂直线或曲线等)的过滤器(filter),那么,提取有用信息的方式就是识别输出层中哪种形状具有最大的强度。实际上,在最大池化层中,神经元的输出是在 2x2 的分组中被处理,最后仅仅保留输出最大强度的神经元。&/p&&br&&p&这里有一种更简单的方法:如果你是以一步两个像素移动图片上的滑块而不是以每步一个像素地移动图片上的滑块。这种方法就是有效的,今天的卷积网络仅仅使用了卷积层。&/p&&br&&img src=&/v2-032fae75ccf3_b.png& data-rawheight=&903& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-032fae75ccf3_r.png&&&br&&p&让我们建立一个用于手写数字识别的卷积网络。在顶部,我们将使用 3 个卷积层;在底部,我们使用传统的 softmax 读出层,并将它们用完全连接层连接。&/p&&br&&img src=&/v2-a085c83d5ccaf3e23e6a2fd527bfc2e7_b.png& data-rawheight=&934& data-rawwidth=&1600& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&/v2-a085c83d5ccaf3e23e6a2fd527bfc2e7_r.png&&&br&&p&注意,第二与第三卷积层神经元数量以 2x2 为倍数减少,这就解释了为什么它们的输出值从 28x28 减少为 14x14,然后再到 7x7。卷积层的大小变化使神经元的数量在每层下降约为:28x28x14≈x8≈1500 → 7x7x12≈500 → 200。下一节中,我们将给出该网络的具体实现。&/p&&br&&p&&strong

我要回帖

 

随机推荐