苹果如何在classin中wps如何上传文档档

当前位置:
classin在线教室Mac
classin在线教室Mac v1.6.0
软件大小:46.60MB
软件语言:简体中文
软件类型:国产软件
软件授权:免费软件
更新时间:
软件类别:
应用平台:WinXP, Win7, Win8, WinAll
classin在线教室Mac版是一款由翼鸥教育推出的在线教育类软件,这款软件目前已覆盖各类教育细分领域用户,其中涉及少儿英语、出国留学考试、K12学科辅导、成人职业培训、少儿编程、围棋、绘画、音乐等多个品类~拥有教学直播和在线教学等功能,能够提高教学质量,帮助学生更加轻松地进行在线学习~
翼鸥教育公布的资料显示,ClassIn目前已覆盖各类教育细分领域用户,其中涉及少儿英语、出国留学考试、K12学科辅导、成人职业培训、少儿编程、围棋、绘画、音乐等多个品类,机构用户数已经接近300家,使用学生数量超过10万。
翼鸥教育成立于 2014 年 9 月,核心产品为在线直播底层工具ClassIn 在线教室,为班课在线教学提供解决方案。ClassIn坚持以教育理念为产品设计底层基础,除了还原线下的教学场景&起立、讨论、分组、抢答、随堂考&等教学活动之外,还结合互联网特性升级出新一代的在线教学场景。在此场景下,在线课堂的学生专注程度不低于或将远高于线下实际课堂。
ClassIn可以建立在线学习的场景。无论是混和式教学,还是翻转课堂,还是AltSchool。
1.64MB|5.5
7.77MB|5.5
1.72MB|5.5
4.74MB|5.5
资源未发布
下载排行榜
多媒体类丨0KB
网络工具丨0KB
微信号: 游迅网
扫描二维码添加
海量单机游戏免费下载!
您身边的手机游戏宝库!Unknown&class&in&Interface&Builder&file
Builder找Class的机制和一般的源文件相同,需要保证包含目标symbol的文件被链接进到最终的app。
出现这个错误,是因为这个class只在IB中用到,编译器在其他源文件中没有发现对这个class的引用,于是没有链接那个class。
解决方法:
1. 在任意一个源文件中使用一下这个class,比如NSLog(@”%@”, classA);
2. 在project的Info里面的Link Flag处,增加-all_load,这样会链接所以存在的symbol
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&p&作者:&a href=&https://link.zhihu.com/?target=http%3A//hangzh.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&张航&/a& Amazon AI Applied Scientist&/p&&p&&br&&/p&&p&很多用户在论坛上,GitHub 上,甚至是不同的深度学习平台上,都要求提供跨卡同步(Cross-GPU Synchronized) Batch Normalization 或称为同步BN (SyncBN)。 我们团队率先提供了 MXNet 的&a href=&https://link.zhihu.com/?target=http%3A//mxnet.incubator.apache.org/versions/master/api/python/gluon/contrib.html%3Fhighlight%3Dsyncbatchnorm%23mxnet.gluon.contrib.nn.SyncBatchNorm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&实现&/a&。&/p&&h2&写在前面:为什么要跨卡同步 Batch Normalization&/h2&&p&现有的标准 Batch Normalization 因为使用数据并行(Data Parallel),是单卡的实现模式,只对单个卡上对样本进行归一化,相当于减小了批量大小(batch-size)(详见&a href=&https://link.zhihu.com/?target=https%3A//zh.mxnet.io/blog/syncbn%23batch-normalization%25E5%25A6%%25BD%%25B7%25A5%25E4%25BD%259C& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BN工作原理部分&/a&)。 对于比较消耗显存的训练任务时,往往单卡上的相对批量过小,影响模型的收敛效果。 之前在我们在图像语义分割的实验中,&a href=&https://link.zhihu.com/?target=http%3A//zhongyuezhang.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Jerry&/a&和我就发现使用大模型的效果反而变差,实际上就是BN在作怪。 跨卡同步 Batch Normalization 可以使用全局的样本进行归一化,这样相当于‘增大‘了批量大小,这样训练效果不再受到使用 GPU 数量的影响。 最近在图像分割、物体检测的论文中,使用跨卡BN也会显著地提高实验效果,所以跨卡 BN 已然成为竞赛刷分、发论文的必备神器。&/p&&h2&Batch Normalization如何工作&/h2&&p&既然是技术贴,读者很多是深学大牛,为什么还要在这里赘述BatchNorm这个简单概念吗?其实不然,很多做科研的朋友如果没有解决过相关问题, 很容易混淆BN在训练和测试时候的工作方式。记得在17年CVPR的 &a href=&https://link.zhihu.com/?target=http%3A//deeplearning.csail.mit.edu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tutoial&/a& 上, 何恺明和RBG两位大神分别在自己的talk上都特意强调了BN的工作原理,可见就算台下都是CV的学者,也有必要复习一遍这些知识。&/p&&ul&&li&工作原理:&/li&&/ul&&p&BN 有效地加速了模型训练,加大 learning rate,让模型不再过度依赖初始化。它在训练时在网络内部进行归一化(normalization), 为训练提供了有效的 regularization,抑制过拟合,用原作者的话是防止了协方差偏移。这里上一张图来展示训练模式的BN:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-eb5bd52313ffcb23dfb3fa_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&325& data-rawheight=&250& class=&content_image& width=&325&&&/figure&&p&其中输入样本,其均值为,方差为, BN的输出,是可学习对参数。 个人认为,这种强大的效果其实来自于back-propagation时候,来自于&b&均值和方差对输入样本的梯度&/b&( )。 这也是BN在训练模式与其在测试模式的重要区别,在测试模式(evaluation mode)下, 使用训练集上累积的均值和方差,在back-propagation的时候他们对输入样本没有梯度(gradient)。&/p&&ul&&li&数据并行:&/li&&/ul&&p&深度学习平台在多卡(GPU)运算的时候都是采用的数据并行(DataParallel),如下图:
&/p&&figure&&img src=&https://pic4.zhimg.com/v2-1521ee41aeee79739bfb19e7fea6a848_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&338& data-rawheight=&268& class=&content_image& width=&338&&&/figure&&p&&br&&/p&&p&每次迭代,输入被等分成多份,然后分别在不同的卡上前向(forward)和后向(backward)运算,并且求出梯度,在迭代完成后合并
梯度、更新参数,再进行下一次迭代。因为在前向和后向运算的时候,每个卡上的模型是单独运算的,所以相应的Batch Normalization 也是在卡内完成,所以实际BN所归一化的样本数量仅仅局限于卡内,相当于批量大小(batch-size)减小了。&/p&&h2&如何实现 SyncBN&/h2&&p&跨卡同步BN的关键是在前向运算的时候拿到全局的均值和方差,在后向运算时候得到相应的全局梯度。 最简单的实现方法是先同步求均值,再发回各卡然后同步求方差,但是这样就同步了两次。实际上只需要同步一次就可以, 我们使用了一个非常简单的技巧,把方差表示为, 附上一张图:
&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fe2ccbe3cf4dd50c281eff7e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&337& data-rawheight=&266& class=&content_image& width=&337&&&/figure&&p&&br&&/p&&p&这样在前向运算的时候,我们只需要在各卡上算出与,再跨卡求出全局的和即可得到正确的均值和方差, 同理我们在后向运算的时候只需同步一次,求出相应的梯度与。 我们在最近的论文&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Context Encoding for Semantic Segmentation&/a& 里面也分享了这种同步一次的方法。&/p&&p&有了跨卡BN我们就不用担心模型过大用多卡影响收敛效果了,因为不管用多少张卡只要全局的批量大小一样,都会得到相同的效果。&/p&&h2&&a href=&https://link.zhihu.com/?target=https%3A//discuss.gluon.ai/t/topic/1156& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&讨论点这里&/a&&/h2&&p&欢迎查看&a href=&https://link.zhihu.com/?target=https%3A//github.com/zhanghang1989/MXNet-Gluon-SyncBN/blob/master/ChineseQA.md& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&常见问答&/a&, 并且到&a href=&https://link.zhihu.com/?target=https%3A//discuss.gluon.ai/t/topic/1156& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&论坛讨论区&/a&交流。&/p&&p&[&b&&a href=&https://link.zhihu.com/?target=http%3A//mxnet.incubator.apache.org/versions/master/api/python/gluon/contrib.html%3Fhighlight%3Dsyncbatchnorm%23mxnet.gluon.contrib.nn.SyncBatchNorm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文档链接&/a&&/b&],特别感谢&a href=&https://link.zhihu.com/?target=https%3A//github.com/eric-haibin-lin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&林海滨&/a&在代码实现过程中的大力帮助。&/p&
作者: Amazon AI Applied Scientist 很多用户在论坛上,GitHub 上,甚至是不同的深度学习平台上,都要求提供跨卡同步(Cross-GPU Synchronized) Batch Normalization 或称为同步BN (SyncBN)。 我们团队率先提供了 MXNet 的。写在前面:为什么要…
&figure&&img src=&https://pic3.zhimg.com/v2-dbed079e6fd7e3f361c9d5e8_b.jpg& data-rawwidth=&1177& data-rawheight=&783& class=&origin_image zh-lightbox-thumb& width=&1177& data-original=&https://pic3.zhimg.com/v2-dbed079e6fd7e3f361c9d5e8_r.jpg&&&/figure&&p&我从2017年年初开始接触kaggle。曾翻阅&b&知乎上&/b&很多关于kaggle的回答和文章,然而逐渐发现&b&大部分文章中提到的经验和技巧是针对传统machine learning类比赛的,对计算机视觉类的比赛并不适用&/b&。此刻已是2018年6月,我也参加过了多次比赛,或多或少有了一些自己的观点和感想。&b&因此我写这一篇文章希望对现存文章进行一定程度的&i&补充&/i&,以供刚刚接触kaggle计算机视觉(CV)类比赛的同学参考&/b&。尽管此文会充斥个人观点和猜测,我会尽量提供论据并淡化感情色彩。这是我在知乎的第一篇文章,希望大家能够多多鼓励和批评。&/p&&h2&&b&一、我的成绩&/b&&/h2&&ul&&li&第一次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/the-nature-conservancy-fisheries-monitoring/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Nature Conservancy Fisheries Monitoring&/a& &br&排名: 16th of 2,293 ? Top 1% ? 角色:队长。另一个队员叫&a href=&https://link.zhihu.com/?target=https%3A//pengsunblog.wordpress.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&孙鹏&/a&,是同一实验室的同学&/li&&li&第二次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/carvana-image-masking-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Carvana Image Masking Challenge&/a&&br&排名: 12th of 735 ? Top 2% ? 角色:前期单刷,后来基本上由女朋友完成。&/li&&li&第三次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/cdiscount-image-classification-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cdiscount’s Image Classification Challenge&/a&&br&排名: 15th of 627 ? Top 3% ? 角色:基本是单刷。偶尔和女友以及朋友讨论一下。&/li&&li&第四次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/statoil-iceberg-classifier-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Statoil/C-CORE Iceberg Classifier Challenge&/a&&br&排名: 28th of 3,343 ? Top 1% ? 角色:打酱油。队长是孙鹏。&/li&&li&第五次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Recognition Challenge&/a&&br&排名: 9th of 483 ? Top 2% ? 担任角色:单刷&/li&&li&并列第五次&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-retrieval-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Retrieval Challenge&/a& &br&排名: 22th of 218 ? Top 11% ? 角色:单刷。基本上只用landmark recognition比赛的代码跑了一下,没有进行调参等尝试,完全是投机取巧。&/li&&/ul&&p&这六次比赛皆为计算机视觉类的任务。我还曾试图参加&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/tensorflow-speech-recognition-challenge& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow Speech Recognition Challenge&/a&这个语音识别类的比赛,最终因为自己过于外行和精力不足知难而退。&/p&&p&以上就是我的全部比赛经历。&/p&&h2&&b&二、kaggle上的两个世界&/b&&/h2&&p&kaggle的比赛任务大致都是根据已知信息,对测试集里的数据进行某种预测。按照主流方法是否涉及到deep learning来分,&b&大概有两种比赛&/b&:&/p&&p&&b&A.一种比赛比较适合传统的machine learning方法&/b&,要想取得好成绩,可能要在feature engineering和ensemble方面大做文章。但基本用不上deep learning,因此有没有好的GPU无关紧要。这类比赛的例子有房价预测等:&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/house-prices-advanced-regression-techniques& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&House Prices: Advanced Regression Techniques&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/zillow-prize-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Zillow Prize: Zillow’s Home Value Prediction (Zestimate)&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/two-sigma-financial-modeling& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Two Sigma Financial Modeling Challenge&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/sberbank-russian-housing-market& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sberbank Russian Housing Market&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/instacart-market-basket-analysis& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Instacart Market Basket Analysis&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/web-traffic-time-series-forecasting& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Web Traffic Time Series Forecasting&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/mercedes-benz-greener-manufacturing& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mercedes-Benz Greener Manufacturing&/a&&/p&&p&&br&&/p&&p&&b&B.另一种比赛现阶段主流的解决方案是各种深度神经网络&/b&,主要以计算机视觉类为主,任务包括image/video classification, object detection, image masking。偶尔也有语音识别类任务。迄今为止我参加过的比赛都是这一种。参加此类比赛对硬件有一定程度的要求。比如说有一个台式机和一块或多块Titan X/1080ti会对模型的迭代帮助很大。但用笔记本GPU甚至完全不用GPU并且排名靠前的人也是有的:&/p&&ul&&li&例1:我的同学孙鹏,用笔记本上的980M.&/li&&li&例2:一个叫Eric的Kaggler,用5个无GPU的电脑跑PyTorch,&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Recognition Challenge&/a&中获得28th/483排名。参见&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/discussion/57879& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&I enjoyed this competition: Feedback from a newbie!&/a&&/li&&li&例3:一个ID为ImageRecog的Kaggler,声称用笔记本打比赛,在&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-retrieval-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Retrieval Challenge&/a&中赢得季军。(不确定后期有没上更强大的硬件。)&/li&&/ul&&p&但总归会痛苦很多。&/p&&p&&br&&/p&&p&&b&很多kagglers对这两类比赛之一表现出了明显的偏好&/b&。如 &a class=&member_mention& href=&https://www.zhihu.com/people/ac3ae2bbdfc79ef8dbac& data-hash=&ac3ae2bbdfc79ef8dbac& data-hovercard=&p$b$ac3ae2bbdfc79ef8dbac&&@砍手豪&/a&因为缺少用来训练神经网络的硬件,而倾向于参加A类比赛(参见:《&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&零基础自学两月后三月三次轻松进入kaggle比赛top20小结&/a&》)。而我自己迄今参加的都是B类的比赛,原因是自己习惯于处理计算机视觉类的任务,而对传统machine learning任务尤其是时序预测方面了解比较少,不想进去垫底。如此一来kaggle上仿佛存在着两个不同的世界。A、B类比赛都很投入地去参加的人当然也是存在的,只是据我所见大部分人都倾向于参加其中一类。&/p&&p&我在此强调这两类比赛的区别,一个重要原因是,我发现&b&迄今为止知乎上大部分的kaggle入门指南大都是针对A类比赛的&/b&。例:&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&参加kaggle竞赛是怎样一种体验? - Naiyan Wang的回答 - 知乎&/a& &a class=&member_mention& href=&https://www.zhihu.com/people/f5911fddc7fa5fd74a80d5ce2c12e1a2& data-hash=&f5911fddc7fa5fd74a80d5ce2c12e1a2& data-hovercard=&p$b$f5911fddc7fa5fd74a80d5ce2c12e1a2&&@Naiyan Wang&/a& &/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&参加kaggle竞赛是怎样一种体验? - Alex Hsu的回答 - 知乎&/a& &a class=&member_mention& href=&https://www.zhihu.com/people/d0a9d24ee22e76f72840& data-hash=&d0a9d24ee22e76f72840& data-hovercard=&p$b$d0a9d24ee22e76f72840&&@Alex Hsu&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&零基础自学两月后三月三次轻松进入kaggle比赛top20&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/ac3ae2bbdfc79ef8dbac& data-hash=&ac3ae2bbdfc79ef8dbac& data-hovercard=&p$b$ac3ae2bbdfc79ef8dbac&&@砍手豪&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&分分钟带你杀入Kaggle Top 1%&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/96b734daaa5f65ed2c0aa0& data-hash=&96b734daaa5f65ed2c0aa0& data-hovercard=&p$b$96b734daaa5f65ed2c0aa0&&@吴晓晖&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Kaggle 入门指南&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/21a8ef50cfcfd43& data-hash=&21a8ef50cfcfd43& data-hovercard=&p$b$21a8ef50cfcfd43&&@Linghao Zhang&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Kaggle 首战拿银总结 | 入门指导 (长文、干货)&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/87e5eeebe490b1790ae18& data-hash=&87e5eeebe490b1790ae18& data-hovercard=&p$b$87e5eeebe490b1790ae18&&@Scarlet Pan&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&随机森林——实现Kaggle排名Top2%的利器&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/02e3c986dc1e49e24a74f876379dac27& data-hash=&02e3c986dc1e49e24a74f876379dac27& data-hovercard=&p$b$02e3c986dc1e49e24a74f876379dac27&&@胡阿白&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Kaggle实战(2)—房价预测:高阶回归技术应用&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/20c04cea624a1ad& data-hash=&20c04cea624a1ad& data-hovercard=&p$b$20c04cea624a1ad&&@Datacruiser&/a& &/p&&p&&br&&/p&&p&&b&B类比赛的文章/回答则少得多&/b&,例:&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&参加kaggle竞赛是怎样一种体验? - AI研习社的回答 - 知乎&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/99e0b9e21ba5afd80414& data-hash=&99e0b9e21ba5afd80414& data-hovercard=&p$b$99e0b9e21ba5afd80414&&@AI研习社&/a& &a class=&member_mention& href=&https://www.zhihu.com/people/f00cbd7f70e287b0cba55d& data-hash=&f00cbd7f70e287b0cba55d& data-hovercard=&p$b$f00cbd7f70e287b0cba55d&&@郑华滨&/a& &a class=&member_mention& href=&https://www.zhihu.com/people/43fd1a3d8af& data-hash=&43fd1a3d8af& data-hovercard=&p$b$43fd1a3d8af&&@蒋礼斌&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&我在Kaggle數海獅&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/27ace63abf8123& data-hash=&27ace63abf8123& data-hovercard=&p$b$27ace63abf8123&&@outrunner&/a& &/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&Kaggle 的比赛在 Machine Learning 领域中属于什么地位? - 幻云羽音的回答 - 知乎&/a& -- &a class=&member_mention& href=&https://www.zhihu.com/people/cf537d1febddc& data-hash=&cf537d1febddc& data-hovercard=&p$b$cf537d1febddc&&@幻云羽音&/a& &/p&&p&&b&我希望本文可以对关注B类比赛的kaggler提供一些参考。&/b&&/p&&h2&&b&三、靠套路而豪无创新究竟能得到怎样的成绩?&/b&&/h2&&p&有人说kaggle比赛全靠套路。这句话隐含的意味是要想在kaggle上获得好成绩,靠的是套路而不是智慧和灵感,或者靠的不是真正的技术。如果去杠的话,我们也可以说发paper也是靠套路。但我想,&b&即使&/b&真的是靠套路,也未必是一件完全的坏事,套路中也能体现高下之分,套路中也能体现出能力的强弱吧。很多kaggler的成绩都是比较稳定的。比如bestfitting连续在6个比赛中得了Top 3。比如Fangzhou Liao四次参加比赛全部都是冠军。而我大部分时间都进不去Top10,也从未出过Top30,大概是因为我总也没参透Top10选手的套路,而排名30+的参赛者总也没参透我的套路吧。&/p&&p&那么&b&靠套路而豪无创新究竟能得到怎样的成绩&/b&?我来试图给出一个&b&下界&/b&出来:&/p&&p&1.在&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/carvana-image-masking-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Carvana Image Masking Challenge&/a&中我的第一个baseline模型是Unet,而且图省事用的是&a href=&https://link.zhihu.com/?target=https%3A//github.com/junyanz/pytorch-CycleGAN-and-pix2pix& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pytorch-CycleGAN-and-pix2pix&/a&中的Unet。为了赶快跑出个结果我把图片从大约缩小成了256x256大小。没有经过任何调参的第一次提交结果是(Private Leaderboard) Dice coefficent = 0.985517,比赛结束时这个成绩可以排到top 72%.把图片大小改成768x512之后,未经任何其他修改,成绩是coefficent = 0.995050,比赛结束时可以排到top 53%.&/p&&p&2.在&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/cdiscount-image-classification-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cdiscount’s Image Classification Challenge&/a&中我的第一个baseline模型是Pytorch的Resnet101,第一次提交的成绩是Accuracy = 0.71929,比赛结束时这个成绩可以排进Top 12%.&/p&&p&3.在&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Recognition Challenge&/a&中我的第一个baseline模型是ResNet50,第一次提交的成绩是GAP = 0.115.我后来在讨论区把这个模型的训练公开了,即便如此,这个成绩在比赛结束时居然也可以排到Top 14%.我的第二个baseline模型&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DELF&/a&成绩是GAP = 0.203,比赛结束时可以排进top 4%!&/p&&p&4.在&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-retrieval-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Retrieval Challenge&/a&中我套用了Recognition中使用的DELF代码,第一个模型既是最后一个模型,没有调优过程,排名11%.&/p&&p&5. &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/the-nature-conservancy-fisheries-monitoring/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Nature Conservancy Fisheries Monitoring&/a&是个two-stage比赛,两个stage用的测试集不同,并且stage 1的成绩已被主办方清空所以我无法判断我们第一个baseline模型可以在最终的leaderboard上排第几。&/p&&p&6. &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/statoil-iceberg-classifier-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Statoil/C-CORE Iceberg Classifier Challenge&/a&这个比赛我是打酱油的,前期的实验细节我手头暂时缺失。&/p&&p&以上经验表明,只要&b&选择了与任务相对应的state-of-art模型&/b&,在代码无bug,没有实验设置错误的情况下,&b&排进Top 50%甚至Top 15%难度很小&/b&。那么另外的50%~85%的参赛者出了什么问题呢?我猜可能原因有如下几种:&/p&&p&1.根本不知道state-of-art模型是什么,也不知道怎么检索或者没有检索的意识。&/p&&p&例:&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/discussion/53418& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&想强行套用mnist分类的方法来解决image retrieval问题&/a&。&/p&&p&2.不想离开心理舒适区,而选择自己相对比较熟悉或容易上手的工具、库和模型。&/p&&p&譬如说因为喜欢用keras或者keras刚入门而只用网上找得到源码的基于keras的模型。&/p&&p&3.或多或少知道state-of-art模型的存在,但硬件条件有限,而选择对计算资源要求不高的模型。&/p&&p&例:&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/discussion/85& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&因为硬盘小或网速慢而下载缩小几倍的图片代替原图来进行训练的。&/a&&/p&&p&4.代码有bug,debug苦手。&/p&&p&5.实验设置有问题。比如存在逻辑错误或者参数有严重问题。&/p&&h2&&b&四、参加比赛有什么好处&/b&&/h2&&p&至于说为什么有50%~85%之多,如果说不是向来如此,也许是最近几年kaggle更火了,入门者也更多了吧。我去年(2017)在国内已经发现很多人在求职简历里写kaggle比赛经历。至于&b&kaggle比赛经历对求职有多大好处我还不能确定&/b&。值得一提的是,我在参加第一次比赛感觉坚持不下去的时候,是看了 &a class=&member_mention& href=&https://www.zhihu.com/people/bae4da& data-hash=&bae4da& data-hovercard=&p$b$bae4da&&@lau phunter&/a& 的帖子坚持下去的:&/p&&blockquote&更新:两年过去了大家参加Kaggle热情高涨标准也水涨船高,以下标准请浮动一级。&br&原答案:&br&获奖的都是有真本事的人,在上面练几个题目得个好名次,十分能证明你对数据科学这个领域的实践和理解。我现在招人的时候几乎是这个标准:&br&写上参加过Kaggle比赛,我会看简历。&br&得过一次10%,我会给电话面试。&br&得过2次或者以上10%,我会给on site面试。&br&得过一次前10,我们会谈笑风生。&br&楼主加油。&br&&br&作者:lau phunter&br&链接:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&zhihu.com/question/3203&/span&&span class=&invisible&&2932/answer/&/span&&span class=&ellipsis&&&/span&&/a&&br&来源:知乎&br&著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。&/blockquote&&p&虽然水涨船高,总归有人认可是好事。&/p&&p&&br&&/p&&p&&b&我想从一个平常人的角度来讨论kaggle比赛能给我们带来什么&/b&。我先来举几个不适合平常人的角度:&/p&&p&1.一个网上经常被讨论的话题,就是“paper重要还是比赛成绩重要”。我想,能考虑这个问题的人并不适用那种很极端的情况:例如ILSVRC(Imagenet)如果能得第一自然也能把方法发到顶会上去。——ILSVRC能得冠军的人根本不会疑惑这种问题吧。&/p&&p&2.“如果进了前几名还可以获得奖金。”如果不是Grandmaster的级别(例:&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/carvana-image-masking-challenge/discussion/29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vladimir Iglovikov一年内获得奖金$28k&/a&),平常人的收益风险比恐怕还不如去搬砖。&/p&&p&而平常人真正容易面对的情况是,发顶会paper被拒或者根本写不出来,参加比赛成绩不算拔尖或者被吊打。&b&我认为如果一个人如果花时间可以换来顶会一作,那么不参加kaggle也没有什么遗憾的。&/b&&/p&&p&Kaggle常年都有各种比赛,有整理好的数据集,有各种kernel和帖子教你怎样下载和使用数据集,甚至会给出一些baseline代码。获胜者也会分享他们的solution。这些特点&b&对于那些想要尝试一些曾经没做过的计算机视觉任务的人来说是十分新手友好&/b&的。这里的新手指代的不一定是计算机视觉方面完全的新手,比如说如果你本来只熟悉物体识别,想尝试一下语义分割,那么kaggle也可能很适合你。&/p&&p&Kaggle还有一大特色就是实时的leaderboard,非常残酷。如果你什么都不做,你的比赛名次只会下降。这会造成一种心理的刺激,&b&给你压力/动力&/b&让你改善模型——当然这也是一种精神折磨。&/p&&p&我还有一个感想是:&b&kaggle比赛给了每个AI爱好者被考验的免费机会&/b&。可以让一些喜欢空想和嘴炮的人检查一下自己是不是如同想象的那般厉害。但这个感想的&b&诡异之处&/b&在于,由于我上文中提到的,只要正常跑通一个ResNet101就可能进Top 15%,而或许有人觉得Top 15%很了不起,这样一些喜欢空想和嘴炮的人参加kaggle之后或许真的觉得自己很厉害了。So paradoxical……!&/p&&p&还有就是会&b&认识很多志同道合的网友&/b&,这一点不展开讨论了。&/p&&h2&&b&五、陷阱和一些技巧&/b&&/h2&&p&1.每场比赛会有多少人参与?&/p&&p&计算机视觉类比赛用到的数据通常是图片和视频,无论是空间占用还是计算量都比较大,大到&b&很多人不得不因为硬件资源,或处理大规模数据的经验和能力问题,而不愿意参与数据集较大的比赛&/b&。这导致了一场比赛的参与人数和数据量强相关。小数据集的例子如&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/data-science-bowl-2018& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2018 Data Science Bowl&/a&训练集只有80M左右,参与队数高达3634,&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/statoil-iceberg-classifier-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Statoil/C-CORE Iceberg Classifier Challenge&/a&训练集只有43M,参与队数高达3343。数据集比较大的如 &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/cdiscount-image-classification-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cdiscount’s Image Classification Challenge&/a&训练集60G,参与队数为627。而&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Recognition Challenge&/a&的训练集要170G左右,参与队数为483。&/p&&p&&b&另一个决定参与人数的主要因素是任务的复杂程度和生僻程度&/b&。&b&纯分类任务比较受欢迎&/b&,其次是语义分割等任务。这些比较受欢迎的任务特点是门槛比较低,网上找得到大量现成的代码和模型(如VGG、ResNet、Unet、SegNet),会调库无需深入了解原理甚至可能不用调参就能跑出像模像样的结果。(因为诸如图片分类等任务门槛特别低,以至于被某些人当做AI从业者的黑点。对此类黑点的态度不在本文的讨论范围。)&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-recognition-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Recognition Challenge&/a&和&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/landmark-retrieval-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Landmark Retrieval Challenge&/a&数据集大小几乎一样,因为retrieval问题的门槛相对比较高,后者的参与队伍数不到前者的一半。而&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/nips-2017-targeted-adversarial-attack/data& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NIPS 2017: Targeted Adversarial Attack&/a&这个对抗攻击任务,只有65队参加。&/p&&p&硬件条件好,经验丰富,能力强的人不太在乎如上两点因素,并且排名靠前经常霸榜的人大都是这样的人,因此&b&一个人的期望排名和参与总队伍数并非是线性关系&/b&。——譬如说,我在两千队参与的比赛中得了第16,那么同样的水平和发挥,我在六七百队参与比赛中就能进前10吗?没那么容易,事实证明我在六七百队参与的比赛中依然是第十几名。当然这里没有考虑到运气成分,只是个粗略的例子。&/p&&p&由于我抱以上述观点,显而易见我个人看重绝对排名胜于Top百分比。但会有很多人偏好于追求一个漂亮的Top百分比。我的建议是,&b&想要top百分比好看,或者目标是铜牌和银牌的同学应该多参加人多的比赛&/b&。人再多,Top 10%都保证有铜牌,Top 5%都保证有银牌;而人多的情况下进Top 10%甚至Top 5%的几率也大。(金牌的规则不一样,队伍总数1000+的情况下金牌数只有 &img src=&https://www.zhihu.com/equation?tex=10%2B0.2%5C%25+%5Ctimes%E9%98%9F%E4%BC%8D%E6%80%BB%E6%95%B0& alt=&10+0.2\% \times队伍总数& eeimg=&1&& 。参见&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/progression& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kaggle Progression System&/a&)&/p&&p&&br&&/p&&p&2. Public Leaderboard陷阱&/p&&p&数据集小的比赛虽然门槛低,却并不真的简单容易。较小的样本量会导致验证集和测试集的样本分布差异较大。加上由于计算量小,模型迭代(这里指更新换代,不是训练一个iteration)速度快,很容易导致一种后果:overfit到验证集上,这种后果导致的常见悲惨结局是比赛结束的时候发现Public leaderboard成绩还不错,但是Private Leaderboard上的排名一落千丈(通常Public Leaderboard会被当成是某种意义上的验证集)。例如&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/statoil-iceberg-classifier-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Statoil/C-CORE Iceberg Classifier Challenge&/a& 的两个leaderboard上有很多人有一百多甚至两百多的排名变化,相比较而言,数据量大了的三个数量级的&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/cdiscount-image-classification-challenge/leaderboard& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cdiscount’s Image Classification Challenge&/a&绝大部分人排名都没有变化,少数有1~2名的浮动。&/p&&p&对此我只有一句空洞的建议:&b&合理的evaluation策略至关重要&/b&。Kaggle排名第一位的bestfitting(真名Shubin Dai,中国人)称:&/p&&blockquote&A good CV is half of success. I won’t go to the next step if I can’t find a good way to evaluate my model.&/blockquote&&p&———链接:&a href=&https://link.zhihu.com/?target=http%3A//blog.kaggle.com//profiling-top-kagglers-bestfitting-currently-1-in-the-world/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Profiling Top Kagglers: Bestfitting, Currently #1 in the World&/a&&/p&&p&这些大佬们每次在比赛结束公布Private Leaderboard的时候排名都比较稳定,不太容易下降很多。可见看似是取决于运气的排名大震荡,在大佬手里是有办法控制的。这大概就是真功夫吧。&/p&&p&&br&&/p&&p&3.马甲和私享代码&/p&&p&在数据集小的比赛中,由于迭代速度比较快,每天提交的次数又有限制(大部分比赛是5次),所以经常会有人注册小号来提交结果。在数据集较大的比赛中,后期也偶有这样的现象。有的人在排名比较好的时候会私下里把代码分享给别人(比如同学),以求一人得道鸡犬升天……。我在比赛中见过几次别人注册马甲或私享代码。譬如说一夜之间就冒出了一堆三无账号,成绩还都差不多。或者在成绩对参数极其敏感的任务中一次提交就飞进Top5%,一发入魂。&b&一人多号和私享代码是违背比赛精神的,也是Kaggle命令禁止的,并且也是Kaggle会探测和封杀的。&/b&可悲的是,经常会有中国人这样做。为什么我这么确定?因为有些账号的ID用的是拼音,或者地址选了China。真是又坏又蠢,作弊本已可耻,却还要披着中国人的形象。大概是觉得自己聪明,占了便宜却无人知晓吧……然而最终这些账号都被主办方踢出了比赛或者删号处理。&/p&&p&&br&&/p&&p&4.刷全站排名&/p&&p&全站排名取决于你在过往比赛中取得的总积分,积分公式如下图:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-296ed23212_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&981& data-rawheight=&233& class=&origin_image zh-lightbox-thumb& width=&981& data-original=&https://pic4.zhimg.com/v2-296ed23212_r.jpg&&&/figure&&p&截图来源:&a href=&https://link.zhihu.com/?target=http%3A//blog.kaggle.com//improved-kaggle-rankings/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Improved Kaggle Rankings&/a& (图侵删)&/p&&p&积分是随着时间呈指数衰减的。这意味着,如果要&b&刷高自己的排名最高纪录,那么参加几次间隔很久的比赛,不如参加几次间隔很短的比赛&/b&。&/p&&p&另外参加任何的比赛都不会减分,所以片面地追求全站排名不太在乎提高自身水平的,可以考虑在海量的比赛中打酱油。这是一个病态无聊但可行的策略。&/p&&p&&br&&/p&&p&5.更多的supervision&/p&&p&&b&在绝大部分的比赛当中,在训练集上做额外的标记都是不违反规则的&/b&,只要在规定的时间(有些比赛是deadline的两周以前)以前上传到讨论区和其他参赛者分享。譬如说,在鱼类识别的任务中,你可以用bounding box标记出鱼的位置。在海狮计数的任务中你可以用mask来标记出每一个属于海狮的像素。&b&这些额外的标记通常都能帮助训练出更好的模型&/b&。但开销也不小。另外要注意的是,在测试集上做标记是明令禁止的作弊行为。&/p&&p&&br&&/p&&h2&&b&六、其它&/b&&/h2&&p&1.参加计算机视觉类的比赛需要多少GPU&/p&&p&一两块Titan X, Ti就够了。一块980也勉强可以。四块以上的GPU当然更好,但GPU多了其实很难充分利用到。运算速度快到一定程度,人脑debug、分析问题、想idea的时间就成了主要的速度瓶颈。如果不怎么分析问题,不怎么想idea,走无脑穷举试错的路线,以图速度或图省事,很容易走偏。高手们会根据自己的经验和直觉来快速尝试不同的模型,所以驾驭得了更多GPU。如果你有“只要给我更多的GPU我肯定能大幅提高排名”这样的自信,不妨试试aws上的spot instance,如果确实如此,那就可以攒钱或求赞助来入手GPU了。&/p&&p&诚然,小数据集的比赛对GPU要求很低,甚至750M这样的GPU也可以用。但是因为迭代速度太快,以及leaderboard每天都有大浮动,这样的比赛参加起来特别费肝……&/p&&p&&br&&/p&&p&2.什么样的排名算是一个好的排名&/p&&p&Jeremy Howard在2017年年初或2016年年末(记不清了)的fast.ai的教学视频里(出处懒得求证了)说:排进Top 50%,说明你的模型还OK;排进Top 10%,说明你是这个领域的专家;排进Top 10说明你是世界上最顶尖的专家。他的这段话过于乐观了。很多时候排名看起来还可以,只是因为真正的(诉诸纯洁:P)专家们和大佬们大多没有时间参加kaggle而已。但这么想似乎也是有失公允的,因为菜鸟和外行们也大都没有参加kaggle。所以谁知道呢……?&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
我从2017年年初开始接触kaggle。曾翻阅知乎上很多关于kaggle的回答和文章,然而逐渐发现大部分文章中提到的经验和技巧是针对传统machine learning类比赛的,对计算机视觉类的比赛并不适用。此刻已是2018年6月,我也参加过了多次比赛,或多或少有了一些自己…
&figure&&img src=&https://pic2.zhimg.com/v2-aba5_b.jpg& data-rawwidth=&1984& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1984& data-original=&https://pic2.zhimg.com/v2-aba5_r.jpg&&&/figure&&p&本文主要是介绍我们录用于 ECCV'18 的一个工作:&i&&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Person Search via A Mask-guided Two-stream CNN Model&/a&&/i&. 这篇文章着眼于 Person Search 这个任务,即同时考虑行人检测(Pedestrian Detection)与行人重识别(Person Re-identification),简单探讨了一下行人检测与行人重识别这两个子任务之间的关联性,并尝试利用全景图像中的背景信息来辅助 Re-ID. 最后我们的模型在 CUHK-SYSU 和 PRW 这两个数据集上都取得了不错的效果。&/p&&p&&br&&/p&&h2&&b&什么是 Person Search?&/b&&/h2&&p&目前大家的焦点大都集中在 Person Re-ID 之上,比如 CVPR'18 的 Re-ID 相关文章数目就达到了惊人的三十多篇。Person Re-ID 处理的对象:probe image 和 gallery image 都是已经&b&切好块&/b&了的,即图像中基本只包含了我们所感兴趣的这个人,其他可能的干扰信息(比如背景、遮挡、另外的行人等)已经尽可能降到了最低。当然了,这是为了创建一个统一的、标准化的研究课题而做的一个实验室环境下的约束。随着 Person Re-ID 的性能被逐渐刷高,是时候考虑一下&u&与实际应用更接近一些&/u&的任务了,比如 Person Search.&/p&&p&Person Search 处理的对象中,probe image 与 Re-ID 一样,依然是切好块的图像;而 gallery image 变成了&b&未切块的全景图像&/b&,也就是一般相机拍出来的未经过处理的图像。一张全景图像中通常包含了多个行人,如果要将已有的 Re-ID 技术用起来的话,那就得事先找到各个行人在全景图像中的位置。因此,&b&Person Search = Pedestrian Detection + Person Re-ID.&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-cfbb1a18aac05_b.jpg& data-size=&normal& data-rawwidth=&2370& data-rawheight=&1016& class=&origin_image zh-lightbox-thumb& width=&2370& data-original=&https://pic2.zhimg.com/v2-cfbb1a18aac05_r.jpg&&&figcaption&行人检测与行人重识别;图片来自 Zheng et al. [1]&/figcaption&&/figure&&p&Pedestrian Detection 与 Person Re-ID 两者作为相对独立的课题已经被研究多年,两者的研究现状已经相对比较成熟;因此我认为 Person Search 并不着眼于这两者的具体技术,而应该&b&&u&考虑这两个任务之间相互关系,将这关系中的先验信息融入到模型中去。&/u&&/b&&/p&&p&那么 &b&Pedestrian Detection 与 Person Re-ID 有什么关系呢?&/b&或者说 &b&Person Search 与 Person Re-ID 相比有何不同?&/b&本文主要就针对这两个问题给出了两个粗浅的答案。&/p&&p&&br&&/p&&h2&&b&1. Pedestrian Detection 与 Person Re-ID 的目标函数相互矛盾。&/b&&/h2&&p&对于一个 Pedestrian Detector 来讲,它的目标是&b&正确地区分一个 proposal 是背景还是行人。&/b&理想的情况下,detector 会把所有的背景归为一类,所有的行人归为另一类,不管这个行人他是谁,发型怎么样,衣服包包什么颜色,或高或矮或胖或瘦,&b&描述这些行人的特征向量的距离都必须足够小&/b&。因此,&b&detector 关注的是行人之间的&u&共性&/u&&/b&,比如人体轮廓。&/p&&p&但是 Re-ID 模型就不一样了,它的(训练)目标是&b&正确地区分一个已知是行人的 proposal 是谁。&/b&既然要分辨这个行人是谁,那么高矮胖瘦发型衣服之类的信息就变得及其重要了。同时也要求&b&描述不同身份的行人的特征向量的距离尽可能大。&/b&因此,&b&Re-ID 模型关注的是行人之间的&u&个性&/u&。&/b&&/p&&p&State-of-the-art 的模型 [2, 3, 4] 都将 detection 与 Re-ID 融合到了同一个框架中, Re-ID 的多分类 loss 与 Faster R-CNN 的二分类 loss 混在一起联合训练,因此不可避免的会碰到目标函数上的矛盾,让可怜的神经网络迷迷糊糊摸不着头脑。于是我们决定:&/p&&p&&b&分成两个模型独立训。。。&/b&&/p&&p&是的,简陋粗暴,一点都不优雅。黑是黑了点,好歹还是能抓老鼠的。来看个简单的对比:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-79da02c06ace_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2132& data-rawheight=&620& class=&origin_image zh-lightbox-thumb& width=&2132& data-original=&https://pic4.zhimg.com/v2-79da02c06ace_r.jpg&&&/figure&&p&表 (a) 描述的是 detector 性能的对比。OIM-ours 是我们用 Pytorch 重新实现的 OIM 模型 [2], 在最终的 person search performance 与论文中的 performance 一致的情况下,它的 detector AP 为 69.5%; 在相同的情况下,我们把 OIM 模型中的 OIMLoss 去掉,用相同的参数仅训练一个 Faster R-CNN, 通过调整 detection threshold 使两者的 recall 相同的情况下,后者的 AP 比前者高了将近 10 个点。
因此可以得出&b&结论一:Re-ID 的分类 loss 会干扰到 detector 的训练。&/b&&/p&&p&表 (b) 描述的是在撇开 detector 最终性能的情况下,Re-ID 的 performance 比较。两者都基于 ResNet-50, 以 OIMLoss 为分类 区别是前者基于 Faster R-CNN, 与 detection loss 一起训练,而后者 IDNetOIM 则是用 ground truth bounding box 训练和测试。后者的 performance 微微高于前者,因此可以得出&b&结论二:Detector 的分类 loss 会干扰到 Re-ID 的分类 loss.&/b&&/p&&p&综合两个结论,可以认为 Pedestrian Detection 与 Person Re-ID 这两个任务确实互有干扰。因此我们最终的模型采用了 detector 与 Re-ID feature extractor 分离的策略。尽管这么做是粗糙了点,后续如果能想办法显式地建模两个任务之间的关联性,并融入到 Faster R-CNN 中去,将会是个更有意思的工作。&/p&&p&&br&&/p&&h2&&b&2. Person Search 有背景!更多的背景!&/b&&/h2&&p&Person Search 的数据集中都是全景图片,相比 Re-ID 数据集中切好块的图像多了很多背景信息。然而,&b&背景信息对行人重识别是否有用?&/b&这个问题却不太好回答,毕竟&u&我们人类自己也搞不太清楚自己是怎么认人的&/u&。试想一下,一分钟前我看到了一个推着婴儿车的老人走过,一分钟后我在另一个地点同样看到了一个推着婴儿车的老人经过,那么「婴儿车」这个背景信息很可能会作为一个很强的暗示,使得自己认为这两个老人是同一个人;另一方面,我们的目标是为了「认人」,然而当前这个老人完全可以在你没看到他的时候扔下婴儿车,当我们下一次见到这个老人的时候,「有没有婴儿车」这个背景信息反而成为了我们作出判断的干扰因素。&/p&&p&目前在行人重识别领域,主流观点还是倾向于认为背景信息是一个干扰项,得想办法去掉,比如 CVPR'18 上的两篇文章 [5, 6]。但是 [5] 和 [6] 中却同时有一个相同的发现:&b&将背景完全抹掉,只保留前景行人的话,Re-ID 的 performance 会略微下降。&/b&[5] 把这个现象归结为 background-bias, 认为是数据集不够好,得尽量避免这样的 [6] 认为造成这种现象的原因是图像的结构信息和光滑性因去掉了背景而遭到了破坏。这两个解释确实非常有道理,而且两者基于各自的解释所做的处理方案都非常出色。然而,我们是否可以作出一个更加直接更加 spontaneous 的假设,认为「背景信息对 Re-ID 是有帮助的」呢?&/p&&p&本文模型的后半部分即基于这个假设,显式地利用了背景信息并将其融入到最终的表示向量中。模型的大致框架如下图所示。一张全景大图经过 detector 检测到行人后,将 bounding box 扩大 &img src=&https://www.zhihu.com/equation?tex=%5Cgamma& alt=&\gamma& eeimg=&1&& 倍以获取更多背景区域,从原图中扣出;用预训练好的 FCIS 模型分割出前景行人;接着将 (仅前景,原图) 这个图像对分别送入基于 ResNet50 的 F-Net 与 O-Net 中,前馈至最后一个卷积层后将 feature maps 按 channel 方向级联;用一个 SEBlock 给所有通道分配不同的权重后,作 global average pooling 并投影至一个 &img src=&https://www.zhihu.com/equation?tex=L_2& alt=&L_2& eeimg=&1&& 标准化的低维空间,得到最终的特征向量。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0e68324fdcad3b45caf2f5d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1984& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1984& data-original=&https://pic3.zhimg.com/v2-0e68324fdcad3b45caf2f5d_r.jpg&&&/figure&&p&先来看一个 ablation study: &/p&&figure&&img src=&https://pic2.zhimg.com/v2-00c9c699f80a92ae80aa2f600c2f2e97_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&300& data-rawheight=&314& class=&content_image& width=&300&&&/figure&&p&表格中将 (原图,仅前景,仅背景,扩张 bounding box) 四个元素进行了各种组合的实验,能够得到以下两个结论:&/p&&ol&&li&在仅保留前景的情况下,mAP 比使用原图低了 2.8 个点,这个发现与前文提到的 [5, 6] 中的发现一致;在仅使用背景的情况下,扩张 RoI 能够将 mAP 提升 4.5 个点。因此我们认为&b&背景是一种有用的指示信息。&/b&&/li&&li&同时考虑「前景+扩张后的背景」或者 「前景+扩张后的原图」能够极大地提升性能(其中后者可以认为是在同时考虑前景和背景的情况下强调了一遍前景)。我们最终的模型基于表中最后一行,将 ground truth boundinhg box 替换成 detector 生成的结果后,在 CUHK-SYSU 上的 mAP 和 top-1 accuracy 分别为 83.0 和 83.7.&/li&&/ol&&p&OK, 那么在已知背景信息有用的情况下,&b&背景信息对模型的影响有多大呢?&/b&为了回答这个问题,我们对 SEBlock 生成的 channel weights 进行了一个统计。SEBlock re-weight 的对象既有来自前景信息的通道,也有来自全图,即前景+背景信息的通道,因此生成的 weights 能够一定程度上反映前景信息和背景信息的相对重要程度。对于第 &img src=&https://www.zhihu.com/equation?tex=i& alt=&i& eeimg=&1&& 个样本,我们分别统计一下三个度量标准:1) 前景通道的权重平均值 &img src=&https://www.zhihu.com/equation?tex=Avg_i%28F%29& alt=&Avg_i(F)& eeimg=&1&&; 2) 背景通道的权重平均值 &img src=&https://www.zhihu.com/equation?tex=Avg_i%28O%29& alt=&Avg_i(O)& eeimg=&1&&; 3) 排名前20的最大的权重值中,对应于前景通道的权重值的个数 &img src=&https://www.zhihu.com/equation?tex=N%5E%7B20%7D%28F%29& alt=&N^{20}(F)& eeimg=&1&&. 其中 &img src=&https://www.zhihu.com/equation?tex=N%5E%7B20%7D%28F%29& alt=&N^{20}(F)& eeimg=&1&& 的直方图如下图所示:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-93fdbc51f5ca8d1e5117_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&400& data-rawheight=&259& class=&content_image& width=&400&&&/figure&&p&基于统计信息我们给出三个观察:&/p&&ol&&li&对于所有的样本 &img src=&https://www.zhihu.com/equation?tex=Avg_i%28F%29+%3E+Avg_i%28O%29& alt=&Avg_i(F) & Avg_i(O)& eeimg=&1&& 均成立,说明在 Re-ID 的表示向量中&b&前景信息比既有前景又有背景的全图信息占有更重要的地位。&/b&&/li&&li&对于多数样本而言,最重要的前20个通道来自于前景信息的居多( &img src=&https://www.zhihu.com/equation?tex=N%5E%7B20%7D%28F%29+%3E+10& alt=&N^{20}(F) & 10& eeimg=&1&& ),结论与上一条相同。&/li&&li&&img src=&https://www.zhihu.com/equation?tex=N%5E%7B20%7D%28F%29+& alt=&N^{20}(F) & eeimg=&1&& 只是略大于 10 而不是极端地偏向 20, 说明最重要的前20个通道中有相当一部分来自全图信息,因此可以认为包含在全图信息中的&b&背景信息的重要性仅略小于前景信息。&/b&&/li&&/ol&&p&OK, 接下来的问题是:&b&引入多少背景信息才合适呢?&/b&上文中我们的模型通过将 bounding box 扩大 &img src=&https://www.zhihu.com/equation?tex=%5Cgamma& alt=&\gamma& eeimg=&1&& 倍来引入更多的背景信息, &img src=&https://www.zhihu.com/equation?tex=%5Cgamma& alt=&\gamma& eeimg=&1&& 的值越大,引入的背景信息越多。其中 &img src=&https://www.zhihu.com/equation?tex=%5Cgamma& alt=&\gamma& eeimg=&1&& 都直接设为了 1.3。 &img src=&https://www.zhihu.com/equation?tex=%5Cgamma& alt=&\gamma& eeimg=&1&& 取不同值时模型的 performance 变化如下图:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ab1cc395c0d3be7a5e1f4b516c71ddc8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1588& data-rawheight=&310& class=&origin_image zh-lightbox-thumb& width=&1588& data-original=&https://pic4.zhimg.com/v2-ab1cc395c0d3be7a5e1f4b516c71ddc8_r.jpg&&&/figure&&p&结论:&b&小背怡情,大背伤身!&/b&&/p&&hr&&p&总结来讲,本文的模型和方法都略显简单粗暴,连 reviewer 给的意见也是 &straightforward&, 倒幸好是 &... appreciate the straightforward...&。Anyway, 希望文中大量的分析能够给同行们提供一些好的参考吧。&/p&&p&&br&&/p&&p&感谢阅读! &/p&&p&&br&&/p&&p&&br&&/p&&p&&i&References:&/i&&/p&&p&[1] Zheng, L., Zhang, H., Sun, S., Chandraker, M., Yang, Y., Tian, Q.: Person re-identification in the wild. In: CVPR. (2017)&/p&&p&[2] Xiao, T., Li, S., Wang, B., Lin, L., Wang, X.: Joint detection and identification feature learning for person search. In: CVPR. (2017)&/p&&p&[3] Xiao, J., Xie, Y., Tillo, T., Huang, K., Wei, Y., Feng, J.: Ian: The individual aggregation network for person search. arXiv preprint arXiv: (2017)&/p&&p&[4] Liu, H., Feng, J., Jie, Z., Jayashree, K., Zhao, B., Qi, M., Jiang, J., Yan, S.: Neural person search machines. In: ICCV. (2017)&/p&&p&[5] Tian, M., Yi, S., Li, H., Li, S., Zhang, X., Shi, J., … Wang, X.: Eliminating Background-Bias for Robust Person Re-Identification. in CVPR. (2018)&/p&&p&[6] Song, C., Huang, Y., Ouyang, W., & Wang, L.: Mask-Guided Contrastive Attention Model for Person Re-Identification. in CVPR. (2018)&/p&
本文主要是介绍我们录用于 ECCV'18 的一个工作:. 这篇文章着眼于 Person Search 这个任务,即同时考虑行人检测(Pedestrian Detection)与行人重识别(Person Re-identification),简单探讨了一下行…
&figure&&img src=&https://pic2.zhimg.com/v2-30c1960dba52ccb8da16dd8_b.jpg& data-rawwidth=&1318& data-rawheight=&658& class=&origin_image zh-lightbox-thumb& width=&1318& data-original=&https://pic2.zhimg.com/v2-30c1960dba52ccb8da16dd8_r.jpg&&&/figure&&p&最近,李飞飞老师得意门生Andrej Karpathy大神在推特上连发几条twitter,细数了六种神经网络研究中的常见错误。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-30c1960dba52ccb8da16dd8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1318& data-rawheight=&658& class=&origin_image zh-lightbox-thumb& width=&1318& data-original=&https://pic2.zhimg.com/v2-30c1960dba52ccb8da16dd8_r.jpg&&&/figure&&p&下面我总结一下我学习过程中遇到下面6条中的4条。&/p&&p&&br&&/p&&p&1、you didn't try to overfit a single batch first&/p&&p&正确解释@张楠 这句话是说在用大数据集训练之前先用小数据集试一下,排除一些明显的错误。&/p&&p&之前的我误解的解释如下:&/p&&p&没有先试过所有训练数据作为一个大batch训练,我们都知道,在训练神经网络的过程中,对于数据会有三个方法处理,一个是min-batch,一个是SGD,一个是Andrej Karpathy提到的所有数据作为一个batch。虽然将所有训练数据作为一个大batch训练能够保证梯度是往正确的方向移动,但是我们绝大部分都是min-batch,然后调节其中的batch-size这个超参数,我个人也没有尝试过将所有训练数据作为一个大batch训练,之后可以试试。(这里额外说一句,batch-size是很重要的超参数,需要仔细调节)&/p&&p&&br&&/p&&p&2、you forgot to toggle train/eval mode for the net&/p&&p&忘了为网络切换训练/评估模式&/p&&p&这个理由主要是针对model 在训练时和评价时不同的 Batch Normalization
Dropout 方法模式。&/p&&p&&br&&/p&&p&3、you forgot to .zero_grad()(in pytorch) before .backward()&br&忘了在.backward()之前.zero_grad()(在pytorch中)&/p&&p&这个错误我真正碰到过,忘记了写.zero_grad()各种nan,导致结果非常差,最后找了一天才找到。大家可以在实在找不到原因的是,打印梯度出来看看,是不是有某些层参数为0,几乎没有学习,有些为nan了,去逐步找原因。&/p&&p&&br&&/p&&p&4、you passed softmaxed ouputs to a loss that expects raw logits&br&将softmaxed输出传递给损失函数,本来期望是logits值,而不是过了softmax之后的值。&/p&&p&大白话讲就是给函数传进去的参数错啦!!我们在编写代码的时候很容易犯这种错误,因为最后run起来的时候,它不报错啊,哥,不报错,只是结果很差,这很难受啊,我们很难发现错误,第一感觉,我去,idea不work,所以大家效果不好的时候,不要放弃啊,仔细看看有没有常见的bug!!&/p&&p&&br&&/p&&p&5、使用BatchNorm时,您没有对线性/ 二维卷积层使用bias = False,或者反过来忘记将其包含在输出层中。 这个倒不会让你失败,但它们是虚假的参数&/p&&p&答案来自&a class=&member_mention& href=&https://www.zhihu.com/people/6a30aedbb9855bdfa80b865& data-hash=&6a30aedbb9855bdfa80b865& data-hovercard=&p$b$6a30aedbb9855bdfa80b865&&@陈明jian&/a& 如果卷积层后面跟着BatchNormalization的话,卷积层就不需要偏置参数b,只需要w参数。&/p&&p&6、以为view()和permute()是一样的事情(不正确地使用view)&/p&&p&答案来自&a class=&member_mention& href=&https://www.zhihu.com/people/177b4d3c75fdbd7c6c87d& data-hash=&177b4d3c75fdbd7c6c87d& data-hovercard=&p$b$177b4d3c75fdbd7c6c87d&&@深度学习修汽车&/a& 举例说明:比如要将一个(2, 12)的tensor改为(4, 2, 3)的tensor。这样就不能直接用view而需要多次用permute()来交换axis(转置2D的matrix)来达到目的。&br&&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&tc&/span&&span class=&o&&.&/span&&span class=&n&&manual_seed&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&tc&/span&&span class=&o&&.&/span&&span class=&n&&randn&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&12&/span&&span class=&p&&)&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&x&/span&&span class=&o&&.&/span&&span class=&n&&permute&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&y&/span&&span class=&p&&)&/span&
&span class=&n&&z&/span& &span class=&o&&=&/span& &span class=&n&&y&/span&&span class=&o&&.&/span&&span class=&n&&view&/span&&span class=&p&&(&/span&&span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&)&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&z&/span&&span class=&p&&)&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&z&/span&&span class=&o&&.&/span&&span class=&n&&permute&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&大家可以踊跃讨论。&/p&
最近,李飞飞老师得意门生Andrej Karpathy大神在推特上连发几条twitter,细数了六种神经网络研究中的常见错误。下面我总结一下我学习过程中遇到下面6条中的4条。 1、you didn't try to overfit a single batch first正确解释@张楠 这句话是说在用大数据集训…
&p&&b&1.请简要介绍下tensorflow的计算图。&/b&&/p&&p&解析:&/p&&p&Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个节点都是计算图上的一个Tensor, 也就是张量,而节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。&/p&&p&如下两图表示:&/p&&p& a=x*y; b=a+z; c=tf.reduce_sum(b);
&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-27d22b480a9a786d6b0e6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&226& data-rawheight=&421& class=&content_image& width=&226&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-03f42bf99be1a6a64e04eeb6e3c64f96_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&252& data-rawheight=&448& data-thumbnail=&https://pic1.zhimg.com/v2-03f42bf99be1a6a64e04eeb6e3c64f96_b.jpg& class=&content_image& width=&252&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&2.你有哪些deep learning(rnn、cnn)调参的经验?&/b&&/p&&p&解析:&/p&&p&&br&&/p&&p&&b&一、参数初始化&/b&&/p&&p&下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。&/p&&p&下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5&/p&&p&Xavier初始法论文:&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&jmlr.org/proceedings/pa&/span&&span class=&invisible&&pers/v9/glorot10a/glorot10a.pdf&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&He初始化论文:&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&arxiv.org/abs/&/span&&span class=&invisible&&2&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&uniform均匀分布初始化:&/p&&p&w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])&/p&&p&Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)&/p&&p&He初始化,适用于ReLU:scale = np.sqrt(6/n)&/p&&p&normal高斯分布初始化:w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0&/p&&p&Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)&/p&&p&He初始化,适用于ReLU:stdev = np.sqrt(2/n)&/p&&p&svd初始化:对RNN有比较好的效果。&/p&&p&&br&&/p&&p&&b&二、数据预处理方式&/b&&/p&&p&zero-center ,这个挺常用的.X -= np.mean(X, axis = 0) # zero-centerX /= np.std(X, axis = 0) # normalize&/p&&p&PCA whitening,这个用的比较少.&/p&&p&&br&&/p&&p&&b&三、训练技巧&/b&&/p&&p&要做梯度归一化,即算出来的梯度除以minibatch size&/p&&p&clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15&/p&&p&&br&&/p&&p&dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入-&RNN与RNN-&输出的位置.关于RNN如何用dropout,可以参考这篇论文:&a href=&https://link.zhihu.com/?target=http%3A//arxiv.org/abs/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&arxiv.org/abs/&/span&&span class=&invisible&&&/span&&/a&&/p&&p&&br&&/p&&p&adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。&/p&&p&&br&&/p&&p&除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。&/p&&p&rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好。&/p&&p&word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果。&/p&&p&&br&&/p&&p&&b&四、尽量对数据做shuffle&/b&&/p&&p&LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:&a href=&https://link.zhihu.com/?target=http%3A//jmlr.org/proceedings/papers/v37/jozefowicz15.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&jmlr.org/proceedings/pa&/span&&span class=&invisible&&pers/v37/jozefowicz15.pdf&/span&&span class=&ellipsis&&&/span&&/a&, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.&/p&&p&Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift&/p&&p&如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: &a href=&https://link.zhihu.com/?target=http%3A//arxiv.org/abs/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&arxiv.org/abs/&/span&&span class=&invisible&&7&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。&/p&&p&&br&&/p&&p&&b&五、Ensemble&/b&&/p&&p&Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式&/p&&p&同样的参数,不同的初始化方式&/p&&p&不同的参数,通过cross-validation,选取最好的几组&/p&&p&同样的参数,模型训练的不同阶段,即不同迭代次数的模型。&/p&&p&不同的模型,进行线性融合. 例如RNN和传统模型。&/p&&p&&br&&/p&&p&&b&3.CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?&/b&&/p&&p&解析:&/p&&p&Deep Learning -Yann LeCun, Yoshua Bengio & Geoffrey Hinton&/p&&p&Learn TensorFlow and deep learning, without a Ph.D.&/p&&p&The Unreasonable Effectiveness of Deep Learning -LeCun 16 NIPS Keynote&/p&&p&&br&&/p&&p&以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b75fbc39e38e31bada22515f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&385& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-b75fbc39e38e31bada22515f_r.jpg&&&/figure&&p&&br&&/p&&p&CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。&/p&&p&局部连接使网络可以提取数据的局部特征;权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6e6b11537dbbd62dfed2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&137& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-6e6b11537dbbd62dfed2_r.jpg&&&/figure&&p&&br&&/p&&p&上图中,如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。&/p&&p&&br&&/p&&p&&b&4.LSTM结构推导,为什么比RNN好?&/b&&br&&/p&&p&解析:&/p&&p&推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。&/p&&p&&br&&/p&&p&&b&5.Sigmoid、Tanh、ReLu这三个激活函数有什么缺点或不足,有没改进的激活函数。&/b&&/p&&p&解析:&/p&&p&sigmoid、Tanh、ReLU的缺点在121问题中已有说明,为了解决ReLU的dead cell的情况,发明了Leaky Relu, 即在输入小于0时不让输出为0,而是乘以一个较小的系数,从而保证有导数存在。同样的目的,还有一个ELU,函数示意图如下。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-47ac30b8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&670& data-rawheight=&492& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&https://pic4.zhimg.com/v2-47ac30b8_r.jpg&&&/figure&&p&&br&&/p&&p&还有一个激活函数是Maxout,即使用两套w,b参数,输出较大值。本质上Maxout可以看做Relu的泛化版本,因为如果一套w,b全都是0的话,那么就是普通的ReLU。Maxout可以克服Relu的缺点,但是参数数目翻倍。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cc1c2e7805_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&861& data-rawheight=&1035& class=&origin_image zh-lightbox-thumb& width=&861& data-original=&https://pic1.zhimg.com/v2-cc1c2e7805_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&资料来源:&/b&&br&&/p&&p&1.寒小阳&AntZ,张雨石博客等;&/p&&p&2.萧瑟,&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&zhihu.com/question/4163&/span&&span class=&invisible&&1631/answer/&/span&&span class=&ellipsis&&&/span&&/a&;&/p&&p&3.许韩,&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&zhuanlan.zhihu.com/p/25&/span&&span class=&invisible&&005808&/span&&span class=&ellipsis&&&/span&&/a&;&/p&&p&4.《 CNN笔记:通俗理解卷积神经网络》,&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/v_july_v/article/details/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/v_july_v/&/span&&span class=&invisible&&article/details/&/span&&span class=&ellipsis&&&/span&&/a&;&/p&&p&5.我愛大泡泡,&/p&&p&htp://&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/woaidapaopao/article/details/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/woaidapao&/span&&span class=&invisible&&pao/article/details/&/span&&span class=&ellipsis&&&/span&&/a&。&/p&
1.请简要介绍下tensorflow的计算图。解析:Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个节点都是计算图上的一个Tensor, 也就是张量,而节点之间的边描述了计算之间的依…
&figure&&img src=&https://pic4.zhimg.com/v2-1e7d5c113f9057155ddba7_b.jpg& data-rawwidth=&900& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic4.zhimg.com/v2-1e7d5c113f9057155ddba7_r.jpg&&&/figure&&p&本文主要是介绍自己做的一个工作:&a href=&http://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SphereReID: Deep Hypersphere Manifold Embedding for Person Re-Identication&/a& ,用了Softmax的变种,在行人重识别上取得了非常好的效果,并且端到端训练,网络结构简单。在Market-1501数据集上达到94.4%的准确率(并且不需要re-ranking和fine-tuning)。&/p&&p&另外,也介绍了一种新的学习率调整策略,可以有效地提升网络训练效果,同时并不局限于行人重识别任务,自己用在关键点检测上也取得了不错的效果,仅仅通过改变学习率测率就可以涨两个点的样子。&/p&&p&在过去一年中,人脸识别领域取得了非常多的进展,识别率到了一个非常高的水平,一个很重要的原因,是大家重新审视了Softmax Cross-entropy这个古典的损失函数,来了一场损失函数的文艺复兴,提出了各种各样的变种,并且效果取得了巨大的提升。这股风主要在人脸领域刮,而我是做行人重识别的,自然也会想到在行人上面也深挖一下Softmax,于是就有了这篇文章。就我所知,这是第一个利用Softmax变种将行人特征映射到一个超球面上进行重识别的工作。&/p&&h2&人脸中的Softmax变种&/h2&&h2&传统的Softmax Loss&/h2&&p&传统的Softmax Loss被广泛用于分类问题,可以很好地区别不同类的样本,是最基本的最常用的损失函数之一。其公式如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ff3a8122a54_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&533& data-rawheight=&131& class=&origin_image zh-lightbox-thumb& width=&533& data-original=&https://pic1.zhimg.com/v2-ff3a8122a54_r.jpg&&&/figure&&p&&br&&/p&&p&其中x是网络最后一层(不包括分类层)输出的特征,经过一个全连接的分类层,即乘以权重W并加上偏置b,输出score,然后经过一个Softmax函数再算交叉熵。&/p&&p&Softmax可以有效区分类间差异,但是对于类内的分布没有很好的约束,因此监督效果不够。&/p&&h2&Large-Margin Softmax&/h2&&p&论文:W. Liu, Y. Wen, Z. Yu, and M. Yang, “Large-Margin Softmax Loss for Convolutional Neural Networks,” in ICML, 2016.&/p&&p&最后分类层的每个神经元乘以权重的过程,可以分解为如下形式: &/p&&figure&&img src=&https://pic4.zhimg.com/v2-36ce98dc2025b91aebdd84d306c7e933_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&704& data-rawheight=&118& class=&origin_image zh-lightbox-thumb& width=&704& data-original=&https://pic4.zhimg.com/v2-36ce98dc2025b91aebdd84d306c7e933_r.jpg&&&/figure&&p&&br&&/p&&p&即神经元的权重向量的模和特征向量的模相乘,再乘以两个向量夹角的余弦值,这是简单的向量点积的基本定义公式。 对上面的右边的公式进行重解释,解释为特征向量到神经元向量的点积,到哪个特征向量点积大最后就划分到哪个类别。&/p&&p&原始的余弦值不加额外约束,即只要到正确类别的点积更大即可正确划分。这篇文章作者认为不仅要分对,还要有Margin,更好地分开来,所以替换掉里面的余弦值,用一个新的变换来替代:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-27a775b044_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&746& data-rawheight=&287& class=&origin_image zh-lightbox-thumb& width=&746& data-original=&https://pic1.zhimg.com/v2-27a775b044_r.jpg&&&/figure&&p&&br&&/p&&p&可以用m来控制Margin的大小,当m等于2的时候,和原始的余弦值函数比,人为地}

我要回帖

更多关于 unit1inclass 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信