有没有人了解高新区创业大厦游戏行业创业的相关讯息

&img src=&/50/v2-1b58fea01bb3a133c0975d_b.jpg& data-rawwidth=&1500& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&1500& data-original=&/50/v2-1b58fea01bb3a133c0975d_r.jpg&&&blockquote&文 | &a href=&/?target=https%3A///user/20821& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&红菱&i class=&icon-external&&&/i&&/a&&/blockquote&&br&&p&游戏的本质应该是“好玩”,但不排除作为第九艺术的游戏,还有其他附加价值,比如“寓教于乐”。&br&在游戏中加入其他领域的文化、科技、专业知识还需要被玩家接受,其实是很考验策划功力的。首先需要了解一部分专业知识,同时还要将其简易地通过游戏的方式,展示给大众玩家并让其接受,并非易事。&/p&&p&&img src=&/v2-fe256f5e22fb46ea4957_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-fe256f5e22fb46ea4957_r.jpg&&然而这样寓教于乐的好游戏也是有的,比如就有那么几款兼有编程知识的游戏,《人力资源师》首当其冲。游戏用非常简单的画面语言,解析了复杂的编程内涵,有趣、好玩又轻松(也满足了强迫症患者,笑)。这部作品不仅很受程序员偏爱,也适合辅助编程入门的新手,在学习之余通过游戏“巩固知识”,同时它可爱的画风,也收获了不少非编程专业普通玩家的赞赏。&/p&&p&&img src=&/v2-37854dca620c6cb670f8bd000ad33917_b.png& data-rawwidth=&360& data-rawheight=&70& class=&content_image& width=&360&&同类型的还有《Lightbot》系列,分类虽然写的是儿童早教类游戏,其实也是一个编程游戏。&/p&&p&&img src=&/v2-afe1eb669efac_b.png& data-rawwidth=&360& data-rawheight=&70& class=&content_image& width=&360&&而另一款游戏《Hacked》,从编程的角度很有专业性,但从游戏的角度难免门槛有些高,加之画面比较生硬,因此受众偏少是意料之中,但不失为是一个有个性的好作品。&/p&&p&&img src=&/v2-2cefb6ace62ac58a601a1b_b.png& data-rawwidth=&360& data-rawheight=&70& class=&content_image& width=&360&&说过了编程相关的游戏,今天要推荐的《Little Traders(小小交易人)》,也属于这种寓教于乐类型的游戏。&/p&&p&&img src=&/v2-1b58fea01bb3a133c0975d_b.jpg& data-rawwidth=&1500& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&1500& data-original=&/v2-1b58fea01bb3a133c0975d_r.jpg&&发现这款“沧海遗珠”的游戏,源于某日逛知乎,看到了一位金融行业&a href=&/question//answer/& class=&internal&&从业者的推荐&/a&。答主开门见山表明她并不喜玩游戏,于是这款非资深玩家用户青睐的游戏,引起我的兴趣。&br&&/p&&p&&img src=&/v2-35cca43e003ee9f0135a1cf_b.png& data-rawwidth=&749& data-rawheight=&730& class=&origin_image zh-lightbox-thumb& width=&749& data-original=&/v2-35cca43e003ee9f0135a1cf_r.png&&《小小交易人》从类型上来说,是一款像素风格的模拟经营类游戏,与开罗公司的量产游戏很相似的风格,但相对轻度,没有开罗那么沉迷的游戏性,题材选择了金融投资相关做内容。玩家在游戏中模拟一名股票交易人,根据客户的不同需求帮助其操盘买卖,达成客户目标即可赚的酬金并完成当日工作。积攒足额的金币,就可以升级办公室,解锁更多楼层、雇佣更多员工,完成从地下室办公间到豪华办公楼的经营目标。&/p&&p&如果看过小李子《了不起的盖茨比》这部电影,还能发现这款游戏在设计上的用心。游戏的背景故事设定在1920年的华尔街某办公大楼,像素风也正好吻合 Great Gatsby 电影里的复古主题,而年代的产物,比如游戏里客户穆勒太太的人物服装设计,也是跟着电影里 flappers 女郎的衣饰走的。&/p&&p&&img src=&/v2-b529fdd706fee_b.jpg& data-rawwidth=&742& data-rawheight=&1320& class=&origin_image zh-lightbox-thumb& width=&742& data-original=&/v2-b529fdd706fee_r.jpg&&&img src=&/v2-017c986d73f12f77351fdc6c9c46b612_b.jpg& data-rawwidth=&1280& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-017c986d73f12f77351fdc6c9c46b612_r.jpg&&游戏里设定了一个报童的角色,是金融行业要素之一的“资讯”担当,可能一般游戏玩家会忽略这个设定,但金融从业或者学习者就会关注报童每日带来的讯息。而在模拟股票买卖的环节,出现了一些金融专业名词比如“做空”、“做多”等,如果了解这些名词的含义,对于玩游戏也有很大的帮助。&/p&&img src=&/v2-1d3bfe4e25aa7a97c73b_b.jpg& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-1d3bfe4e25aa7a97c73b_r.jpg&&&img src=&/v2-3a39caebca1921_b.jpg& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-3a39caebca1921_r.jpg&&&p&不过作为非金融行业的普通玩家,玩起来也是毫无压力的。没有操作难度,只需要关注买进卖出,达到每日客户需求即可,当然初期是没有难度,后期发展规模大了,客户多了,就会有“手忙脚乱”的感受了。&br&&/p&&p&这款游戏的开发商 &a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tradimo Interactive ApS&i class=&icon-external&&&/i&&/a& ,创办于2012年,中文名叫“&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&学得谋&i class=&icon-external&&&/i&&/a&”,是一个提供外汇股票交易公开课和学习的社区平台,《小小交易人》其实是为了该公司的金融交易公开课,所推出的辅助教学的游戏。的确通过游戏,可以模拟金融股票交易、金融投资和个人理财等方面的知识。因此这款其貌不扬的游戏,还获得了伦敦汇亨最创新产品奖和最佳移动版方案殊荣。&br&&/p&&p&&img src=&/v2-f61d389db6ec1b8e95b1cf_b.jpg& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-f61d389db6ec1b8e95b1cf_r.jpg&&金融市场对非从业人员来说抽象难懂,也因现代人缺乏时间、精力或动力学习这方面的知识,于是 Tradimo 的 CEO 便决定开发一款模拟游戏,能让人边玩边学到东西。&b&“因此我们开发了这款好玩的游戏,为爱好游戏的人开启通往金融世界的另一扇门。”&/b&在这款游戏中,&b&没有任何的内购、钻石和付费的设计,这是 CEO-Sebastian Kuhnert 在游戏上“无心插柳”、在金融业“有意栽花”的作品,游戏也确实如其本意一样,获得了来自相关的评价。&/b&&br&&br&&i&*作为金融学生目前只能long不能short...且游戏中portfolio只有三股导致风险无法对冲,Ps报童起床那么晚真的好么?- &a href=&/?target=https%3A///user/620362& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&小虾笑笑&i class=&icon-external&&&/i&&/a& 评论于 &b&TapTap &/b&&/i&&br&&i&*超爱小小交易人的游戏,棒极了! - @dherman76 评论于 &b&Twitter&/b&&br&*我父亲小的时候,祖父在股市做交易不但大大改善了家里的生活,现在所积累的财富用上一辈子还绰绰有余。我觉得你们设计的这款游戏帮助教育大众如何精明投资是非常伟大的。 - Dinosauringg 评论于 &b&reddit&/b&&/i&&br&&i&*玩小小交易人太过瘾了,极力推荐! - WHU - Otto Beisheim School of Management 评论于 &b&Facebook&/b&&/i&&br&&br&不过,融入了再多的专业领域知识的游戏,到底也还是一款游戏,对于深知游戏“套路”的玩家来说,在游戏里模拟“华尔街之狼”的经营之路,也不是一件难事呢。该游戏的推荐人@&a href=&/?target=https%3A///user/2263891& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&余佩磬&i class=&icon-external&&&/i&&/a& 也评价说,游戏近期会更新版本,开发者也会随后推出安卓版本,感兴趣的玩家可以期待后续的更新了。&br&&/p&&img src=&/v2-c5588bbc751c179d6cdd_b.jpg& data-rawwidth=&772& data-rawheight=&426& class=&origin_image zh-lightbox-thumb& width=&772& data-original=&/v2-c5588bbc751c179d6cdd_r.jpg&&&br&&p&&img src=&/v2-e3a055eb5d5febf46fee8e92dd9d364c_b.png& data-rawwidth=&750& data-rawheight=&1334& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&/v2-e3a055eb5d5febf46fee8e92dd9d364c_r.png&&&i&名称:Little Traders(小小交易人)&br&平台:iOS&br&语言:支持中文&br&链接:&a href=&/?target=https%3A///cn/app/id& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS下载&i class=&icon-external&&&/i&&/a& / &a href=&/?target=https%3A///app/27191& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android预约&i class=&icon-external&&&/i&&/a&&/i&&/p&&br&&p&&a href=&/?target=https%3A///topic/132896& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&原文&i class=&icon-external&&&/i&&/a& 首发于 &i&&a href=&/?target=https%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TapTap 发现好游戏&i class=&icon-external&&&/i&&/a&,&/i&转载请注明出处、作者署名。&/p&
游戏的本质应该是“好玩”,但不排除作为第九艺术的游戏,还有其他附加价值,比如“寓教于乐”。 在游戏中加入其他领域的文化、科技、专业知识还需要被玩家接受,其实是很考验策划功力的。首先需要了解一部分专业知识,同时还要将其简易地通过游…
&img src=&/50/v2-fddba30e61a00bb3cc3d1f4_b.jpg& data-rawwidth=&656& data-rawheight=&408& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/50/v2-fddba30e61a00bb3cc3d1f4_r.jpg&&&blockquote&&b&导读:&/b&每一个程序员都有一个极客的梦想,Max Braun 就是这么一个人,他将科幻电影里常常出现的智能镜面显示屏变成了现实,从想法的诞生、元部件的购买到原型机的测试,让我们一起看看他是怎么做的!&/blockquote&去年的一些时候,我突然意识到,我想把洗手间那面普通的镜子变成我们在电影里头看到的那种科幻镜子。&p&似乎还没有人在卖我想要的这种产品,不过其中的单独部件却挺容易找到的。最近许多人都曾做过类似的,但我心里想着要和他们不一样。&/p&&p&于是我订购了一个双面镜、一个显示屏和一个控制面板,再加上一堆零部件和一些工艺品。事实上在订购这些零部件之前,已经有了不少牺牲的实验品。但还是让我们看看成品吧,不过还不是最终不改版的完成品。&img src=&/v2-24c96a28d76bcb8ea7c219_b.jpg& data-rawwidth=&800& data-rawheight=&1197& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-24c96a28d76bcb8ea7c219_r.jpg&&&/p&&p&欢迎来到我的浴室,请原谅小柜子和镜子前那一堆杂乱。&/p&&p&在我的右手边是时间和日期,在我的左手边则是当前天气和 24 小时预报,下方是最近的新闻标题。下图是一张特写:&img src=&/v2-8d355a3b42f1ef_b.jpg& data-rawwidth=&2000& data-rawheight=&1333& class=&origin_image zh-lightbox-thumb& width=&2000& data-original=&/v2-8d355a3b42f1ef_r.jpg&&&/p&&p&除非是多云的天气,不然的话在 UI 上会有颜色配色的。但大部分的文本和图标都是单色的,这样可以防止用户被分散注意力。&/p&&p&UI 这部分的代码,还有天气预报和新闻这方面使用了一些简单的 Android API。&/p&&p&其他方面比如说交通、提醒以及其他的效率工具我用的是 Google Now 的卡片。这个想法是可以让用户不需要与这些 UI 交互,它会自动更新并且它还有一个开放式语音引擎接口。&/p&&img src=&/v2-cfed377ac6f00_b.jpg& data-rawwidth=&1000& data-rawheight=&667& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-cfed377ac6f00_r.jpg&&&p&显示器仅有几毫米薄并且嵌入在双向镜玻璃和药柜门之间的夹层中。这样看起来很干净,而且我可以继续使用里面的所有货架空间。这是一个打开了的门,你也可以查看一下边缘:&img src=&/v2-552e726fddf1db74df7a_b.jpg& data-rawwidth=&1000& data-rawheight=&667& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-552e726fddf1db74df7a_r.jpg&&&img src=&/v2-23cdbeb5fdfcb9b249b90a0_b.jpg& data-rawwidth=&1000& data-rawheight=&668& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-23cdbeb5fdfcb9b249b90a0_r.jpg&&&/p&&p&这个原型机项目仍在进行当中,我也没有足够的时间去做软件开发。上面的 UI 只有几百行代码,我在用不同的设备去测试,从一开始的 &a href=&/?target=https%3A///chromecast/tv/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chromecast&i class=&icon-external&&&/i&&/a&,然后是 &a href=&/?target=https%3A///nexus/player/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Nexus 播放器&i class=&icon-external&&&/i&&/a&,以及最近 &a href=&/?target=http%3A///dp/B00ZVJAF9G& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fire TV Stick&i class=&icon-external&&&/i&&/a&。&/p&&p&当你看里面的时候是这样的:&img src=&/v2-da2bae3a4ac_b.jpg& data-rawwidth=&800& data-rawheight=&1197& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-da2bae3a4ac_r.jpg&&&/p&&p&这就是到目前为止这个项目我所完成的进度,希望能把剩余的想法也变成现实。后期我可能会发布一个更详细的制作过程中的照片。敬请期待!&img src=&/v2-5ea6fc77facea_b.jpg& data-rawwidth=&800& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-5ea6fc77facea_r.jpg&&&/p&&blockquote&&b&原文:&/b&&a href=&/?target=https%3A///%40maxbraun/my-bathroom-mirror-is-smarter-than-yours-94b21c6671ba%23.4krnyrn3z& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&My Bathroom Mirror Is Smarter Than Yours&i class=&icon-external&&&/i&&/a&&/blockquote&
导读:每一个程序员都有一个极客的梦想,Max Braun 就是这么一个人,他将科幻电影里常常出现的智能镜面显示屏变成了现实,从想法的诞生、元部件的购买到原型机的测试,让我们一起看看他是怎么做的!去年的一些时候,我突然意识到,我想把洗手间那面普通的镜…
姑娘,你的提问是比较诚恳的,我愿意为你写一点干货。&br&&br&我觉得问题的关键是,你可能不是真正清楚,【&b&你做的每一件事,是为了什么&/b&】&br&&br&详细点说:&br&&ol&&li&因为自己的生长环境或过去所受的教育所限,&b&总是觉得自己做了正确的事情&/b&(比如 努力学习/参加社团/辛苦实习),&b&却并不明白这些事情为什么正确,以及在什么情况下正确;&/b&与此同时,&b&容易觉得别人在做一些不正确的事情&/b&(比如 热衷化妆/不务正业)&b&,却并不明白这些所谓“不正确”的事情&/b&,其实并不是那么“邪恶”,它们&b&也有自己的效益;&/b&&br&&/li&&li&&b&低估一件事情的“回报周期”。&/b&以为自己只要努力了,就一定能马上改变生活。&/li&&li&&b&容易产生无意义的自怜情绪&/b&,比如 熬夜写作业 / 辛苦端盘子 等等。总有一种 “为什么我那么努力,却没有相应的回报”,可却不明白,当你的努力方向不正确的时候,这些努力常常毫无意义。&br&&/li&&li&&b&羡慕别人比自己多获得的东西,却只是觉得这不公平,而不去思考内在原因。&/b&比如你的室友不学习、不社交,在这些方面不如自己,但她却找到高富帅男朋友,生活滋润。上面的两件事情其实并没有明显关联,关联度更大的其实是 “化妆” 和 “找男朋友”。 如果说你的室友不学习,但发了很厉害的 paper,那才是值得探讨的。&/li&&/ol&&br&实际上,我认为,&b&在任何时候,当我们在做一件“非日常”事情的时候,都应该对它可能带给你的收获有一个预期。&/b&这是帮助你决策,并摆脱 “不知道在忙什么”、“为什么没有收获” 的一个很有效的方法。&br&&br&首先,我们要排除一些“基本的”事情,因为这些事情每天或者定期都要做,且很难对你产生深远影响,比如:起床、刷牙、洗脸、吃饭、洗衣服、买日用品……&br&&br&然后,对于剩下的事情,都可以从以下几个维度来进行一个剖析:&br&&ol&&li&&b&预期;&br&&/b&&/li&&li&&b&成本(时间 / 金钱);&br&&/b&&/li&&li&&b&见效时间;&br&&/b&&/li&&li&&b&半衰期;&/b&(类似于“效果持续时间”)&br&&/li&&li&&b&可能风险;&br&&/b&&/li&&li&&b&可能的额外收获;&/b&&br&&/li&&/ol&……&br&&br&这里,我只列了 6 个维度,但实际上可能有更多,可以根据自己的需要,列一个个性化的表单。&br&&br&根据题主的情况,我来举几个例子:&br&&img src=&/bb0ccd562b7f2b01a57cfc0e_b.jpg& data-rawwidth=&912& data-rawheight=&431& class=&origin_image zh-lightbox-thumb& width=&912& data-original=&/bb0ccd562b7f2b01a57cfc0e_r.jpg&&其中,1、2、3、7、8 是题主姑娘提到的内容。&br&&br&其实,列完这张表格,很多问题就已经迎刃而解了。&br&&br&现在来简单地剖析一下姑娘你文中提到的一些行为吧……&br&&br&********************&br&&br&&ul&&li&&b&“拼命熬夜读书晕倒”&/b&&br&&/li&&/ul&&br&如此拼命地读书,想必不是闲书,那么你读书是为了什么呢?&br&&br&我表格中写的是:为后续课程提供先修 / 为未来工作提供有效工具&br&它的&b&见效是很慢的,但半衰期长&/b&。&br&&br&对于这种特性的事件,我的建议是:&b&不要争分夺秒&/b&(因为长期看,没有意义),&b&要细水长流&/b&。&br&&br&所以说,你读书当然是好事,但拼命熬夜读书,除了感动自己,没有任何意义。&br&&br&此外,你读书的效果,往往要很长以后才能体现出来,所以现在抱怨是毫无必要的。&br&&br&&ul&&li&&b&“我参加社团活动当干部忙的不可开交”&/b&&br&&/li&&/ul&&br&如此繁忙地参加社团,是为了什么呢?&br&&br&我曾经问过一些人这个问题,其中的不少人,马上就愣住了,他们完全不知道该怎么回答。&br&&br&很多人,&b&总是觉得自己做的事情是正确的,却很少去思考自己为什么这么做。&/b&&br&&br&在表格中,我总结了,参加社团,主要目的不外乎:&br&&img src=&/5ea37e1bf3c790000dba5_b.jpg& data-rawwidth=&238& data-rawheight=&84& class=&content_image& width=&238&&&br&你看,除了第一项以外,在这里的每一项,都需要很长时间才能见效,而且见效的方向和你提升现在的生活都相去甚远。&br&&br&而第一项,即 “结交有效人脉”,不知道姑娘你做得怎么样了。&br&&br&同样地,参加社团也应该是细水长流的事情,为此忙得不可开交实在没有必要。&br&&br&&ul&&li&&b&“也不打扮自己,干什么都很省”&/b&&br&&/li&&/ul&&br&姑娘请听我说,不打扮并没有任何优越感可言,&b&省钱也并不是美德&/b&;&br&问题的关键是,&b&你不去打扮,省下的时间和金钱是否能抵消你不打扮的损失。&/b&&br&&br&如果你觉得,在现阶段,打扮浪费时间和金钱,毫无意义,那自然可以不打扮,&br&但如果你决定这么想,那就不要羡慕打扮了的姑娘因为外貌而吸引了高富帅。&br&&br&同样地,花钱并不意味着浪费,在经济允许的情况下,适度花钱,获得相应的受益,是被鼓励的。&br&&br&&ul&&li&&b&“当我在饭店里给人家端茶倒水当服务员只为了一天70块的时候,她在朋友圈里发跟男朋友吃法国大餐的照片”&/b&&br&&/li&&/ul&&br&姑娘你刚刚毕业,当服务员一天70块想必是实习或者兼职。&br&在表格中,我已经写明,当服务员有什么好处。&br&&br&私以为,当服务员的门槛相对不高,重复劳动居多,长期来看效益较低。作为一个 211 大学本科毕业的人,做这项工作,除了辛苦以外,意义不大。&br&&br&&b&找实习或者兼职,当然应该首选和专业相关的、能提升业务水平的工作,其次是钱比较多的。&/b&&br&&br&不太理解你为什么要去做服务员,我猜可能和你周围的环境有关。&br&(当然,如果题主是类似于酒店管理专业的,那做服务员是有意义的)&br&&br&与此同时,你提到,你的那个室友,在吃法国大餐,并发到朋友圈。&br&不必想太多。她做这些,并不是为了打击你,也无心这么做,她做这些可能是为了表明:&br&&ul&&li&享受了味觉盛宴;&br&&/li&&li&过得很开心;&br&&/li&&li&满足了自己的虚荣心。&/li&&/ul&&br&由此也可见,姑娘你列举的两件事情,其实毫无可比性。&br&&br&如果你说 “我在做服务员,她却在名企实习”,这才是值得思考的问题。&br&&br&********************&br&&br&&b&总结:&/b&&br&&br&当你列了这样一张 “预期表” 以后,本回答开头的那些问题,都得到了解决方案:&br&&ol&&li&&b&你会分析一件事情的得失,而不仅仅纠结于它“是否正确”——小孩子才分对错,大人只看利弊;&br&&/b&&/li&&li&&b&在做一些事情的时候,你会更加耐心。知道有些事情不会马上见效,所以不会再抱怨“为什么我努力了那么久,我的生活还没有马上变好”;&/b&&/li&&li&&b&你了解了一件事情的真正效益和价值,知道很多事其实效率很低,至少“拼命”去做它是意义不大的,从而不会仅仅因为辛苦而产生“自怜”情绪;&br&&/b&&/li&&li&&b&你会分析事物之间的“因果关系”,不会再抱怨类似于“为什么我在辛辛苦苦种苹果,却没有吃到葡萄“之类的问题。&/b&&/li&&/ol&&br&姑娘,祝你调整好心情,找对方向,继续前行。&br&&br&【完】&br&&br&********************&br&&br&&b&本文可随意分享链接。如需转载,若仅是私人分享,请注明作者和原文地址,转载完最好私信通知我;&/b&&b&若是较大影响力的公众号或有商业用途,应当支付一定的稿费,请务必事先【私信】通知我。对违反者,我将保留追究的权利。谢谢理解!&/b&&br&&br&&b&知友们如果遇到了疑似未授权转载的公众号,也可【私信】告诉我,在此表示感谢。&/b&
姑娘,你的提问是比较诚恳的,我愿意为你写一点干货。 我觉得问题的关键是,你可能不是真正清楚,【你做的每一件事,是为了什么】 详细点说: 因为自己的生长环境或过去所受的教育所限,总是觉得自己做了正确的事情(比如 努力学习/参加社团/辛苦实习),却…
&blockquote&&h2&引言&/h2&&p&前段时间,『机器学习进阶笔记』系列一直关注TensorFlow系统的技术实践(想看TensorFlow技术实践的同学可直接拉到文章底部看相关阅读推荐),帮助大家从零开始,由浅入深,走上机器学习的进阶之路。虽然之前都在夸TensorFlow的好,但其劣势也很明显——对计算力要求太高,虽然使用方便,但是显存占用太高,计算也不够快,做公司项目还好,自己玩一些好玩的东西时太费时间了。&/p&&p&&b&简而言之,穷!&/b&&/p&今天新开一篇,给大家介绍另一个优秀而强大的深度学习框架——MXnet,现在MXnet资源相对少一点,基于MXnet的有意思的开源项目也相对少一点,不过没关系,都不是问题,他的优点是足够灵活,速度足够快,扩展新的功能比较容易,还有就是造MXnet都是一群说得上名字的大牛,能和大牛们玩一样的东西,想想都很兴奋有没有!&br&&br&&br&那我们开始吧:)&/blockquote&&br&&h3&前言&/h3&&b&如何找到自己实用的丹炉,是一个深度修真之人至关重要的,丹炉的好坏直接关系到炼丹的成功与否,道途千载,寻一合适丹炉也不妨这千古悠悠的修真(正)之路。&/b&&p& 为什么学mxnet? 熟悉本人博客的都知道,前段时间一直在关注TensorFlow也安利了很多次TFlearn,为什么这次突然会写MXnet的东西呢?原因是没钱呀,TensorFlow计算力要求太高,虽然使用方便,但是显存占用太高,计算也不够快,做公司项目还好,自己玩一些好玩的东西时太费时间,不过现在MXnet资源相对少一点,基于MXnet的有意思的开源项目也相对少一点,不过没关系,都不是问题,另外一点就是造MXnet都是一群说得上名字的大牛,能和大牛们玩一样的东西,想想都很兴奋。&/p&&p& MXnet的文档一直被一些爱好者喷,确实文档比较少,不过考虑到开发者都是业余时间造轮子(不,造丹炉!),很那像其他的框架有那么熟悉的文档,不过还好,在cv这块还是比较容易下手的。 这里有我从最近开始接触MXnet(其实很早就听说一直没有用过),学习的一些代码还有笔记&a href=&/?target=https%3A///burness/mxnet-101& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mxnet 101&i class=&icon-external&&&/i&&/a&,没有特别细致研究,只是了解怎么用在CV上,完整的做一个项目。&/p&&br&&br&&h2&新的丹方—inception-resnet-v2&/h2&&p&&strong&每一付新的丹方,无不是深度前辈们多年经验的结晶,丹方,很多时候在同样炼丹材料表现天差地别,也成为传奇前辈们的一个个标志。&/strong&&/p&&p& 一看到这个名字就知道和resnet和inception(googlenet 即是inception-v1)逃脱不了干系,就是一个比较复杂的网络结构,具体多复杂?!玩过tflearn的去看看我写的代码,run下 然后从tensorboard的graph打开看看,(之前一个被merge的版本后来发现没有batch normalization)改了的提了PR但是在写博客的时候还没有被merge&a href=&/?target=https%3A///tflearn/tflearn/pull/450& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&add inception-resnet-v2 in branch inception-resnet-v2 #450&i class=&icon-external&&&/i&&/a&。总之就是”丹方”特别复杂,具体去结合&a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning&i class=&icon-external&&&/i&&/a&,了解过resnet和googlenet的网络结构的小伙伴应该很容易弄明白,以下tflearn的代码参考&a href=&/?target=https%3A///tensorflow/models/blob/master/slim/nets/inception_resnet_v2.py& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tf.slim下inception-resnet-v2&i class=&icon-external&&&/i&&/a&。 基本的代码结构:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& # -*- coding: utf-8 -*-
&&& inception_resnet_v2.
Applying 'inception_resnet_v2' to Oxford's 17 Category Flower Dataset classification task.
References:
Inception-v4, Inception-ResNet and the Impact of Residual Connections
on Learning
Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi.
[http://arxiv.org/abs/](http://arxiv.org/abs/)
from __future__ import division, print_function, absolute_import
import tflearn
from tflearn.layers.core import input_data, dropout, flatten, fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d, avg_pool_2d
from tflearn.utils import repeat
from tflearn.layers.merge_ops import merge
from tflearn.data_utils import shuffle, to_categorical
import tflearn.activations as activations
import tflearn.datasets.oxflower17 as oxflower17
def block35(net, scale=1.0, activation='relu'):
tower_conv = conv_2d(net, 32, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_1x1')
tower_conv1_0 = conv_2d(net, 32, 1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1_0, 32, 3, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0b_3x3')
tower_conv2_0 = conv_2d(net, 32, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0a_1x1')
tower_conv2_1 = conv_2d(tower_conv2_0, 48,3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0b_3x3')
tower_conv2_2 = conv_2d(tower_conv2_1, 64,3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0c_3x3')
tower_mixed = merge([tower_conv, tower_conv1_1, tower_conv2_2], mode='concat', axis=3)
tower_out = conv_2d(tower_mixed, net.get_shape()[3], 1, normalizer_fn='batch_normalization', activation=None, name='Conv2d_1x1')
net += scale * tower_out
if activation:
if isinstance(activation, str):
net = activations.get(activation)(net)
elif hasattr(activation, '__call__'):
net = activation(net)
raise ValueError(&Invalid Activation.&)
return net
def block17(net, scale=1.0, activation='relu'):
tower_conv = conv_2d(net, 192, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_1x1')
tower_conv_1_0 = conv_2d(net, 128, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0a_1x1')
tower_conv_1_1 = conv_2d(tower_conv_1_0, 160,[1,7], normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0b_1x7')
tower_conv_1_2 = conv_2d(tower_conv_1_1, 192, [7,1], normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0c_7x1')
tower_mixed = merge([tower_conv,tower_conv_1_2], mode='concat', axis=3)
tower_out = conv_2d(tower_mixed, net.get_shape()[3], 1, normalizer_fn='batch_normalization', activation=None, name='Conv2d_1x1')
net += scale * tower_out
if activation:
if isinstance(activation, str):
net = activations.get(activation)(net)
elif hasattr(activation, '__call__'):
net = activation(net)
raise ValueError(&Invalid Activation.&)
return net
def block8(net, scale=1.0, activation='relu'):
tower_conv = conv_2d(net, 192, 1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_1x1')
tower_conv1_0 = conv_2d(net, 192, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1_0, 224, [1,3], normalizer_fn='batch_normalization', name='Conv2d_0b_1x3')
tower_conv1_2 = conv_2d(tower_conv1_1, 256, [3,1], normalizer_fn='batch_normalization', name='Conv2d_0c_3x1')
tower_mixed = merge([tower_conv,tower_conv1_2], mode='concat', axis=3)
tower_out = conv_2d(tower_mixed, net.get_shape()[3], 1, normalizer_fn='batch_normalization', activation=None, name='Conv2d_1x1')
net += scale * tower_out
if activation:
if isinstance(activation, str):
net = activations.get(activation)(net)
elif hasattr(activation, '__call__'):
net = activation(net)
raise ValueError(&Invalid Activation.&)
return net
# Data loading and preprocessing
import tflearn.datasets.oxflower17 as oxflower17
X, Y = oxflower17.load_data(one_hot=True, resize_pics=(299, 299))
num_classes = 17
dropout_keep_prob = 0.8
network = input_data(shape=[None, 299, 299, 3])
conv1a_3_3 = conv_2d(network, 32, 3, strides=2, normalizer_fn='batch_normalization', padding='VALID',activation='relu',name='Conv2d_1a_3x3')
conv2a_3_3 = conv_2d(conv1a_3_3, 32, 3, normalizer_fn='batch_normalization', padding='VALID',activation='relu', name='Conv2d_2a_3x3')
conv2b_3_3 = conv_2d(conv2a_3_3, 64, 3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_2b_3x3')
maxpool3a_3_3 = max_pool_2d(conv2b_3_3, 3, strides=2, padding='VALID', name='MaxPool_3a_3x3')
conv3b_1_1 = conv_2d(maxpool3a_3_3, 80, 1, normalizer_fn='batch_normalization', padding='VALID',activation='relu', name='Conv2d_3b_1x1')
conv4a_3_3 = conv_2d(conv3b_1_1, 192, 3, normalizer_fn='batch_normalization', padding='VALID',activation='relu', name='Conv2d_4a_3x3')
maxpool5a_3_3 = max_pool_2d(conv4a_3_3, 3, strides=2, padding='VALID', name='MaxPool_5a_3x3')
tower_conv = conv_2d(maxpool5a_3_3, 96, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_5b_b0_1x1')
tower_conv1_0 = conv_2d(maxpool5a_3_3, 48, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_5b_b1_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1_0, 64, 5, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_5b_b1_0b_5x5')
tower_conv2_0 = conv_2d(maxpool5a_3_3, 64, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_5b_b2_0a_1x1')
tower_conv2_1 = conv_2d(tower_conv2_0, 96, 3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_5b_b2_0b_3x3')
tower_conv2_2 = conv_2d(tower_conv2_1, 96, 3, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_5b_b2_0c_3x3')
tower_pool3_0 = avg_pool_2d(maxpool5a_3_3, 3, strides=1, padding='same', name='AvgPool_5b_b3_0a_3x3')
tower_conv3_1 = conv_2d(tower_pool3_0, 64, 1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_5b_b3_0b_1x1')
tower_5b_out = merge([tower_conv, tower_conv1_1, tower_conv2_2, tower_conv3_1], mode='concat', axis=3)
net = repeat(tower_5b_out, 10, block35, scale=0.17)tower_conv2_2 = conv_2d(tower_conv2_1, 96, 3, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_5b_b2_0c_3x3')
tower_pool3_0 = avg_pool_2d(maxpool5a_3_3, 3, strides=1, padding='same', name='AvgPool_5b_b3_0a_3x3')
tower_conv3_1 = conv_2d(tower_pool3_0, 64, 1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_5b_b3_0b_1x1')
tower_5b_out = merge([tower_conv, tower_conv1_1, tower_conv2_2, tower_conv3_1], mode='concat', axis=3)
net = repeat(tower_5b_out, 10, block35, scale=0.17)
tower_conv = conv_2d(net, 384, 3, normalizer_fn='batch_normalization', strides=2,activation='relu', padding='VALID', name='Conv2d_6a_b0_0a_3x3')
tower_conv1_0 = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_6a_b1_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1_0, 256, 3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_6a_b1_0b_3x3')
tower_conv1_2 = conv_2d(tower_conv1_1, 384, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID', activation='relu',name='Conv2d_6a_b1_0c_3x3')
tower_pool = max_pool_2d(net, 3, strides=2, padding='VALID',name='MaxPool_1a_3x3')
net = merge([tower_conv, tower_conv1_2, tower_pool], mode='concat', axis=3)
net = repeat(net, 20, block17, scale=0.1)
tower_conv = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0a_1x1')
tower_conv0_1 = conv_2d(tower_conv, 384, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID', activation='relu',name='Conv2d_0a_1x1')
tower_conv1 = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', padding='VALID', activation='relu',name='Conv2d_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1,288,3, normalizer_fn='batch_normalization', strides=2, padding='VALID',activation='relu', name='COnv2d_1a_3x3')
tower_conv2 = conv_2d(net, 256,1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0a_1x1')
tower_conv2_1 = conv_2d(tower_conv2, 288,3, normalizer_fn='batch_normalization', name='Conv2d_0b_3x3',activation='relu')
tower_conv2_2 = conv_2d(tower_conv2_1, 320, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID',activation='relu', name='Conv2d_1a_3x3')
tower_pool = max_pool_2d(net, 3, strides=2, padding='VALID', name='MaxPool_1a_3x3')
net = merge([tower_conv0_1, tower_conv1_1,tower_conv2_2, tower_pool], mode='concat', axis=3)
net = repeat(net, 9, block8, scale=0.2)
net = block8(net, activation=None)
net = conv_2d(net, 1536, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_7b_1x1')
net = avg_pool_2d(net, net.get_shape().as_list()[1:3],strides=2, padding='VALID', name='AvgPool_1a_8x8')
net = flatten(net)
net = dropout(net, dropout_keep_prob)
loss = fully_connected(net, num_classes,activation='softmax')
network = tflearn.regression(loss, optimizer='RMSprop',
loss='categorical_crossentropy',
learning_rate=0.0001)
model = tflearn.DNN(network, checkpoint_path='inception_resnet_v2',
max_checkpoints=1, tensorboard_verbose=2, tensorboard_dir=&./tflearn_logs/&)
model.fit(X, Y, n_epoch=1000, validation_set=0.1, shuffle=True,
show_metric=True, batch_size=32, snapshot_step=2000,
snapshot_epoch=False, run_id='inception_resnet_v2_17flowers')
tower_conv = conv_2d(net, 384, 3, normalizer_fn='batch_normalization', strides=2,activation='relu', padding='VALID', name='Conv2d_6a_b0_0a_3x3')
tower_conv1_0 = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_6a_b1_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1_0, 256, 3, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_6a_b1_0b_3x3')
tower_conv1_2 = conv_2d(tower_conv1_1, 384, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID', activation='relu',name='Conv2d_6a_b1_0c_3x3')
tower_pool = max_pool_2d(net, 3, strides=2, padding='VALID',name='MaxPool_1a_3x3')
net = merge([tower_conv, tower_conv1_2, tower_pool], mode='concat', axis=3)
net = repeat(net, 20, block17, scale=0.1)
tower_conv = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_0a_1x1')
tower_conv0_1 = conv_2d(tower_conv, 384, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID', activation='relu',name='Conv2d_0a_1x1')
tower_conv1 = conv_2d(net, 256, 1, normalizer_fn='batch_normalization', padding='VALID', activation='relu',name='Conv2d_0a_1x1')
tower_conv1_1 = conv_2d(tower_conv1,288,3, normalizer_fn='batch_normalization', strides=2, padding='VALID',activation='relu', name='COnv2d_1a_3x3')
tower_conv2 = conv_2d(net, 256,1, normalizer_fn='batch_normalization', activation='relu',name='Conv2d_0a_1x1')
tower_conv2_1 = conv_2d(tower_conv2, 288,3, normalizer_fn='batch_normalization', name='Conv2d_0b_3x3',activation='relu')
tower_conv2_2 = conv_2d(tower_conv2_1, 320, 3, normalizer_fn='batch_normalization', strides=2, padding='VALID',activation='relu', name='Conv2d_1a_3x3')
tower_pool = max_pool_2d(net, 3, strides=2, padding='VALID', name='MaxPool_1a_3x3')
net = merge([tower_conv0_1, tower_conv1_1,tower_conv2_2, tower_pool], mode='concat', axis=3)
net = repeat(net, 9, block8, scale=0.2)
net = block8(net, activation=None)
net = conv_2d(net, 1536, 1, normalizer_fn='batch_normalization', activation='relu', name='Conv2d_7b_1x1')
net = avg_pool_2d(net, net.get_shape().as_list()[1:3],strides=2, padding='VALID', name='AvgPool_1a_8x8')
net = flatten(net)
net = dropout(net, dropout_keep_prob)
loss = fully_connected(net, num_classes,activation='softmax')
network = tflearn.regression(loss, optimizer='RMSprop',
loss='categorical_crossentropy',
learning_rate=0.0001)
model = tflearn.DNN(network, checkpoint_path='inception_resnet_v2',
max_checkpoints=1, tensorboard_verbose=2, tensorboard_dir=&./tflearn_logs/&)
model.fit(X, Y, n_epoch=1000, validation_set=0.1, shuffle=True,
show_metric=True, batch_size=32, snapshot_step=2000,
snapshot_epoch=False, run_id='inception_resnet_v2_17flowers')
&/code&&/pre&&/div&&p& 想要run下的可以去使用下tflearn,注意更改conv_2d里面的内容,我这里在本身conv_2d上加了个normalizer_fn,来使用batch_normalization。&/p&&br&&br&&h2&MXnet 炼丹&/h2&&p&&strong&不同的丹炉,即使是相同的丹方,炼丹的方式都不仅相同。&/strong&&/p&&p&在打算用MXnet实现inception-resnet-v2之前,除了mxnet-101里面的代码,基本没有写过mxnet,但是没关系,不怕,有很多其他大神写的丹方,这里具体参考了&a href=&/?target=https%3A///burness/mxnet/blob/master/example/image-classification/symbol_inception-bn.py& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&symbol_inception-bn.py&i class=&icon-external&&&/i&&/a&。首先,为了减少代码条数,参考创建一个ConvFactory,但是和inception-bn不同的是,inception-resnet-v2要考虑是否要激活函数的版本。所以inception-resnet-v2的ConvFactory如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& def ConvFactory(data, num_filter, kernel, stride=(1,1), pad=(0, 0), act_type=&relu&, mirror_attr={},with_act=True):
conv = mx.symbol.Convolution(data=data, num_filter=num_filter, kernel=kernel, stride=stride, pad=pad)
bn = mx.symbol.BatchNorm(data=conv)
if with_act:
act = mx.symbol.Activation(data = bn, act_type=act_type, attr=mirror_attr)
return act
&/code&&/pre&&/div&&p& 然后就简单了,按照网络一路往下写:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& def get_symbol(num_classes=1000,input_data_shape=(64,3,299,299)):
data = mx.symbol.Variable(name='data')
conv1a_3_3 = ConvFactory(data=data, num_filter=32, kernel=(3,3), stride=(2, 2))
conv2a_3_3 = ConvFactory(conv1a_3_3, 32, (3,3))
conv2b_3_3 = ConvFactory(conv2a_3_3, 64, (3,3), pad=(1,1))
maxpool3a_3_3 = mx.symbol.Pooling(data=conv2b_3_3, kernel=(3, 3), stride=(2, 2), pool_type='max')
conv3b_1_1 = ConvFactory(maxpool3a_3_3, 80 ,(1,1))
conv4a_3_3 = ConvFactory(conv3b_1_1, 192, (3,3))
maxpool5a_3_3 = mx.symbol.Pooling(data=conv4a_3_3, kernel=(3,3), stride=(2,2), pool_type='max')
tower_conv = ConvFactory(maxpool5a_3_3, 96, (1,1))
tower_conv1_0 = ConvFactory(maxpool5a_3_3, 48, (1,1))
tower_conv1_1 = ConvFactory(tower_conv1_0, 64, (5,5), pad=(2,2))
tower_conv2_0 = ConvFactory(maxpool5a_3_3, 64, (1,1))
tower_conv2_1 = ConvFactory(tower_conv2_0, 96, (3,3), pad=(1,1))
tower_conv2_2 = ConvFactory(tower_conv2_1, 96, (3,3), pad=(1,1))
tower_pool3_0 = mx.symbol.Pooling(data=maxpool5a_3_3, kernel=(3,3), stride=(1,1),pad=(1,1), pool_type='avg')
tower_conv3_1 = ConvFactory(tower_pool3_0, 64, (1,1))
tower_5b_out = mx.symbol.Concat(*[tower_conv, tower_conv1_1, tower_conv2_2, tower_conv3_1])
&/code&&/pre&&/div&&p& 然后就不对了,要重复条用一个block35的结构,repeat函数很容易实现,给定调用次数,调用函数,参数, 多次调用就好了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& def repeat(inputs, repetitions, layer, *args, **kwargs):
outputs = inputs
for i in range(repetitions):
outputs = layer(outputs, *args, **kwargs)
return outputs
&/code&&/pre&&/div&&p& 这里很简单,但是block35就有问题啦,这个子结构的目的要输出与输入同样大小的channel数,之前因为在tensorflow下写的,很容易拿到一个Variable的shape,但是在MXnet上就很麻烦,这里不知道怎么做,提了个issue &a href=&/?target=https%3A///dmlc/mxnet/issues/3796& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How can i get the shape with the net?&i class=&icon-external&&&/i&&/a&,然后就去查api,发现有个infer_shape,mxnet客服部小伙伴也让我用这个去做, 试了试,挺管用能够拿到shape,但是必须给入一个4d的tensor的shape,比如(64,3,299,299),他会在graph运行时infer到对应symbol的shape,然后就这么写了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& def block35(net, input_data_shape, scale=1.0, with_act=True, act_type='relu', mirror_attr={}):
assert len(input_data_shape) == 4, 'input_data_shape should be len of 4, your \
input_data_shape is len of %d'%len(input_data_shape)
_, out_shape,_ = net.infer_shape(data=input_data_shape)
tower_conv = ConvFactory(net, 32, (1,1))
tower_conv1_0 = ConvFactory(net, 32, (1,1))
tower_conv1_1 = ConvFactory(tower_conv1_0, 32, (3, 3), pad=(1,1))
tower_conv2_0 = ConvFactory(net, 32, (1,1))
tower_conv2_1 = ConvFactory(tower_conv2_0, 48, (3, 3), pad=(1,1))
tower_conv2_2 = ConvFactory(tower_conv2_1, 64, (3, 3), pad=(1,1))
tower_mixed = mx.symbol.Concat(*[tower_conv, tower_conv1_1, tower_conv2_2])
tower_out = ConvFactory(tower_mixed, out_shape[0][1], (1,1), with_act=False)
net += scale * tower_out
if with_act:
act = mx.symbol.Activation(data = net, act_type=act_type, attr=mirror_attr)
return act
return net
&/code&&/pre&&/div&&p& 大家是不是感到很别扭,我也觉得很别扭,但是我一直是个『不拘小节』的工程师,对这块不斤斤计较,所以,写完这块之后也觉得就成了接下来就是block17, block8, 这里都很简单的很类似,就不提了。&/p&&p& 然后就接下来一段,很快就完成了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& net = repeat(tower_5b_out, 10, block35, scale=0.17, input_num_channels=320)
tower_conv = ConvFactory(net, 384, (3,3),stride=(2,2))
tower_conv1_0 = ConvFactory(net, 256, (1,1))
tower_conv1_1 = ConvFactory(tower_conv1_0, 256, (3,3), pad=(1,1))
tower_conv1_2 = ConvFactory(tower_conv1_1, 384, (3,3),stride=(2,2))
tower_pool = mx.symbol.Pooling(net, kernel=(3,3), stride=(2,2), pool_type='max')
net = mx.symbol.Concat(*[tower_conv, tower_conv1_2, tower_pool])
net = repeat(net, 20, block17, scale=0.1, input_num_channels=1088)
tower_conv = ConvFactory(net, 256, (1,1))
tower_conv0_1 = ConvFactory(tower_conv, 384, (3,3), stride=(2,2))
tower_conv1 = ConvFactory(net, 256, (1,1))
tower_conv1_1 = ConvFactory(tower_conv1, 288, (3,3), stride=(2,2))
tower_conv2 = ConvFactory(net, 256, (1,1))
tower_conv2_1 = ConvFactory(tower_conv2, 288, (3,3), pad=(1,1))
tower_conv2_2 = ConvFactory(tower_conv2_1, 320, (3,3),
stride=(2,2))
tower_pool = mx.symbol.Pooling(net, kernel=(3,3), stride=(2,2), pool_type='max')
net = mx.symbol.Concat(*[tower_conv0_1, tower_conv1_1, tower_conv2_2, tower_pool])
net = repeat(net, 9, block8, scale=0.2, input_num_channels=2080)
net = block8(net, with_act=False, input_num_channel=2080)
net = ConvFactory(net, 1536, (1,1))
net = mx.symbol.Pooling(net, kernel=(1,1), global_pool=True, stride=(2,2), pool_type='avg')
net = mx.symbol.Flatten(net)
net = mx.symbol.Dropout(data=net,p= 0.8)
net = mx.symbol.FullyConnected(data=net,num_hidden=num_classes)
softmax = mx.symbol.SoftmaxOutput(data=net, name='softmax')
&/code&&/pre&&/div&&p& 感觉很开心,写完了,这么简单,大家先忽略先忽悠所有的pad值,因为找不到没有pad的版本,所以大家先忽略下。然后就是写样例测试呀,又是17flowers这个数据集,参考mxnet-101中如何把dataset转换为binary, 首先写个py来get到所有的图像list,index还有他的label_index,这个很快就解决了。&/p&&p&具体参考我这里的&a href=&/?target=https%3A///burness/mxnet-101& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mxnet-101&i class=&icon-external&&&/i&&/a& 然后就是拿数据开始run啦,Ready? Go!&/p&&p& 咦,车开不起来,不对,都是些什么鬼? infer_shape 有问题? 没事,查api tensorflow中padding是”valid”和”same”,mxnet中没有, 没有…,要自己计算,什么鬼?没有valid,same,我不会呀!!!&/p&&p&写了这么久,就不写了?不行,找下怎么搞定,看了tensorflow的文档,翻了资料,same就是保证input与output保持一致,valid就无所谓,不需要设置pad,所以当tensorflow中有same的时候,就需要在mxnet中设置对应的pad值,kernel为3的时候pad=1, kernel=5,pad=2。这里改来改去,打印出每一层网络后的shape,前后花了我大概6个小时,终于让我一步一步debug出来了,但是不对,在repeat 10次block35后,怎么和tf.slim的inception-resnet-v2的注释的shape不同?&/p&&p&我了个擦,当时已经好像快凌晨4点了,本以为run起来了,怎么就解释不通呢?不会tensorflow的注释有问题吧?我了个擦,老美真是数学有点问题,提了个issue,很快就有人fix然后commit了 &a href=&/?target=https%3A///tensorflow/models/issues/634%23issuecomment-& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&may be an error in slim.nets.inception_resnet_v2 #634&i class=&icon-external&&&/i&&/a&,不过貌似到现在还没有被merge。&/p&&p& 一切ok,开始run了,用17flowers,很快可以收敛,没有更多的资源来测试更大的数据集,就直接提交了,虽然代码很烂,但怎么着也是一步一步写出来的,可是,始终确实是有点问题,后来经过github的好心人指点肯定也是一个大牛,告诉我Pooling 有个global_pool来做全局的池化,我了个擦,这么好的东西,tensorflow上可没有,所以tensorflow上用的是通过get_shape拿到对应的tensor的width和height来做pooling,我也二笔的在mxne它里面这样用,所以需要input_shape_shape来infer到所在layer的shape,来做全局池化,有了这个,我还infer_shape个什么鬼,blockxx里面也不需要了,channel数可以直接手工计算,传一个channel数就好了,get_symbol也可以保持和原来一样不需要传什么input_data_shape啦!!!&/p&&p&感谢&a href=&/?target=https%3A///zhreshold& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zhreshold&i class=&icon-external&&&/i&&/a&的提示,一切都ok,更改了,但是后面mxnet的大神在重构一些代码,还没有merge,不过没有关系,等他们ok了 我再把inception-resnet-v2整理下,再提pr(教练,我想当mxnet contributor)。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& def block35(net, input_num_channels, scale=1.0, with_act=True, act_type='relu', mirror_attr={}):
tower_conv = ConvFactory(net, 32, (1,1))
tower_conv1_0 = ConvFactory(net, 32, (1,1))
tower_conv1_1 = ConvFactory(tower_conv1_0, 32, (3, 3), pad=(1,1))
tower_conv2_0 = ConvFactory(net, 32, (1,1))
tower_conv2_1 = ConvFactory(tower_conv2_0, 48, (3, 3), pad=(1,1))
tower_conv2_2 = ConvFactory(tower_conv2_1, 64, (3, 3), pad=(1,1))
tower_mixed = mx.symbol.Concat(*[tower_conv, tower_conv1_1, tower_conv2_2])
tower_out = ConvFactory(tower_mixed, input_num_channels, (1,1), with_act=False)
net += scale * tower_out
if with_act:
act = mx.symbol.Activation(data = net, act_type=act_type, attr=mirror_attr)
return act
return net
&/code&&/pre&&/div&&p& 一直到这里,inception-resnet-v2就写出来了,但是只是测试了小数据集,后来在zhihu上偶遇李沐大神,果断上去套近乎,最后拿到一个一台机器,就在测大一点的数据集,其实也不大,102flowers,之后会请沐神帮忙扩展一个大点的盘来放下ImageNet,测试一下性能,不过现在102flowers也还行,效果还不错。&/p&&br&&br&&h2&丹成&/h2&&p&&strong&金丹品阶高低,以丹纹记,不同炼丹材料丹纹不同,评判标准也不同,acc是最常用判断金丹品阶高低的手段。&/strong&&/p&&p& 将102flower按9:1分成训练集和验证集,设置300个epoch(数据集比较小,貌似设置多点epoch才能有比较好的性能,看有小伙伴用inception-bn在imagenet上只需要50个epoch),网络inception-resnet-v2确实大,如此小的数据集上300 epoch大概也需要1天,不过对比tensorflow那是快多了。 &/p&&img src=&/50/v2-72ae0db02bbecd0059690d_b.png& data-rawwidth=&1763& data-rawheight=&1023& class=&origin_image zh-lightbox-thumb& width=&1763& data-original=&/50/v2-72ae0db02bbecd0059690d_r.png&&&br&&h2&编不下去了(predict)&/h2&&p& 这里,会简单地写一个inference的例子,算作学习如果使用训练好的model,注意还是最好使用python的opencv,因为mxnet官方是用的opencv,使用cv2这个库,我在网上找的使用skimage的库,做出来的始终有问题,应该是brg2rgb的问题,使用cv2的cv2.cvtColor(img, cv2.COLOR_BGR2RGB之后会成功:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span& import mxnet as mx
import logging
import numpy as np
import cv2
import scipy.io as sio
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
num_round = 260
prefix = &102flowers&
model = mx.model.FeedForward.load(prefix, num_round, ctx=mx.cpu(), numpy_batch_size=1)
# synset = [l.strip() for l in open('Inception/synset.txt').readlines()]
def PreprocessImage(path, show_img=False):
# load image
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
mean_img = mx.nd.load('mean.bin').values()[0].asnumpy()
print img.shape
print mean_img.shape
img = cv2.resize(img,(299,299))
img = np.swapaxes(img, 0, 2)
img = np.swapaxes(img, 1, 2)
img = img -mean_img
img = img[np.newaxis, :]
print img.shape
return img
with open('test.lst', 'r') as fread:
for line in fread.readlines()[:20]:
= '../day2/102flowers/' + line.split(&\t&)[2].strip(&\n&)
print batch
batch = PreprocessImage(batch, False)
prob = model.predict(batch)[0]
pred = np.argsort(prob)[::-1]
# # Get top1 label
# top1 = synset[pred[0]]
top_1 = pred[0]
if top_1 == int(line.split(&\t&)[1]):
print 'top1 right'
right += 1
print 'top 1 accuracy: %f '%(right/(1.0*sum))
&/code&&/pre&&/div&&p& 使用第260个epoch的模型weight,这里因为手贱删除了9:1时的test.lst,只能用7:3是的test.lst暂时做计算,最后accuracy应该会比较偏高,不过这不是重点。&/p&&br&&br&&h2&总结(继续编不下去了)&/h2&&p& 在这样一次畅快淋漓的mxnet之旅后,总结一下遇到的几个坑,与大家分享:&/p&&ul&&li&无法直接拿到tensor的shape信息,通过infer_shape,在设计代码时走了很多;&/li&&li&im2rec时,准备的train.lst, test.lst未shuffle,在102flowers上我都没有发觉,在后面做鉴黄的training的时候发现开始training accuracy,分析可能是train.lst未shuffle的问题(以为在ImageRecordIter中有shuffle参数,就不需要),改了后没有training accuracy从开始就为1的情况;&/li&&li&pad值的问题,翻阅了很多资料才解决,文档也没有特别多相关的,对于我这种从tensorflow转mxnet的小伙伴来说是个比较大的坑;&/li&&li&predict的问题,找了mxnet github的源上的example,并不能成功,在找官网上的example发现使用的是cv2,并不是一些例子当中的skimage,考虑到mxnet在安装时需要opencv,可能cv2和skimage在一些标准上有差异,就改用cv2的predict版本,还有读入图片之后要cv2.cvtColor(img, cv2.COLOR_BGR2RGB).&/li&&li&&p&还是predict的问题,在mxnet中,构造ImageRecordIter时没有指定mean.bin,但是并不是说计算的时候不会减到均值图片在训练,开始误解为不需要减到均值图片,后来发现一直不正确,考虑到train的时候会自己生成mean.bin,猜测可能是这里的问题,通过mean_img = mx.nd.load('mean.bin').values()[0].asnumpy()读入后,在原始图片减去均值图,结果ok;但整个流程相对于tf.slim的predict还是比较复杂的。&/p&&/li&&/ul&&p&&b&优点&/b&&/p&&ul&&li&&p&速度快,速度快,速度快,具体指没有做测量,但是相对于tensorflow至少两到三倍;&/p&&/li&&li&占用内存低, 同样batch和模型,12g的显存,tf会爆,但是mxnet只需要占用7g多点;&/li&&li&im2rec很方便,相对于tensorflow下tfrecord需要写部分代码,更容易入手,但是切记自己生成train.lst, test.lst的时候要shuffle;&/li&&li&&p&Pooling下的global_pool是个好东西,tensorflow没有;&/p&&/li&&/ul&&br&——————&br&&p&That is all!之后会在ImageNet Dataset做一下测试,感觉会更有意思。&/p&&p&&b&坐等更新,期待!&/b&&/p&&br&&br&&h2&相关阅读推荐:&/h2&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之六 | 深入理解Fast Neural Style&/a&&br&&/p&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之五 | 深入理解VGG\Residual Network&/a&&br&&/p&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之四 | 深入理解GoogLeNet&/a&&br&&/p&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之三 | 深入理解Alexnet &/a&&br&&/p&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之二 | 深入理解Neural Style&/a&&br&&/p&&p&&a href=&/p/& class=&internal&&机器学习进阶笔记之一 | TensorFlow安装与入门 &/a&&br&&/p&&br&&br&本文由『&b&UCloud内核与虚拟化研发团队&/b&』提供。&br&&br&&blockquote&&p&&b&关于作者:&/b&&/p&&p&Burness(&a href=&/people/822e01cbeee9& data-hash=&822e01cbeee9& class=&member_mention& data-hovercard=&p$b$822e01cbeee9& data-editable=&true& data-title=&@段石石&&@段石石&/a& ), UCloud平台研发中心深度学习研发工程师,tflearn Contributor & tensorflow Contributor,做过电商推荐、精准化营销相关算法工作,专注于分布式深度学习框架、计算机视觉算法研究,平时喜欢玩玩算法,研究研究开源的项目,偶尔也会去一些数据比赛打打酱油,生活中是个极客,对新技术、新技能痴迷。&/p&&p&你可以在Github上找到他:&a href=&/?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&/blockquote&&br&&p&「UCloud机构号」将独家分享云计算领域的技术洞见、行业资讯以及一切你想知道的相关讯息。&/p&&p&欢迎提问&求关注 o(*////▽////*)q~&/p&&p&以上。&/p&
引言前段时间,『机器学习进阶笔记』系列一直关注TensorFlow系统的技术实践(想看TensorFlow技术实践的同学可直接拉到文章底部看相关阅读推荐),帮助大家从零开始,由浅入深,走上机器学习的进阶之路。虽然之前都在夸TensorFlow的好,但其劣势也很明显——…
大清国一位贝勒在谈到工业革命问题时,毫不客气地说,英国允许工业革命如此快速发育,这是社会经济管理的严重失误。他说,大清国朝廷和商贾不是傻瓜,他们建几个蒸汽机易如反掌,但为什么不做?朝廷限制,商贾也很明智。因为大清国朝廷知道,一个手工作坊,背后就是一个中产阶级家庭,摧毁了它们的生存环境,那是社会的灾难。&br&&br&——————————————————————————————————————————————————&br&这谁乱改题目,改动了80%,然后又是谁举报我“答非所问”,有这样的吗?
大清国一位贝勒在谈到工业革命问题时,毫不客气地说,英国允许工业革命如此快速发育,这是社会经济管理的严重失误。他说,大清国朝廷和商贾不是傻瓜,他们建几个蒸汽机易如反掌,但为什么不做?朝廷限制,商贾也很明智。因为大清国朝廷知道,一个手工作坊,…
几乎不可能,游戏行业的垄断并不在内容层面上,而是平台或发行层面。内容实际上不存在垄断。&br&在目前国内的环境中,并不存在纯粹意义上的游戏产业。国内游戏产业属于互联网生态圈中的一环,是变现手段。各大互联网公司用各种免费的工具和网站吸引用户,然后将用户导入到游戏或电商等其他消费环节赚取利润,这是目前国内互联网行业通用的盈利模式,如果剥离了各个互联网平台提供的入口功能来看,很多游戏用户是不存在的。国外(发达国家))的规则有略微差别,拥有成熟的游戏产业,但是本质上还是一样的,区别只是用户入口不同。&br&&br&所以从整个产业的食物链来看,处于顶层的是平台提供商,手握大量用户,他们决定了整个行业的规则,拥有定价权。比如微软,sony,腾讯,任天堂(这是个奇葩),valve等。其次是大的发行公司,比如EA,UBI,动视暴雪。手握大量优质内容,拥有议价能力,再次是大大小小的开发商,负责内容开发。&br&&br&处于产业顶层的平台可以很轻易的介入发行和开发环节,但是处于下层的开发商和发行商很难升级成为平台。&br&&br&当一款游戏开发完成上市销售后,平台会拿走一部分,发行商再拿走一部分,而最终分到开发商手里的通常不会超过销售额的5成。因此,游戏内容创业团队就算开发出爆款产品,获得巨大收入,也很难挑战平台厂商或者发行厂商的地位。&br&&br&所以很多人喊出打破XX垄断的时候,其实并没有想清楚垄断是怎么形成的,也没有搞清楚要打破什么样的垄断。平台厂商的垄断是属于生态类型的,也就是商业模式的垄断。一款产品的成败得失并不会对它造成太大影响。举个例子,就算有创业公司开发出某个爆款游戏取代了LOL的地位,对腾讯这种平台厂商而言也只是失去电竞这块阵地而已,它还有页游,手游,其他类型端游支撑它的地位。&br&而巨头发行/开发公司的垄断则是在工业规格层面,利用技术和资金建立起工业壁垒,用规模化的生产线和丰富的产品类型确立自己的优势地位。例如EA,UBI这样的公司,可以轻松调动全球多个工作室的资源支持生产,在短时间内开发出大量优质产品,就算一款产品失败,后续还有大量产品提供补充。有丰富的产品内容涵盖各个用户群体。创业公司不可能做到生产模式。&br&&br&那么有没有机会打破现有类型的垄断呢?其实还是有的。一种是技术革命或者什么别的原因带来的新平台崛起,也就是自己新造一个平台。这在历史上屡见不鲜,近在眼前的例子就是移动平台的崛起,产生了谷歌和苹果这样新平台巨头。这也是目前大厂纷纷布局VR的原因。他们有的是为了抢占新阵地,有的则是出于防御性质,以免将来有朝一日被新平台取代。另一种就是商业模式的创新,比如valve经营的steam平台,让PC游戏重回大众视野,让独立游戏进入大众视线。&br&&br&回顾整个行业的发展,单纯从内容层面入手打破垄断的例子,目前还没有出现。但是之前也说了,内容层面本来就不存在垄断。&b&玩家永远不会拒绝更好的游戏。&/b&
几乎不可能,游戏行业的垄断并不在内容层面上,而是平台或发行层面。内容实际上不存在垄断。 在目前国内的环境中,并不存在纯粹意义上的游戏产业。国内游戏产业属于互联网生态圈中的一环,是变现手段。各大互联网公司用各种免费的工具和网站吸引用户,然后…
恰恰相反,特朗普团队的胜利才是真正美国精英阶层的胜利。此次大选为精英正名,让大家重新记起真正的美国精英为何种人。&br&&br&想当年,华盛顿,波多马克河畔一大农场主,不愁吃喝,锦衣玉食,为了什么抛家舍业,带着一帮乌合之众和英国人干?&br&&br&想当年,亚当斯,波士顿城中望族,当律师接案子接到手软,大笔的律师费递到手里求着他上法庭,为了什么冒着身败名裂的风险,给几个英国士兵辩护?&br&&br&想当年,拉法耶,侯爵之身,法国国王的红人,为了什么大老远巴巴的坐船来到蛮荒的美洲大陆,替几年前还是敌人的美国人出生入死,干跑了英国佬?&br&&br&想当年,富兰克林,无冕之王,一生已然功成名就,为了什么单枪匹马拖着老迈之身出使法兰西,以一己之力,倾倒巴黎上上下下,为初生的美国拿下保命的法美军事同盟?&br&&br&想当年,李将军,美西战争英雄,西点军校校长,为了什么,在明知不敌的情况下,毅然加入南军,又在南军失败后,顶着骂名投降为南方保留火种,为邦联重入联邦尽心尽力?&br&&br&所谓真精英,不是看你上的是不是藤校,是不是博士,能挣多少钱,地位如何显赫,家族多么古老,只看你是不是能为国家人民挺身而出,用你的地位财富名声做出积极影响,勇于领导人民而不是被人民领导,将这个国家变得更好。&br&&br&你克林顿躲在自家的基金会后面也配叫自己精英?
恰恰相反,特朗普团队的胜利才是真正美国精英阶层的胜利。此次大选为精英正名,让大家重新记起真正的美国精英为何种人。 想当年,华盛顿,波多马克河畔一大农场主,不愁吃喝,锦衣玉食,为了什么抛家舍业,带着一帮乌合之众和英国人干? 想当年,亚当斯,波…
&img src=&/50/v2-69ec58aeebf774e3ba5bff_b.jpg& data-rawwidth=&1500& data-rawheight=&1000& class=&origin_image zh-lightbox-thumb& width=&1500& data-original=&/50/v2-69ec58aeebf774e3ba5bff_r.jpg&&&p&绝大多数市场人员、创意人员、团队管理者,包括绝大多数4A广告公司,都热衷于使用头脑风暴。只要一提到「创意」,立刻就有人提议:&br&&/p&&p&我们开个会,脑暴一下吧,看看能碰出什么好点子。&/p&&p&甚至,有些时候,脑暴一下,成了一种「仪式」:接到一个Brief,一定要先开会脑暴一下,无论能不能得到有用的结果,否则就会一直觉得不完整。&br&&/p&&p&这就成了一个很吊诡的问题:&br&&/p&&p&当你创意枯竭、不知从何下手时,不是去用心搜集资料、收集案例、分析问题,而是寄希望于用群体的力量来解决——如果你(或者群体中的任何一个人)对问题已经有了完善的思路,何必用脑暴的形式讲出来?如果没有,凭什么脑暴的时候就能产生?&/p&&br&&br&&p&要知道,无论任何形式的头脑风暴,都存在一个无法避免的问题:浅。&br&&/p&&p&这是由脑暴的本质决定的。&br&&/p&&p&一场「恰当的」头脑风暴,有这么几个要求:&br&&/p&&ol&&li&&p&短:最长不超过一个小时,因为脑暴对精力消耗很大,时间拉得太长会特别疲劳;&/p&&/li&&li&&p&快:畅所欲言,不对思维作过多的限制,也不需要做深入的思考,先把点子抛出来;&/p&&/li&&li&&p&避免负反馈:不能对其他人的点子作评论,尤其不能发表负面的评价。&/p&&/li&&/ol&&p&那么,脑暴能得到什么样的结果,其实也非常明显了:&br&&/p&&p&通过脑暴,你可以收集到大量零散、粗糙、简单的想法,它们的数量和范围可能很广,很可能天马行空、羚羊挂角,但在深度上则普遍欠缺。&br&&/p&&p&这样的想法真的有价值吗?&br&&/p&&p&很多时候,其实没有多大价值。&/p&&p&实际操作中,&strong&我们缺乏的,往往不是某个非常有突破性、非常难以想到的角度,而是一个可行、清晰、简单易懂、却又非常契合品牌和受众的洞察。它需要的并不是广度,而是深度。&/strong&&br&&/p&&p&举个例子,当你给一个品牌写slogan时,你需要的是找到一个别人都想不到的角度吗?当然不是,如果一个slogan如此生僻,那它还怎么传播开去?&br&&/p&&p&你需要思考的,是这些:品牌的竞争优势是什么?目标受众的痛点是什么?两者能如何最有效地连接起来?用什么样的表述,能承载最大的信息量?能传达想表达的形象?能朗朗上口、易于记忆?能兼顾力度、美感和韵律?能让受众迅速理解、认同并接受?……&/p&&p&诸如这样的思维逻辑,并不是5个人、10个人、50个人碰一下就能得到结果的,&strong&它需要的是长时间专注、深入的思考。&/strong&&br&&/p&&p&一句好的slogan,往往要采取多种修辞手法——比如双关、拟人、比喻,以达到&strong&「承载更大信息量」&/strong&的目的。你读到这个句子,立刻产生最初步的联想,这是一层;品味句子的内涵,会有进一步的感悟,这是第二层;将句子和品牌联系起来,会觉得非常贴切、巧妙,这是第三层。&br&&/p&&p&这样的效果,有可能在一个脑暴中产生吗?当然不可能。这需要一个文案,长时间、反复锤炼自己的句子,10遍,20遍,50遍,才能出来。&br&&/p&&p&同样,当我们做创意时,重要的是什么,是这个点子前无古人、后无来者吗?不是的。如果看了足够多的案例,你就会发现,许多漂亮的创意,提炼成一句话,其实都差不多,并没有太大的本质差别。&br&&/p&&p&换言之,大家的点子,其实都差不多,你能想到的,别人也能想到。&br&&/p&&p&那么,是什么使它们成为成功的案例呢?是执行。&br&&/p&&p&怎么让这个创意落地,怎么呈现出来,怎么跟品牌联结——这些,也不是脑暴能够解决的。&br&&/p&&p&退一步说,就算只是想通过脑暴得到一个创意,也是很有限的。因为:&strong&绝大多数通过脑暴产生的点子,其实都非常肤浅和平庸。&/strong&&br&&/p&&p&为什么呢?非常简单,因为&strong&脑暴的本质,其实是一种习惯性思维&/strong&——我们日常生活中所见、所思的一切,都会在大脑中留下印象。有些印象较为深刻,或者记忆较为鲜活的,在我们激发表层思维的时候,就更容易被调用。这些素材与我们亟待解决的问题联系起来,就产生了一个个点子。&br&&/p&&p&简而言之,&strong&脑暴的结果,源于直觉和表层记忆&/strong&,本质上,是不可能有太多真正出色、漂亮的想法的。&br&&/p&&br&&br&&p&比起脑暴这些并不显著的效果,它带来的副作用,其实要严重得多。&/p&&p&脑暴从上个世纪50年代被发明出来,它的初衷,是鼓励大家群策群力,充分调动集体智慧,避免一个人决策、下面的人照做的传统思路,但它有一个问题:&br&&/p&&p&&strong&脑暴要求每个人讲出自己的想法,但做创意的人,真的都喜欢讲话吗?&/strong&&/p&&p&我问了身边五位做创意的朋友。他们有的是4A公司从业者,有的是甲方市场人员,得到的答案都很一致:&br&&/p&&p&比起一群人在讲话,他们更愿意一个人专注思考,然后把想法写下来。&/p&&p&当然,这是我的圈子,并非统计数据,做不得准,只是提供一个角度:&strong&很多做创意的人,其实性格会偏内向一点。他们更愿意静静思考,完善自己的想法,追求尽善尽美;而非在人群之中,把自己未成形的点子抛出来。&/strong&&br&&/p&&p&对这样的人来说,脑暴,不啻于一场折磨。&br&&/p&&p&很容易发生的情况就是:开完一场脑暴,身心俱疲,精力耗尽,也得不出任何有用的结果——因为他们的思维一直跟着冒出来的点子走,疲于奔命,也就没有闲暇好好琢磨。&br&&/p&&p&那么,为什么还有那么多的个人、那么多的公司推崇脑暴呢?&br&&/p&&p&有一种可能性,是因为:&strong&脑暴将「个人的责任」稀释成了「群体的责任」。&/strong&&br&&/p&&p&如果一个人想不出点子、写不出文案,是他的责任;但如果脑暴了,依然得不到好的结果,那责任就被分散到每个人身上了。&br&&/p&&p&而我们知道:责任被分散到群体头上,就等于没有了责任。因为每个人感知到的,都是:「这不是我的责任」。&br&&/p&&p&所以,脑暴成了一种转移、稀释压力的方式。&br&&/p&&p&另一种可能性是,脑暴确实能产生一些不错的点子。问题是,&strong&这些点子,真的只能通过脑暴产生吗?&/strong&或者说,如果换成别的方式,或者让你多花点时间去思考,是不是能给出更好的想法?&br&&/p&&p&这些都是未知数。&br&&/p&&p&当然,并不是说脑暴一无是处,在某些时候,脑暴这样的形式,是很有用的。&br&&/p&&p&例如,一群水平相仿、知识相近的朋友,在一个咖啡馆里,一边吃着东西,一边发散思维,随意闲聊,天马行空,每个人都保持在热情最高涨、精神水平最佳的状态——这种情况下,思维碰撞,会有很多好的想法诞生。&br&&/p&&p&但是,这种情况没办法人为制造,它更多的是一种恰逢其会。人为去营造这种情况,难度太大:每个人的精神状态难以统一,每个人的知识量、信息量难以统一,彼此之间的默契和契合度难以达到,并且,整个过程是不可控的——你很难把话题聚焦在一个问题、一个方向上面。因为只要有限制,就会削弱总体的氛围和自由感。&br&&/p&&p&另一种情况是,在面对一些对深度不作要求、更强调直觉和潜意识的场合下,脑暴的产出是很可观的。&br&&/p&&p&最简单的例子:一个APP,用起来有哪些顺手的地方,哪些不顺手的地方?类似这样的问题,一群人脑暴,肯定比一个人能想到的多得多。&br&&/p&&br&&br&&p&那么,如果不提倡脑暴,有什么更好的方法呢?&/p&&p&在我们团队里,大家使用的是这样的方法:&br&&/p&&ol&&li&&p&设定问题:我们要解决的是什么?有什么要求?需要遵循什么条件?&/p&&/li&&li&&p&每个人围绕问题进行思考,写出3-5个想法;&/p&&/li&&li&&p&约定一个时间,把写出来的东西汇总在一起,让大家看到别人的成果;&/p&&/li&&li&&p&每个人对自己的想法进行修改,尽可能完善;&/p&&/li&&li&&p&重复数次;&/p&&/li&&li&&p&确定最终提交的版本,汇总,逐条讨论、投票,选出最终采用的内容。&/p&&/li&&/ol&&p&这个方法,称为&strong&「头脑写作」(Brainwriting)&/strong&。&br&&/p&&p&当然,这里有一点区别:传统的「头脑写作」要求大家坐在一个会议室里,然后写下自己的想法,再依次传阅。我们采取的方式,是不分时间和空间的限制:拉一个群,交代一下问题,然后让大家利用碎片时间和业余时间思考,再写下思考成果,这样可以更有效地避免把思维限制在一小段时间里。&br&&/p&&p&这种方法,比起头脑风暴,最大的优点是:&strong&将深度思考、独立思考重新还给了参与者,让他们得以不受干扰地进行深度思考,努力完善、优化自己的想法。&/strong&&br&&/p&&p&而相对于让大家独立思考,这种多次的交流过程,又可以让每个人了解其他人的想法, 藉此完善自己想法的薄弱之处,获得更多的灵感和思考角度。&br&&/p&&p&关于头脑写作的作用,UTA的心理学教授Paul Paulus日前发表了一个实验报告:&br&&/p&&p&他与一间科技公司合作,挑选了57位参与者,把他们分成2组:第一组先进行头脑写作,再单独脑暴;第二组则先单独脑暴,再头脑写作。结果表明,头脑写作的效率,比单独脑暴高出37%;而在两组里面,第一组的表现也优于第二组。&br&&/p&&p&而在第二次实验中,他尝试了另一种方式:让参与者先进行8分钟的独立写作,再进行3分钟的汇总讨论,反复重复以上步骤(这就很接近我们团队的方式了)。结果表明:这种方法在一分钟内平均产出了50个想法,优于对照组(正常头脑写作)的29个。&br&&/p&&p&Paul Paulus认为:&strong&独立思考的时候,你无法参考别人的创意。而一群人脑暴,你会浪费大量的时间跟着别人的思路走。所以,将两者结合起来,才是最好的获得创意的方式。&/strong&&br&&/p&&p&(关于这个实验,可参阅:&a href=&/?target=https%3A///3062292/evidence/brainstorming-is-dumb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/306229&/span&&span class=&invisible&&2/evidence/brainstorming-is-dumb&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)&br&&/p&&br&&br&&p&最后还是总结一下:&/p&&p&脑暴的弊端在于,它拒绝了深度思考,更依赖于直觉。而在脑暴过程中,参与人的思路被迫跟着别人的思路走,不利于进行深入思考和创意的发掘。&br&&/p&&p&更好的方式,是将独立思考和群体交流相结合,将安静、专注的深度思考还给参与者,并提供机会,参考别人想法,借以调整、完善自己的想法。&br&&/p&&p&如果你还困扰于创意产出的低效,不妨可以试试。&/p&
绝大多数市场人员、创意人员、团队管理者,包括绝大多数4A广告公司,都热衷于使用头脑风暴。只要一提到「创意」,立刻就有人提议: 我们开个会,脑暴一下吧,看看能碰出什么好点子。甚至,有些时候,脑暴一下,成了一种「仪式」:接到一个Brief,一定要先开…
说明:暑假会全部重新整理和更新完毕。目前答案存在笔误的地方请多包涵。暑假会一并修正。&br&(即将开始的暑期服务见答案结尾,有意向者请联系)&br&没有看不懂的所谓高大上!没有大学内容!切实分享一些高中数学老师基本不会讲但解题能用到的干货!&br&&br&广告(值得一看的干货):全国卷理科考生如何提高成绩&a href=&/question//answer/& class=&internal&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/question/4758&/span&&span class=&invisible&&9177/answer/&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&&br&============================&br&&br&&br&1.&img data-rawwidth=&3264& data-rawheight=&697& src=&/8b664a15fb6fbb2bdf97_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/8b664a15fb6fbb2bdf97_r.jpg&&用数形结合算函数题时对画图很有用&br&&br&2.&img data-rawwidth=&3264& data-rawheight=&941& src=&/3fe637bde6defdb0ce057cb_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/3fe637bde6defdb0ce057cb_r.jpg&&周期什么的大家应该都知道,所以千万注意这些隔一个周期函数值会发生变化的!&br&&br&3.&img data-rawwidth=&3215& data-rawheight=&947& src=&/83e72c3f09d9a92f618ebd6d16c782a1_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3215& data-original=&/83e72c3f09d9a92f618ebd6d16c782a1_r.jpg&&&br&这个很实用,可以不用画图,直接算出最值。但要千万注意函数表达式中到底是加号还是减号!(括号里不符合特征意思是图中f(x)表达式中划红线的加号换成减号)&br&&br&4.&img data-rawwidth=&2048& data-rawheight=&1246& src=&/6ad41f17a59f6c3ae5e0bb3_b.jpg& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&/6ad41f17a59f6c3ae5e0bb3_r.jpg&&一些常见又不太常见的奇函数...选择填空题里遇到可以直接用&br&&br&5.&img data-rawwidth=&3264& data-rawheight=&1077& src=&/7cbeb10bc2d97_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/7cbeb10bc2d97_r.jpg&&特殊情况&br&&br&6.&img data-rawwidth=&1322& data-rawheight=&1280& src=&/c421d1c00ec3bcfc312f_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1322& data-original=&/c421d1c00ec3bcfc312f_r.jpg&&&br&各种情况下的对勾函数图像&br&&br&7.&br&&img data-rawwidth=&3264& data-rawheight=&697& src=&/564dcedae3caca9ded79b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/564dcedae3caca9ded79b_r.jpg&&&br&这种题型是不是很熟悉呢?以后遇到直接用就好 不必纠结怎么证明&br&&br&&br&8.接下来更一些函数的图像和性质&br&(1)&img data-rawwidth=&2048& data-rawheight=&1049& src=&/c09b16fa5bd26f8d79bea6ed_b.jpg& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&/c09b16fa5bd26f8d79bea6ed_r.jpg&&&br&(2)&br&&img data-rawwidth=&3264& data-rawheight=&1284& src=&/206a28bf5b7eed8dc26ec3ca9d03c1ff_b.jpg& class=&origin_image zh-lightbox-thumb& width=&3264& data-original=&/206a28bf5b7eed8dc26ec3ca9d03c1ff_r.jpg&&&br&(3)&br&&img data-rawwidth=&2011& data-rawheight=&1280& src=&/9d11c33ab20e2982f35dfa_b.jpg& class=&orig

我要回帖

更多关于 苏州高新区创业园 的文章

 

随机推荐