事实/仿真陈述;数据/数据驱动?当媒体变戏法却忘了戳破科学泡沫时
Photo by Diana Orey on Unsplash
我不知道你是否注意到了,但是最近伦敦到处都张贴着“安东尼·诺兰治愈血癌”的海报。
乍一看,你可能会认为这是另一项科学突破。然而,如果你仔细阅读,你会发现一个较小的印刷字体,上面写着“每天,我们将干细胞捐赠者与急需救命移植的血癌和血液疾病患者相匹配”。
如果你有额外的时间在谷歌上快速搜索一下,你会发现安东尼·诺兰是一个慈善组织,为需要骨髓移植的病人和可能的捐赠者牵线搭桥。
我对这个组织没有任何不满。事实上,我认为他们在提高公众意识方面做得很好。随着骨髓治疗变得更加普遍,迫切需要更大的供体库,以便找到更接近的供体-患者匹配。对黑人、亚洲人、少数民族(BAME)和混血儿的捐献者也有强烈的吸引力,因为目前他们的代表性严重不足,这反过来影响了来自这些背景的患者的存活率。
然而,这些重要的信息都没有通过这些标志传达出来。因此,我不满意的是,该组织设计海报的方式。
具体来说,你说的“治愈血癌”是什么意思?
如果个人不小心,他们可能会带着已经有治疗血癌的药物的知识离开,并且只要他们接近“安东尼·诺兰”,患病的人就会康复。
老实说,真的是这样吗?
首先,我们需要知道没有“血癌”这种东西,因为正确的说法应该是“血液、骨髓或淋巴系统的癌症”。其中,病情可以进一步细分为白血病、骨髓瘤和淋巴瘤,每种都有自己的变异形式,可以是急性或慢性的。
从“抗抑郁药”、“基因”到“科学方法”,某些医学、科学和技术术语经常被媒体和大众以一种极其松散的方式使用。尽管这些外行术语旨在弥合新手和专家之间的差距,但它们从未有助于构建我们的知识。
接下来,骨髓或干细胞移植只是治疗方案之一。其他包括化疗和放疗,根据患者的健康状况、年龄和严重程度,可以选择任何一种。
最后,骨髓捐献是无痛的,因为捐献者将在大约一小时的过程中处于全身麻醉状态。此外,捐赠者也可以选择通过外周血干细胞方法进行非手术捐赠。在这里,将对捐赠者进行连续四天的注射,然后要求他们耐心等待五到七个小时的捐赠程序,在此过程中,他们的血液被抽取,通过一台分离和收集干细胞的机器,然后返回体内。
我不确定公众是否会费心去发现这些“安东尼·诺兰治愈血癌”海报背后的真正含义,但我确信这不是科学第一次被媒体歪曲。
《苍蝇》,一部 20 世纪 80 年代的电影,由杰夫·高布伦主演,他发明了一种传送装置,但这种装置对生物不起作用。在他心烦意乱和喝醉时对机器进行的一次实验中,戈德布卢姆完全与一只家蝇融为一体,导致他逐渐转变为一种半家蝇半人的生物。
这部电影在特殊的化妆、效果和现实方面做得很好,我们不应该在不清醒的时候做任何实验。除此之外,这部电影的核心思想根本就是荒谬的。
完全融合意味着家蝇现在是人类的一部分,反之亦然。家蝇的平均体重约为 0.0003 公斤,一个成年人的平均体重为 80 公斤。一只家蝇大约有 2000 万个细胞,一个人大约有 10 万亿到 100 万亿个细胞。家蝇的基因组(即生物体内的遗传信息)拷贝数约为 4000 万,而人类至少有 12 万亿。
总之,这意味着人类太大而不能与家蝇完全结合,因为没有足够的家蝇基因组与人类共享(在这种情况下,只有大约 300,000 个人类细胞中的 1 个会接受家蝇基因组)。
蜘蛛侠有着相似的情节,除了蜘蛛现在是人类的一部分。电影中最令人质疑的一句台词是“…转移 RNA 来编码整个新的基因组,将所有三种蜘蛛的遗传信息结合到这 15 种遗传设计的超级蜘蛛中…”
因为你可能想通过重读两遍来理解这句话的意思,所以请注意没有必要这样做,因为这句话是无意义的。
人类体内的遗传物质是 DNA(脱氧核糖核酸),而不是 RNA(核糖核酸)。虽然“转移 RNA”是一种现有的方法,但它并不用于在两个不同物种之间转移遗传物质。我相信生成这条线的人混淆了 DNA 和 RNA 的作用,把“转移 RNA”错当成了“RNA 的转移”。
有人可能会说,科幻小说不必如此认真,但这并不能证明向观众提供不正确信息的行为也是正当的。
接下来,媒体似乎不能让自己正确,即使他们不处理电影。看看面筋是如何被妖魔化的,而超级食品却被美化了。
许多人选择了无麸质饮食,却不知道麸质是什么。面筋在拉丁语中的意思是“胶”,是一种储存在普通谷类植物如小麦和大麦种子中的蛋白质。这种蛋白质为植物生长提供能量,但也导致了它们的粘性。这就是为什么我们的面包和比萨饼面团不会轻易从我们手中脱落,并且有足够的弹性可以塑造成不同的形状。
妖魔化麸质的历史可以追溯到畅销书,如“小麦肚”系列或“谷物大脑”,以及倡导无麸质饮食的名人(如格温妮丝·帕特洛、史蒂夫·纳什和麦莉·塞勒斯)。由于可能的权威/名人效应,麸质现在被认为是导致肥胖、糖尿病和疲劳的罪魁祸首。
与此同时,还有超级食物。超级食物是巴西莓、巴西莓、藜麦、花椰菜、菠菜、鲑鱼、杏仁等的总称。据信它们含有更高含量的抗氧化剂和更丰富的营养。定期食用超级食物被认为可以减缓身体组织的磨损,保护我们免受癌症和其他疾病的侵害。
然而,没有一个科学家完全确定去除或添加某些食物对健康的确切益处,因为仍然需要考虑个人的身体吸收和适应性。因此,仍然大力提倡均衡饮食和经常锻炼。
排除麸质和偏爱超级食物都是虚假的、不可靠的信息的例子,这些信息在重复足够多次后会变成事实。就像我们牙齿上的牙结石一样,虚假的事实是日积月累的,很难清除,其后果往往是不利的,但不容易观察到。
如果苍蝇、蜘蛛侠、无麸质饮食和超级食物是媒体不承认其低科学素养的老掉牙的例子,也许数据会更时尚。
有些人可能会认为媒体对数据的使用以及将调查、数据和新闻都放在一个屋檐下的需要是当前的话题。然而,事实并非完全如此,因为它的历史可以追溯到几十年前,当时菲利普·迈耶率先在报道中采用社会科学研究方法,当时被称为“精确新闻”。
像所有其他科学一样,大多数社会科学研究从假设(A)开始,之后,研究人员将不得不从相关样本中收集信息,以接受或拒绝这些假设(B)。
同样,Meyer 的第一份报纸报道涉及为学校建筑购买火灾和风暴保险的超支,这发生在保险代理人根据赔偿金额获得佣金份额的计划下。这意味着保险费用越高,代理人赚的钱就越多。
于是,迈耶做了三个简单的假设(A ),然后去寻找支持或不支持它们的证据(B)。
詹姆斯·斯蒂尔和唐纳德·巴莱特在 20 世纪 70 年代通过使用计算机分析将这种方法提高到了一个新的水平。他们的普利策奖获奖作品旨在发现费城法院是否行使真正的正义(A)。带着这个问题,两人费力地选择了 1034 个涉及暴力的案例,并科学地比较了它们与使用 IBM 电脑的关系(B)。
这两起事件显示了科学和新闻之间的巨大合作,不幸的是,精确新闻或现在被称为数据新闻的东西,习惯性地与数据驱动的新闻相混淆。
“数据驱动新闻”这个术语可能是在 2000 年代末发明的,它颠覆了精确新闻的顺序。现在,记者们不再从 A 地走到 B 地,而是使用编程语言或数据库管理系统从公开的在线资源中搜索所谓的“数据”(B),在得出结论(A)之前,对它们进行清理。
数据驱动新闻作为一种新闻采集工具并没有错,但通常情况下,数据新闻和数据驱动新闻是以这样一种可互换的方式使用的,记者们并不确切知道他们喜欢使用或正在使用哪种技术。
此外,大多数记者不知道数据通常以四种不同的方式衡量。
-
名义上的,作为标签的数据,很少带有数字属性,如姓名、性别、种族和身体特征。
-
序数,无法量化孰优孰劣的数据。比如一个调查中给出的“很开心,很开心,中性,不开心,很不开心”的想法。除非我们接着问其他问题,但只看这个问题本身,我们无法推断出选择“快乐”的人比选择“中立”或“不快乐”的人快乐多少,反之亦然。
-
区间,这些数据让我们既知道顺序又知道每个类别之间的数量差异。比如温度。我知道 30 摄氏度比 10 摄氏度要热 20 摄氏度,因为这 20 摄氏度的差异不仅使我能够根据它们的温暖程度来排列这两个温度,而且还能从数量上解释它们的差异。
-
比率,类似于区间,只是比率刻度的基数为零。像身高和体重一样,它们都有确定的零,因为没有负的身高和体重(而温度可以降到零度以下,因此它是一个区间,而不是比例)。
某些数据比其他数据更容易受到其他数据的影响。与测量 2)一样,很可能一个人在进行调查时会选择“非常不开心”,这不是因为他/她真的不开心,而是因为他/她在调查前遇到了不愉快的事情,这反过来影响了他/她的情绪。
这些嘈杂的数据被称为混杂因素,是科学家在分析过程中必须控制的因素。尽管如此,从测量 3)和 4)中得到的数据是相对理想的,因为可以应用更强大的分析技术来确定它们的真实值,并且使我们能够跟踪可能的异常。
此外,大多数记者没有意识到只玩一个数据池的危险。例如,如果我是一个健康作家,对写伦敦的药物或合法药物使用感兴趣。
使用 A-B 方法(即精确新闻),我可能会以这样一个推测开始— “人们死于过量非处方药比药物滥用更普遍”。
从这里,我将从药剂师的处方、公众通常购买的药物种类以及客户档案中收集数据,并与从警方或医院收集的数据进行比较,以说明死于用药过量或药物滥用的人数、这些受害者的病史以及哪种药物/人最易受影响等。
与 B-A 方法(即数据驱动的新闻)相比,我使用 A-B 方法检查和交叉引用各种数据来源的倾向可能更高,我可能会废弃英国的处方数据库,对我能找到的任何东西进行排名或列表,希望能找到一个有趣的模式。
尽管记者们处理的数据库的数量不会影响一个故事最终变得多么激动人心或有新闻价值,但预防可能发生的【Sokal 事件】 仍然是值得的。
索卡尔事件之所以成功,是因为《社会文本》在审查艾伦·索卡尔的手稿时,没有从其他来源或专家那里寻求证实。随着越来越多的人冒险进入数据使用领域,我们不能否认出现另一个艾伦·索卡尔(Alan Sokal)或不可靠的告密者的可能性,他们玷污了让我们更接近真相的可能性。
通常,媒体用他们自己对科学的定义制造泡沫,而不给公众足够的机会或信心去打破它们,导致我们都生活在看似真实但本质上错误的茧中。那么,在对科学的理解和展示中,我们到底做错了什么?
首先,我们大多数人不区分相关性和因果关系。相关性意味着两个或更多的事情可能是相关的,但我们不确定是否一个因素预测另一个因素,或者是否有其他潜在的方面促成了相关性。
另一方面,因果关系更直接,它意味着某件事是另一件事的结果。尽管假设存在可能的相关性或因果关系,但仍然需要确保这种关系是显著的,而不是偶然的混杂结果。
接下来,我们需要知道,在对科学的理解上,没有所谓的“正确”。大多数科学实验追逐黑天鹅;一只黑天鹅的存在颠覆了天鹅池全是白色的整个观念。所以,没有错的不代表就是正确的;它仅仅意味着它不能被反对。
第三,永远质疑,永远不要一概而论。大多数实验都是以受控的方式进行的,在某些情况下,使用动物样本。因此,我们决不能把这些实验的结果应用到生活在自然环境中的人或动物身上。同样,当一组数据整齐地呈现在你眼前时,不要高兴得太早,很可能它并不能公平地代表总体。
有趣的是,媒体对政治家如此挑剔,而对研究人员或科学家却不是这样。和记者一样,科学家也面临着时间的压力。科学家需要尽快发表新的发现,以击败同行,获得下一笔资助。对以前做过的事情的确认很少被重视,因为没有人喜欢同样的事情被说两次。因此,就p-hacking而言,科学家也会犯错。
回到“安东尼·诺兰治愈血癌”的海报,如果广告的内容是“你不知道什么是骨髓捐赠”,“你害怕骨髓捐赠”,或“你从未接受过骨髓捐赠”等,可能会更合适。媒体需要利用公众的好奇心,而不是他们的感受。
如果科学让我们偏离神话,数据和研究方法是我们的工具,媒体应该大声告诉我们这一点。
FADL2 L8:“神经”艺术风格转移
最近完成了杰瑞米·霍华德的实用深度学习的第八课(beta 版第二部分)。在这里,我将回顾一下重建本课 Jupyter 笔记本的一些工作和结果。< 这是 非常 粗糙 >
[ 注意:think part 2 已更名为“前沿深度学习”——应该很快就会公开发布。 亦作TL;dr: 滚动到底部观看视频
我对笔记本的解读可以跟着这里:https://github . com/WNoxchi/kauka SOS/blob/master/fai 02/L8 _ NeuralArtTrsfr _ code along . ipynb
在回顾了库导入和指定limit_mem()
以便 TensorFlow 不会吃掉你的 GPU 所提供的一切之后,我必须学习 Python 中的‘picking’是什么。结果,多亏了 YouTube 上的 sentdex,这只是 Python 中的序列化。什么连载?显然,它是一个接一个地发送数据流…显然,当你进行大量的磁盘访问时,它是有用的(比如为 ML 读取数据),尽管它不提供安全性,所以要小心网络流。
我试着写了一本小型拉丁语字典:
Learning to Pickle in Python (data serialization)
原来如此。我还没有看过 sentdex 更新的“酸洗和缩放——用 Python p.6 进行实用机器学习”视频,但如果我觉得有必要,我可能会看。
1。内容重建
神经风格转移
NST 正在创建一个新的图像,它保留了一个图像的“风格”和另一个图像的形式。例如,使用两幅输入图片创建一幅文森特·梵高风格的猫的图片:一幅猫的图片,另一幅代表梵高的绘画风格。
这里有几件事很重要。该算法并没有将梵高的风格应用到猫图像本身:它从一幅新图像(像一堆随机的像素)开始,并将其构建成所需的复合图像。
它需要一个已经足够好的模型来辨别两个输入图像的特征。所以,“眼睛在哪里”,“这是一张脸”,“这笔触是一个东西”等等。
第一步是初始化模型(这里是使用平均池并减去 FC 层的顶部块的修改的 VGG16 CNN):
instantiating a VGG16 model using Average-Pooling instead of Max, and excluding the end-block of Fully-Connected layers (we want convolutional features, not classification here)
接下来,我们在 Keras 中定义一个计算图。一个计算图,就我目前的理解,是定义一系列对数据替身的操作。还没有数据传入,但一旦传入,程序就会知道该怎么做。我们这样做是为了定义目标图像
targ
isn’t any ‘thing’ yet, but more of an operational placeholder for when this bit of computation occurs.
可以看到,targ
是img_arr
上layer_model
的输出(预测)。layer_model
是一个Model
(keras.models.Model
:Keras Functional API),由从其输入到layer
的model
层组成,我们将其定义为 VGG16 模型的第五个 Conv 块的第一个卷积层。img_arr
是经过预处理的原始图像,其预处理方式与 VGG 作者在训练其模型时预处理其 ImageNet 数据的方式相同。
注意 : layer
是卷积子模型结束时的输出激活。layer_model
是从原模型开始到layer
定义的子模型。targ
是目标激活。损失函数试图使layer
和targ
尽可能靠近。
这种措辞可能会令人困惑,但是当你在代码中浏览它时,它更有意义。我们在整个笔记本中使用 Keras 定义了几个这样的图形。
为了让算法衡量它做得有多好,它需要以某种方式量化它的进展:一个损失/目标函数。
为此,我们将损失定义为输出层和目标图像之间的均方误差。
evaluator
是一个自定义的Evaluator
类,允许程序单独访问损失函数和梯度,因为 Keras 一起返回它们,但优化器需要单独查看它们。
这个evaluator
,连同迭代次数,以及随机图像x
,进入solve_image(•)
,完成优化损失的工作。
所有这些都是通过将原始图像的 conv 特征应用于随机生成的图像并更新损失函数来从原始图像中重建图像。
基本思想是:我们通过子模型运行原始图像和新的随机图像,并使用我们的损失函数来确定它们的匹配程度。我们使用来自scipy.optimize.fmin_l_bgfs_b
的线搜索算法作为优化器来最小化损失。当我们下一步从一个样式图像中合并样式时,我们将使用权重来平衡我们想要在多大程度上重新创建原始图像,而不是应用样式图像的样式。
loss
is the sum of style_loss
-es for all layers & targets. style_loss
is the mean-squared-error between the gramian matrix of the layer, and the gramian matrix of the target. The Gram Matrix is the dot-product of a matrix with its own transpose. ~ I think I remember in lecture, Howard saying no one really knows why it works … but it works.
所以我们最终得到的,用我的猫 Terek 作为原始图像:
Terek.
以及生成随机像素的图像:
并通过solve_image(•)
进行 10 次迭代:
我们得到了这个不虔诚的怪物:
How cats actually see
Here’s an animation of it (the videos in this post were all first taken on Instagram as I was coding)
尽管这看起来很糟糕,但实际上非常有趣。请记住,这种算法是采用马赛克或随机像素,通过我们上面定义的 CNN 来重建猫的图片,并根据新(目标)图像和网络中原始激活之间的均方误差来优化网络的权重和激活。这意味着将根据卷积网络中表达的特征来构建目标图像。所以这个模型必须能够区分眼睛和背景等等。较低的卷积块将为我们提供更精细的特征,而稍后的卷积块将为我们提供模型中更多的宏特征。因此,我们可以通过使用更早的卷积层来获得看起来更像原始图像的输出。
2。风格重构
为了重塑风格,我们必须做更多的事情。我们通过计算多层的损失函数来改变它。引用原始笔记本:
在我们计算原始卷积输出的 MSE 之前,我们先将它们转换为信道的“格拉米矩阵”(即矩阵与其转置矩阵的乘积),然后再计算它们的 MSE。目前还不清楚为什么这有助于我们实现目标,但它确实有效。一种想法是 Gramian 显示了我们在卷积层的特征是如何相互关联的,并且完全删除了所有的位置信息。所以匹配通道的 Gram 矩阵只能匹配某种类型的纹理信息,而不能匹配位置信息。
style_arr is the preprocessed style image. shp is the shape of style_arr. Note the major difference from before being that we’re building arrays from layers. Specifically 3 layers: for the 3 color-channels.
loss
is the sum of style_loss
-es for all layers & targets. style_loss
is the mean-squared-error between the gramian matrix of the layer, and the gramian matrix of the target. The Gram Matrix is the dot-product of a matrix with its own transpose. ~ I think I remember in lecture, Howard saying no one really knows why it works … but it works.
这样做,我们就可以了解梵高这幅画的风格:
并将该样式应用于这个随机生成的目标图像:
要在 10 次迭代后获得梵高风格的随机像素图像:
3。风格转移
最后是风格转移。我们得到了 1。投入再创造。2.风格休闲。现在把它放在一起:
这是以(最终)直观的方式完成的:通过加权和添加两个损失函数来组合这两种方法。和以前一样,我们获取一系列层输出来计算风格损失。计算内容损失只需要一个图层输出。层越低:内容重建越精确。当我们将内容重建与样式合并时:更早的层/更松散的重建将为样式留出更多空间,反之亦然。
这里我们有代码使style_layers
成为块 1 到 5 的第二卷积层;以及content_layer
块 4 conv 层 2 的输出(激活):
The style and content models become submodels of the full model’s input to the respective style and content outputs. NOTE: the style target outputs/activations correspond to their multiple layers. The style targets ultimate take in the style array (preprocessed style image) and likewise content target takes in the preprocessed source image (src).
这创建了三个独立的输出类型:原始图像,风格图像,以及我们正在训练的像素的随机图像。
最后,创建一个应用于样式输出激活的权重数组。这调整了图像重建和风格转换这两个层面的组合。注意:这是内容丢失的一个因素。系数越小(分母越大),样式对最终图像的影响就越大,直到它完全掩盖了任何原始内容。
必须在全风格和全商务之间找到最佳平衡点。
This does the thing
以下是一些结果:
我偶然得到了一幅电源插头的印象派画作:
卷积神经网络需要固定的输入大小,因此内容、风格和输出图像必须具有相同的维度。因此,当我对我的猫的图片进行适当的裁剪时,我忘记了调整它,得到了左上角,和我用来设计风格的一幅小鸟画的尺寸一样。
Artistic inspiration brought to you by Snapchat…
最后,确保我做的事情是正确的:看看我是否能在相同的输入图像上得到与杰瑞米·霍华德相同的结果:
肯定有些不同,当然也有相似之处,我喜欢这是第一次运行。我肯定对做好风格转移感到兴奋,就像你将在这里找到的一样:https://github.com/titu1994/Neural-Style-Transfer
足够幸运的是,看起来像“蒙版”等技术将在第 9 课中涉及,所以我甚至不需要额外学习。
所以,最后一点:这不是一个从头学习的帖子。为此:你必须浏览课文和原始笔记本。但是如果你正在做这个并且想要一些额外的想法,那么希望这是有帮助的。
我喜欢人工智能的另一点是它提供了粗略但精确的文件夹名称:
非常感谢杰瑞米·霍华德和瑞秋·托马斯将 fast.ai 组装在一起
发射失败:IT,我们有一个(自助服务)问题!
虽然现代自助服务正在为消费者服务,但 IT 自助服务门户却停滞不前。然而,IT 向客户提供世界范围的服务是一项非常重要的任务,不能放弃。相反,我们必须对我们的现状进行诚实的评估,并规划一条新的前进道路。
在我与 IT 领导者的交谈中,我经常听到一些轶事,如“亚马逊、优步和 AirBnB 等公司对自助服务设定了不切实际的期望”或“人们就是不喜欢自助服务”。虽然这种说法可能会起到暂时缓解的作用,但它们正在让 IT 接受平庸。事实上,人们越来越多地接受(如果不是期望的话)利用自助服务来处理我们个人生活中的大量日常任务,例如安排约会、购物和在线支付账单,而无需与客户服务代表直接联系。
IT 自助服务的采用停滞不前并不是因为缺乏需求。事实上,根据 Forrester Research 的调查,72%的客户更喜欢通过自助服务来解决他们的支持问题,而不是打电话或发电子邮件。同样,越来越多的员工希望在工作中获得与消费者相同的便捷和简单的服务体验。
自 It 服务目录在 ITIL 第 3 版中首次推出以来,已经过去了多年,但大多数 IT 组织仍在努力有效地管理 IT 自助服务的实施、推广和利用。平心而论,现代消费者自助服务产品在“诞生于云中”以及能够利用社交和大数据进步方面肯定具有优势。然而,IT 自助服务门户必须应对问题和认知,这些问题和认知通常是遗留工具和不太完善的流程的产物。
例如,IT 自助服务主要关注 IT 的优势,而不是客户体验。许多首席信息官从 IT 效率和员工数量的角度来看待自助服务,服务台经理寻求减少呼叫量的灵丹妙药,IT 分析师则想象空票队列。自助服务最重要的地方——用户体验——就是今天所提供的服务被打破的地方。用户发现当前的门户令人沮丧、复杂且效率低下。
大多数 IT 自助服务门户都是使用静态服务目录构建的,这些目录要求用户手动搜索详尽的技术列表,以找到他们需要的资源。一旦用户选择了一个项目,他们通常会获得一个表单链接,或者需要致电服务台提交请求。客户需要的是一个可操作的服务门户,它提供符合其工作职能、位置和角色的 IT 服务产品的个性化视图,并以有限的摩擦快速交付请求的服务。
缺乏个性化和自动化,加上服务门户的复杂性,让用户感到沮丧,并最终迫使他们回到传统的支持渠道,如语音和电子邮件。以用户为中心设计门户体验是推动自助服务采用的必要条件。这需要超越实现一个闪亮的 UI。IT 必须确定将激励员工利用自助服务的业务目标,然后将这些目标与服务门户中可用的适当 IT 资源相关联。
随着业务增长对创新技术的依赖,将业务用户与即时 IT 服务结合起来将需要一种迭代方法,包括持续的客户输入。但是,它还可以访问服务目录、CMDBs 以及财务和人力资源系统等中的大量用户相关数据。有效地聚合和呈现这些有价值的信息需要 IT 部门重新思考服务的交付方式,并使用数据来持续监控和提高自助服务的可用性。向前向上!
公平的警告:女人、财产和预算的孤岛
你好!如果上周的简讯严重缺乏和低能量(悲伤),那么本周的又回到了正轨!
如果你没见过猫敲钟觅食,你可能应该去看看。
在国内
我真的很喜欢《卫报》的这篇文章——投票支持英国退出欧盟的英国地区的情况会更糟。我真正喜欢的是以如此简单的方式显示数据的图形。这些地图清晰易懂,并能产生立竿见影的效果。
伦敦的豪宅业主似乎无法转移他们的房产(有人感到惊讶吗),所以他们转向 AirBnB 。
英国大部分地区(57.9%)没有本地报纸——这是来自这张本地新闻地图的令人震惊的统计数据,它显示了(或缺乏!)当地新闻来源。安德鲁·布莱特韦尔
在池塘那边
美国人对唐纳德·特朗普的看法简史。
CNN 制作了一张今年在美国成为目标的清真寺的地图。
很好的互动展示了蒙特利尔的建筑有多古老。
NPR 的《一张图中的美国工作日》很不错,尽管我不知道四处点击看看不同的行业有多吸引人。他们自己对数据进行了一些探索,这很好,因为我不确定我是否会寻找午餐时间的差异,或者将建筑工人与厨师进行比较。
《华盛顿邮报》查看了过去 40 年的预算,以比较不断变化的国家优先事项。同样在川普的预算上,美联社创造了一个尺度来平衡预算的削减和增加。只有五家机构将获得更多资金;其他一切都被削减了。
这是一张美国每平方英尺房产价格的地图(H/TCharles Arthur)——在 3D 环境下使用有点奇怪,但你可以通过拖动和使用鼠标滚轮放大和缩小来操纵它。
在别处
《卫报》的全球发展网络关注了千年发展目标的成功程度。2100 万额外的生命被挽救,4.71 亿人摆脱了贫困,但这是一幅复杂的画面。
根据饥荒预警系统网络,今年将有 7000 万人需要粮食援助。《经济学人》研究了非洲和也门即将发生的饥荒是如何有政治原因的。
《印度斯坦时报》选择了一种非常有趣的方式来形象化政治中的性别差距——去掉所有没有女性候选人的地理区域,剩下的就是女性孤岛。
零碎东西
这是查尔斯·密纳德的一个很棒的简介,他以拿破仑三月的形象化而闻名(这很特别)——但是他实际上做的远不止这些!同样值得一读的是——寻找画有密纳德画作的艺术品。
交互式图形的问题是没有人真正使用它们。这引发了我长久以来的思考,也是一个棘手的问题——你如何在图形设计和交互性方面拓展边界,同时确保用户从中获得最大收益?关键是个性化。
Steve Wexler 写了他如何在看到一个很棒的图表示例后,学会了喜欢 Marimekko 图表并理解它的用例。我不得不同意艾玛·威特版本的图表确实让任何其他的想象都相形见绌。
本周最差图表
啊,不:
这星期就这些了!感谢阅读。如果你喜欢这篇时事通讯,把它转发给别人,鼓励你的朋友注册,或者请我喝杯咖啡以示感谢。评论?回复这封邮件。如果你认为我们可以一起工作——让我们聊聊吧!在 Twitter 上找到我@ soviewernes。
假新闻和数据科学家的责任
Photo by Bank Phrom on Unsplash
95%的统计数据都是编造的。
关于事实与真相的讨论最近出现了很多,特别是随着“假新闻”的泛滥和新闻媒体对某些事实(以及非事实)的报道。我们听到到处都是人们提起热点问题并声称*“90%的人同意我的事实!”和“我有证据证明 X 发生了——这是事实!”像 snopes.com、politifact.com 和 factcheck.org 这样的网站的存在是为了消除这些“事实”中的政治偏见和解释,但是我们为什么需要这样的东西呢?是因为记者主动编造信息,故意骗观众吗?或者,他们只是简单地调整了一些确凿的事实,使之符合他们偏好的叙述?*
Credit: National Review
在上图中,国家评论(通过 Twitter)显示,从 1880 年到大约 2015 年,全球平均气温几乎没有变化。这里要问的重要问题是:
- y 轴是怎么回事?为什么有这么大的空间?
- 如果我们垂直放大会看到什么?在这(极其)广阔的数据视野中,是否隐藏着某些趋势或周期?
- 全球年平均气温的显著变化是什么?50 度?. 5 度?
Credit: NASA
美国宇航局公布了相同的数据,但垂直轴更紧。当我们放大时,很明显,自 20 世纪初以来,全球平均气温一直呈上升趋势。此图中要问的重要问题是:
- 1900 年之前发生了什么?毕竟,地球已经存在了一段时间。我们有可能在寻找另一个局部最大值吗?我们应该期待这种循环自然逆转吗?
- 同样,随着时间的推移,什么会被认为是平均温度的显著上升或下降?
亲爱的读者,我知道你在想什么,我保证不会把一些伪装成假新闻的情绪化/错误的政治宣言扔给你,但重要的是要注意,在更广泛的背景下,你从新闻评论员那里听到的东西并不总是事实,同时也不一定是彻头彻尾的谎言。
它们是事实——或者换句话说,它们是通过报道者的视角呈现给消费者的事实。诚然,在政治背景下,这经常被用来满足党派议程或引导消费者相信一个人而不是另一个人,但这不是我真正想讨论的。
事实与真相,在上下文中
我们在党派新闻报道中看到的同样的偏见无处不在——存在于我们依赖某人(或某事)来吸收事实并代表他人解释它们的所有地方。
对于我们关于数据科学的讨论,请允许我将事实和真相分别归结为数据和数据的表示。更深一层来看,数据只是。。。嗯,数据。列和行的原始信息通常完全不受解释偏差的影响(尽管对于任何实验,数据科学家都应该意识到人类天生倾向于通过糟糕的实验设计来偏差数据,但我们现在不去管研究偏差)。
另一方面,真相是从数据的解释中得出的结果。正如生活中人们需要提取原始数据的其他地方一样,作为消费者,我们看到的是对原始事实的有偏见的表示,强调对解释者产生最大影响的东西。换句话说,真相有可能有多种有效版本,所有版本都基于同一组事实。
对此的第一反应是思考“为什么我们不跳过中间人,向消费者提供原始的、不带偏见的事实,而不是一些扭曲的事实?”这是一个公平的观点,但通常消费者要么不知道如何解析原始信息,要么根本不在乎;这非常耗时,需要大量的主题知识和专业技能,并且在现代应用程序的环境中,会严重破坏愉快的用户体验。想象一下,你不得不查询网飞的数据库来决定接下来该看哪部蒸汽吸血鬼动作惊悚僵尸恐怖喜剧(不,谢谢)。
因此,如果向消费者提供原始事实是无效的,并且提供一个更简单、更精炼的事实会受到解释偏差的影响,那么我们还有什么选择呢?这就是数据科学专家的道德和义务所在。
数据科学家的责任
在让数据自己说话和提供平台(肥皂盒?)数据的最重要特征对消费者来说是最明显的。在实践中,构成“重要功能”的标准是高度个案化的,基于用户是谁,用户需要完成什么,以及知道用户能够影响什么过程(参见:用户体验研究)。
更简洁地说:通过数据科学家吸引用户的信息传递来实现对事实的最佳呈现,同时非常小心地确保所呈现的数据不会。
以下是实现这一点的几种方法:
- 了解你的用户:了解他们的需求、技术能力、可用性/交互/体验偏好,以及最终什么样的信息将帮助他们做出最佳决策。数据科学家通常会忽略这一步,直接进入数据,但请记住,回到基础,问一些“愚蠢”的问题,并确保不做不切实际的假设总是没问题的。这很重要。
- 保持透明:教育是数据科学家最大的盟友!商业用户变得越来越复杂,通常不再认同“神奇的黑匣子”的概念:他们想知道引擎盖下是什么,是什么在驱动引擎。以我的经验来看,它有助于指导用户(在高层次上)完成你所进行的不同类型的实验,为什么某些模型比其他模型更好,并突出你在数据中发现的有趣信息——它让他们继续投入到探索过程中,并让他们对最终产品有更大的欣赏力。
- 注意而不是提供领先内容(未经消费者同意):提供行动号召是没问题的(事实上,这通常是首先进行数据科学的原因),但重要的是要知道,无论你的分析产生什么样的行动号召,都不是在“欺骗”用户。例如,显示一个带有暗红色指示器的图表可能会让消费者认为他们正在查看的数据是负面的或不受欢迎的;再加上不相称的坐标轴(正如我们从《国家评论》中得到的数据),你就得到一份相当误导性的分析报告(这个词我在本文中用得很不严谨)。如果你不确定你的可视化、统计等等的含义,那么和你公司的 UX 专家一起工作;根据我的经验,他们在数据科学中的角色被严重低估了。
假新闻分类器(使用 LSTMs)
本课是 DeepSchool.io 提供的课程的一部分,我们使用深度学习(递归神经网络)将一组文章分为‘假’和‘真’新闻类。
参见下面的视频或在https://github.com/sachinruk/deepschool.io(第 18 课)获得的代码,了解所用模型的解释。
我们拥有的数据集是一组围绕 2016 年美国大选期间撰写的新闻文章。在第二个模型中,我们利用预先训练好的手套向量来进行迁移学习。如果不使用这些方法,就存在过度拟合的实际风险,如第一个被训练的模型所示。
真的是在学习什么是假新闻吗?不会。如果一个好记者写的内容和假新闻一样,他很可能会把假新闻归类为真新闻。请记住,模型不知道世界的实际状态。事实上,“特朗普总统是有史以来最伟大的总统。”根据我的模型(wtf),有 73%的概率是一篇真实的新闻文章。
这可能是学习功能,如希拉里被提到了多少次,或者 CNN(电视网络,而不是神经网络类型)被提到了太多。也许网络会询问作者是否来自“信息战争”(由极右翼疯子/精神病患者/讨厌同性恋青蛙的人经营)。
请看这里关于如何在 scikit learn 中使用 TfIDf 解决相同问题集的博文。它实际上在 93%的准确率上做得更好(RNN 模型大约是 87%的准确率)。虽然 scikit learn 确实比深度学习表现得更好,但重要的是要理解,你必须在“正常”的机器学习方面进行特征工程。
外卖食品
总之,深度学习是避开机器学习的特征工程方面的一个很好的方法。与单词袋方法相比,我们可以通过使用 RNN 来保持句子结构。手套向量的使用是减少我们必须训练的参数数量的重要一步,因此减少了过度拟合的风险。
如果你喜欢我的教程/博客帖子,可以考虑在https://www.patreon.com/deepschoolio支持我,或者订阅我的 YouTube 频道https://www.youtube.com/user/sachinabey(或者两者都支持!).哦还有拍手!😃
生成假卫星图像—训练 GAN
学习 39 种不同的技巧,让 GAN 走向成功
除了在 Coursera 上学习吴恩达的 ML 课程之外,我以前从未做过神经网络。发誓!那真是一门课程!转行。不是吗?
通常,每当我感到技术转向的威胁时,我就会提出一些结合了许多未知因素的宠物项目。它帮助我探索空间并获得一些舒适的感觉。正是在这条线上,我开始了我的宠物项目,训练一个甘生成航空卫星图像。所有涉及的技术—神经网络、CNN、GAN、Tensorflow、Python 等。对我来说都有些陌生。所以,从我的角度来看,这是一个有价值的项目。
第一步是获得一些低分辨率的卫星图像。我在网上找到的图片都很大。23000x12000 左右的样子。每当我打开 PIL 的 Python 图像处理库来调整它们的大小时,它都会崩溃。无论如何,将如此高分辨率的图像调整到 64x64 会破坏所有的细节。这似乎不是一个好主意。那时我发现了“通用地图下载器”软件,它可以从你选择的地理区域下载 256x256 的图像。免费版本只下载了 50 厘米低分辨率的卫星图像,这对于我的实验目的来说是可以的。
Courtesy: Screenshot of the Universal maps downloaded taken by me
这是一个干净的软件,做它承诺要做的事情。下面是软件下载的一些真实图片。对于寻找真实卫星图像的从业者来说,“亚马逊地球”是一个非常有前途的资源。我相信它是从美国政府的地球资源卫星项目获得图像的。
Map images downloaded by Universal maps downloader — Screenshot taken by me
我兼职工作了 5 个月,让这个项目运行。如果我有一些先验知识,并且全职使用 GPU 的话,花费的时间会少得多。我从头开始开发所有代码*,没有重用任何存储库中的任何代码(除了来自 OpenAI 的 RelU 函数)。所以这给了我一个犯很多错误的机会,我把这些都记录在这里供你参考。希望这有所帮助。*
本文档分为以下几个部分
- 如何不训练一个甘
- 云 GPU 提供商之间的快速比较:Crestle 与 FloydHub
- 生成的图像
- 图灵检定
- 图灵测试答案
如何不训练一个甘
我将这一部分组织成 4 个部分,每个部分讨论潜在的“错误”
- 一般准则
—未遵循标准架构
—低估计算需求
—未对 GPU 进行培训
—未使用内存中的图像进行云 GPU 培训
—未维护观察日志
—未初始播种 RNG
—混合单色/彩色图像,输入不佳
—未标准化输入
—未进行中间模型检查点
—未转储生成的图像以检查学习情况 - TensorFlow 相关指南
—不使用图像格式
—缺少来自 API 的隐式规范化
—使用 TF 读取/写入图像
—创建孤立张量
—在同一个调用中同时运行 opt 和 loss - 神经网络相关指南
—未保持生成器/Discr 对称
—未对最终生成器使用 TANH
—未对偏差使用零初始化器
—未使用 Xavier Init
—未使用正确数量的滤波器组
—未使用步进卷积代替汇集
—未使用泄漏 Relu
—未使用批处理归一化来加速计算
—未使用正则化器
—未选择正确的正则化器常数
—在批处理中进行归一化 - 培训相关指南
—将所有 CPU 内核专用于培训
—不将输入图像转换为-1 和+1
—运行较少的迭代
—非常高的学习率
—重用 Adam 优化器对象
—不使用历史图像进行培训
—为历史目的生成单独的图像
—不执行历史图像转换
—将生成器置于鉴别器之上
—强大的 Discr/强大的 Gen
—具有批处理规范的 Net arch
—取消
通用指南
错误 1
不遵循标准网络架构
DCGAN 是一个很好的架构,它们适用于 64x64 图像。Github 中有一些例子——open ai 和 Carpedm20 的 DCGAN Tensorflow 实现。
不要尝试任何新颖的架构。只要实现基本的 DCGAN 正常工作。这本身会帮助你正确理解许多基础知识。
在没有完全实现 DCGAN 架构的情况下,我开始对网络进行随机更改。我有更少的层,每层有不同数量的滤波器组,等等。我想很快看到我得到的输出…但你在 GAN 中很快得到的只是 BS。你不会希望这样的。
错误 2
低估计算需求
深度学习需要大量的计算。不要低估这一点。
如果你的笔记本电脑/台式机有发热问题,我不建议运行深度学习。你会把它融化的。不要把发热的笔记本电脑放在床上或易燃的地方。Table mate 是远程连接笔记本电脑的好选择。它由纤维制成,不会受热。
对于计算,如果你有机会的话,GPU 无疑是最好的选择。
如果你受到笔记本电脑/台式机 CPU 或类似设备的限制,从一个适中的目标开始(比如说较低的图像分辨率),一旦你清楚如何解决这个问题,就选择基于云的 GPU。
我从 256x256 的图像生成开始,并不知道我在做什么。在我的笔记本电脑上训练它需要一年的时间。糟糕的选择。
错误 3
不在 GPU 上训练
如果你不在 GPU 上训练你的 GAN,你可能哪里也去不了。初始形状的出现需要将近 1000 次迭代。
20000 次迭代的训练很常见。
如果你在 CPU 上运行,这些训练可以一起运行几天,在你决定取消一个模式崩溃(或)一个不稳定的训练路径之前,需要几个小时。
超参数调谐也非常困难。它会耗掉你所有的时间。不值得。
错误 4
在云上使用 GPU 驱动的笔记本电脑进行培训时,不在内存中保存图像
像 FloydHub / Crestle 这样的云 GPU Jupyter 笔记本提供商往往有一个缓慢的 IO 子系统。他们可能使用亚马逊 S3 或某种 Blob 存储或一个新颖的文件系统来存储你的文件。这意味着,每次迭代从这些存储器中读取图像会非常慢。
如果没有足够的内存,在处理当前批处理时,使用异步 IO 读取下一个批处理。将 GPU 计算与 IO 重叠也是一个好主意!
错误 5
没有维护观察日志
保持一个观察日志,记录你所做的所有改变,你所看到的效果等等。这确实有助于避免一次又一次地犯同样的错误。
你也可以把“待定清单”放在另一张纸上,这样你就不会错过你的想法。
错误 6
未初始播种的 RNG
在开始时用一个常数作为 RNG 的种子是很重要的,这样你就可以理解你的超参数变化实际上是如何影响学习的。
tf.set_random_seed(1234) *#Lets inspire some Determinism*
通过将连续运行的中间输出与配置变化进行比较,您可以看到学习是进行得更快了(还是变慢了(还是退化了)等等。
不确定 RNG,你不能对你的超参数变化做出任何推断。观察日志将不会有用。
错误 7
在输入图像中混合单色和彩色图像(或)输入图像中的不良特征
保持输入的一致性和丰富的特性
有时,我们可能会在输入中混合单色和彩色图像。由于单色只有一个通道,而彩色图像有三个通道,混合它们会在处理时导致错误。有时,当你创建一个有几千幅图像的数据集时,你的处理会在某一批中失败,你需要一段时间来解决这个问题。这是真的,尤其是如果你没有在初始化期间一次读取所有的图像。
错误 8
未标准化输入
标准化输入将避免大的 logit 值,这反过来会破坏梯度和学习过程。这是我学到的第一件事。如果您使用的图像值在 0 到 255 之间,请在 0 到 1 之间转换它们。
如果你想一想神经网络是如何工作的,图像值乘以权重,相加,并用于 sigmoid/Relu 激活。当结果值很大时,曲线在这些区域或多或少是平坦的,因此梯度很小,并且它不会推进学习。梯度是学问。如果没有梯度,那么就没有学习。
错误 9
不检查模型,仅在所有迭代完成后保存
任何可能出错的事情都会出错——墨菲定律。
为了确保故障恢复,总是每 500 次迭代左右检查一次模型。很容易从离开的地方恢复。Tensorflow 支持此操作的简单 API。模型保存会导致创建共享相同模型名称前缀的多个文件。您可以简单地单独使用 model-name 前缀来加载和保存模型。
确保在获得最终输出后,手动清除所有检查点。GAN 型号会留下巨大的磁盘空间。
saver = tf.train.Saver()
savePath = saver.save(session,
outputFolder + "/" + thisRunTime + "." + str(step))....SavedModelCheckpoint = "/home/nbuser/output/1510295650.2870145.4000"
restorer = tf.train.Saver()
restorer.restore(session, SavedModelCheckpoint)
错误 10
不转储生成的图像以检查学习情况
这相当简单明了。每 10 次迭代,总是转储一个随机生成的图像。你会知道训练的方向。
注意:生成的图像是一个“噪声”向量的函数。根据“噪声”矢量的不同,生成的图像可能看起来很好(也可能很差)。所以,如果你看到生成器有时生成愚蠢的图像,并不意味着它已经退化了。只是随机噪声向量可能是一个不太可能的向量。不要试图过多解读被甩的形象。
TensorFlow 相关指南
错误 11
在 TensorFlow 中没有使用正确的图像格式
大多数与 NN 相关的图像操作,如 tf.nn.conv2d 、 tf.nn.conv2d_transpose 接受 4 维张量。4D 通常用于 RGB 图像阵列。
Tensorflow APIs 支持两种图像格式——NHWC 和 NCHW。
NHWC 布局——【批次、高度、宽度、通道】
NCHW 布局——【批次、通道、高度、宽度】
根据您阅读输入文件的方式选择相关的选项。默认值是 NHWC,应该没问题。但是如果您的图像不同,请确保在 API 调用中指定了格式。
错误 12
缺少 API 完成的“隐式”规范化
Tensorflow 提供了TF . image . convert _ image _ dtypeAPI,当您将“数据类型”从“uint8”转换为“float”时, 会自动在 0 和 1 之间缩放图像。0–255 Int image 映射到 0–1 float image,反之亦然。如果你再把图像除以 255。,那你就要承受一些无声的痛苦了。
这是我在文档中没有正确阅读的内容。转储正在传送到网络的图像。这将给出一个好主意,如果事情按你认为的方式运行。
错误 13
使用 Tensorflow APIs 读取/写入图像
是的。不要用 TF 看图像。在 Tensorflow 中将图像读取为 Numpy 数组并不简单。至少,不像我希望的那样简单。一些文档谈到队列管理器(为了什么?和做其他体操——对于做一件简单的事情来说,这太复杂了。在这方面,我可以理解“张量流很烂”的家伙。
使用“matplotlib”将文件读取为 Numpy 数组。这是一个干净的选择。参见下面的代码片段,这是一个很好的例子。
**import** **matplotlib.pyplot** **as** **plt**
**import** **matplotlib.image****def** listFolder(folder) :
f = []
**for** (dirpath, dirnames, filenames) **in** walk(folder):
jpgfiles = list(filter(**lambda** x : x.split(".")[-1] == "jpg" **or** x.split(".")[-1] == "jpeg", filenames))
f.extend(jpgfiles)
**return** f**class** **originalDistribution** :
**def** __init__(self, imageInputFolder):
self.srcFolder = imageInputFolder
self.listOfFiles = listFolder(self.srcFolder)
np.random.shuffle(self.listOfFiles) *#Inplace shuffling*
**if** floydRun **or** crestleRun:
self.imagesInMemory = np.asarray(list(map(**lambda** x : matplotlib.image.imread(self.srcFolder+"/"+x), self.listOfFiles)))/255.
**else**:
self.imagesInMemory = np.asarray(list(map(**lambda** x : matplotlib.image.imread(self.srcFolder+"**\\**"+x), self.listOfFiles)))/255.*And so on.......*
使用 matplotlib API 保存生成的图像,该图像是一个 numpy 数组
**import** **matplotlib.pyplot** **as** **plt**
**import** **matplotlib.image**plt.imsave(tempImages + "**\\**GEN_STEP_" + '**{:05d}**'.format(step) + ".png", genMap[0], format='png', vmin=-1, vmax=1)
使用 Tensorflow 占位符将读取的图像提供给 TF 图
inputTensorPlaceholder = tf.placeholder(tf.float32, shape=(nSamples, inputheight, inputwidth, inputchannels)) ....._ = session.run([d_opt_1], feed_dict={
inputTensorPlaceholder: inputNumPy,
realBenchmarksPlaceholder:benchmarkones
})
错误 14
创建孤立张量。
这将导致你的程序内存泄漏,从而导致“应用程序失败”和一些“窗口冲击”。嘿!为什么 windows 不能直接运行它?Linux 将震撼它。不是吗?没有。孤儿张量吸内存!
下面是孤立张量的一个例子。我使用下面的函数为每次迭代从文件系统中读取“小批量”。从磁盘读取本身是一个坏主意,我们稍后会看到。但重要的一点是,这些张量只是呆在外面,没有被清理,等待会话结束。这将逐渐耗尽您的系统内存,尤其是当您运行 1000 次迭代时。这会毁了你的周末跑步。
#
# DON'T USE THIS FUNCTION
# MEMORY LEAK AHEAD
# YOU HAVE BEEN WARNED!!
#**def** makeImageTensor(filename):
fileTensor = tf.read_file(tf.convert_to_tensor(filename))
intImage = tf.image.decode_jpeg(fileTensor, channels=inputchannels)
floatImage = tf.image.convert_image_dtype(intImage, tf.float32)
**return** floatImage .............#
# Repeatedly calling the code below will cause memory leak
#*inputImageTensorList = [makeImageTensor(x) for x in imageFiles]*
*inputImagesTensor = tf.stack(inputImageTensorList)*
*inputNumPy = inputImagesTensor.eval()
session.run([some list],
feed_dict={inputImageTensor: inputNumPy and so on...})*
错误 15
在一次运行中同时运行优化器和损耗
下面的代码是不确定的,因为 TensorFlow 没有指定其操作的执行顺序。因此,无法确定“d_opt_1”是在“d_real_loss”之前还是之后运行。那么,上报的“d_real_loss”是优化前的还是优化后的呢?
#
# This code below is NOT deterministic
#_, l, dregloss, dt1 = session.run([d_opt_1, d_real_loss, d_reg_loss, DiscriminatorGraph],
feed_dict={
inputTensorPlaceholder: inputNumPy,
realBenchmarksPlaceholder:benchmarkones,
})
运行优化器后,始终在单独的 session.run()调用中运行“loss”。这样,你就可以确定,打印出来的损耗是经过优化的
神经网络相关指南
错误 16
未保持发电机和鉴别器对称
DCGAN 论文没有全面讨论鉴频器架构(或者)可能只是一个参考。选择对称的架构。如果在生成器中有 7 层,确保在鉴别器中有相同的层。
这也可能与鉴别器和发生器的等功率配置有关。
错误 17
最终发电机输出不使用 TANH】
TANH 激活返回-1 到+1。这是 DCGAN 中建议的,在 OpenAI 代码中也可以看到。不知道为什么。用一样的,开心就好。
错误 18
用非常数、非零初始值设定项初始化偏差
所有的偏差变量必须用一个“常数”初始化器初始化,初始值为“0”。
这将允许算法学习它自己的偏差。在没有任何显著原因的情况下,最初保持较大的偏差会使训练过程极其缓慢,因为偏差会对成本产生如此大的影响,以至于其他变量将不会正确地看到它们的效果(以及梯度)。
gb1 = tf.get_variable("gb1", shape=[SecondChannels], dtype=tf.float32, initializer=tf.constant_initializer(0.0),
regularizer = g_reg)
错误 19
不使用类似 Xavier / Glorot-Bengio 初始化的细微初始化
批处理规范化确实可以弥补糟糕的初始化的影响。但是一个好的初始化,像 Xavier init 总是受欢迎的举措。所以,不要忽视。
Xavier init 的简单直观的解释可以在 Andy Jones 的博客中找到。
g_dc1_fanin = 5*5*FirstChannelsg_dc1_fanout = 5*5*ThirdChannelsg_dc1_scale = np.sqrt(6./(g_dc1_fanin + g_dc1_fanout))dc1filter = tf.get_variable("dc1filter", shape=[5,5,SecondChannels, FirstChannels], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-g_dc1_scale,maxval=g_dc1_scale), regularizer = g_reg)
错误 20
未使用足够数量的滤波器组
DCGAN 从 4×4 分辨率开始,发生器中有 1024 个滤波器组,逐渐减少滤波器组的数量,同时提高分辨率。
在鉴频器端,由于对称性,也需要类似数量的滤波器组。
我认为滤波器组的数量与所用滤波器的尺寸成正比。这在鉴别器上下文(或)图像分类上下文中是真实的。如果您为 5x5 选择 1024 个存储体,那么您将不得不为 11x11 滤波器选择 4096 个存储体。11x11 可以捕获比 5x5 更多的模式,因此我们需要更多数量的滤波器组来捕获所有变化。这是我的想法。
错误 21
不使用交错卷积,而是使用合并层
DCGAN 论文明显不鼓励使用池层,而是提出使用“步长卷积和“分数步长转置卷积分别用于下采样和上采样。
错误 22
鉴别器中未使用泄漏 Relu
泄漏的 RelU 导致一个强大的鉴别器。不要在鉴别器中错过这个。
根据 DCGAN 论文,这在发电机中是不需要的。但是我的观察日志显示 LRelu 在生成器中确实产生了非常好的结果。但是,由于某种原因,最后成功运行的人从来没有使用它。所以,也可以用发电机来测试泄漏的 Relu!
错误 23
不使用批量标准化来加速计算
DCGAN 建议对生成器和鉴别器都进行批处理规范化。
批处理规范化有助于克服错误的初始化,并可以加速训练过程。
从学习模型生成图像时使用相同的批量很重要(训练后阶段)。如果您使用不同的批量大小,批量统计将会不同,学习的批量标准相关参数将而不是适用
(或)您必须在训练时保存批量统计数据,并对这些统计数据进行加权平均,在生成非标准批量图像时使用这些参数进行批量标准化。
(或)使用 OpenAI 引入的虚拟批处理规范化,而规范化总是针对外部预配置的批处理
错误 24
不使用正则化子
Tensorflow 不强制设置正则项。这取决于你去找一个正则化。
当您运行数千次迭代时,不执行正则化会破坏训练过程的稳定性。
出于某种原因,我找不到关于如何在 TensorFlow 中应用正则化的像样的文档。所以,我只是参考资料来理解它是如何做到的。下面我也总结了一下。
#
# Declare a Regularizer.
# d_reg is a function which can be called with weights.
# It returns a Graph that computes L2 regularization.
# Choose the Constant wisely according to the number of parameters
# to be optimized.
#d_reg = **tf.contrib.layers.l2_regularizer**(scale=DREG_SCALE, scope="REG-DISCR")#
# Pass the declared regularizer when creating Variables.
# Depending on which scope the variables are created, Regularizer
# will also be associated with the same call
#c1filterVar = tf.get_variable("c1Filter", shape=[5,5,inputchannels,c1Banks], dtype=tf.float32, initializer=tf.random_uniform_initializer(minval=-c1scale, maxval=c1scale), **regularizer=d_reg**)#
# get_reg_loss: Uses TF API to get all regularization related
# losses corresponding to the "scope" and then add them up using
# tf.add_n() API
# NOTE: The "add_n" is what ties all the loose L2 regularizer graphs
# together into 1 meaningful
#**def** get_reg_loss(regscope):
**return tf.add_n**(**tf.losses.get_regularization_losses**(scope=regscope))#
# Call the get_reg_loss() with the scope of the variables
# that you want to regularize.
# d_reg_loss = get_reg_loss(regscope="DISCR")#
# Add the loss to the regular loss
#
d_loss = d_real_loss + d_fake_loss + d_reg_loss
错误 25
没有选择好的正则化常数
使用正则化时,始终打印最终损失分解。这将告诉我们正则化损失占总损失的比例。如果正则化损失在训练开始时很大,您可能需要减少常数
以下是我的配置
Number of Generator Parameters = 19,154,627
Number of Discriminator Parameters = 19,616,609
Discriminator Regularizer Scaling Constant = 0.0001
Generator Regularizer Scaling Constant = 0.0001
错误 26
在生成器的最后一层/鉴别器的第一层进行批量归一化
对发生器末端的单个双曲正切单元的输入进行批量归一化将确保输入到双曲正切单元的输入具有 0 的平均值和有限的方差。这一点也不理想,因为我们希望激活在-1 和+1 之间展开。所以,不要批量归一化生成器中的最后一层。
dc5relu = tf.nn.relu(batchNormalize(tf.nn.bias_add(dc5, gb5), "BN_DC5Filter"))#Contrast the above with the belowdc6relu = tf.nn.tanh(tf.nn.bias_add(dc6, gb6))
这同样适用于第一层鉴别器。这将确保生成的图像中的差异传播到下游的所有层。
错误 27
没有做足够的工作来减轻棋盘效应
在生成器管道的末端,TANH 层之前,运行几个卷积转置层,步长为 1x1,分辨率不变,以消除 2x2 和其他步长卷积引入的棋盘效应。我多跑了一层。但是如果你有很好计算能力,你可以多运行几次。确保在鉴别器层中反射相同的光线以保持对称性。我记得在 OpenAI 代码中看到过这个。
培训相关指南
错误 28
将所有 CPU 内核专用于训练
如果你使用 CPU 进行训练,不要为训练分配所有的核心。张量流可以配置。请参见下面的片段。
#
# My laptop has 4 cores. The code below provides the context for the # main training loop.
# Leaving 1 core free for OS and other apps.
# This will ensure machine is interactive despite GAN training
#**with** tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=2, inter_op_parallelism_threads=1)) **as** session:
错误 29
不将输入图像变换到-1 到+1 范围
认识到生成的图像来自-1 和+1 是很重要的。输入图像归一化后通常从 0 到 1。你还需要 1 级转换才能将它移动到-1 到+1。见下文。
inputImagesTensor = (inputTensorPlaceholder * 2.) - 1.
错误 30
运行较少的迭代次数
看看别人都发表了什么。20,000 次迭代是常见的。即使在你的笔记本电脑上运行了 12 个小时,你也不会在 500 或 700 次迭代中得到任何东西。
学习任何有意义的东西都需要大量的迭代。
错误 31
使用非常高的学习率
非常高的学习率会破坏训练过程的稳定性。
即使您使用了批量标准化和良好的初始化,使用像 0.001 这样的学习率也会使整个训练过程不稳定,这取决于您的批量大小。
可以注意到,较高的“批量”通常可以支持较高的训练速率。后来,我发现这一点在“高效背景”文件中也有讨论。
如果您使用 512 作为您的批量大小,0.001 可以是一个很好的学习率。如果你的批量大小是 64,坚持使用 0.0002 (DCGAN 推荐)
Image Resolution = 64 x 64
Mini Batch size = 64
Generator Learning Rate = 0.0002
Discriminator Learning Rate = 0.00015
错误 32
重用 Adam 优化器对象
Adam 优化器是一种状态优化器,与梯度下降优化器相比,建议用于 GAN 训练。但是,重用 Adam Optimizer 对象可能会导致无意义的行为,因为它具有有状态的性质。
Adam optimizer 将梯度计算为过去梯度的指数衰减加权平均值。这个想法是为了加速学习最小值,更快地穿越平坦区域等等。
为每个损失最小化使用单独的 Adam 优化器对象。例如,在我使用的方案中,我使用了 4 个优化器对象。一个用于 D_REAL_LOSS,另一个用于 D_FAKE_LOSS,另一个用于 D_REAL_LOSS + D_FAKE_LOSS,另一个用于 GEN_LOSS。
错误 33
不使用历史图像训练鉴别器
这是我从 Soumith Chintala 的 GAN 提示和技巧博客中学到的。也是 AIDL·脸书集团的史蒂夫·梅西纳建议的。
偶尔向鉴别器提供历史图像有助于打破鉴别器和生成器之间的重复循环,并稳定整个训练过程。
这个在学习过程中绝对有价值。我在主训练循环中花了 30%的时间进行这种训练。只有在包括这一步之后,学习的最初症状才开始出现。
错误 34
生成用于历史目的的单独图像
确保保存用于历史记录的图像在您已经生成的批次中重复使用。
如果您正在为历史目的生成一个单独的图像,那么它将不会像预期的那样工作,因为批处理规范化是有效的。因此,谨慎的做法是从生成的批处理中选择一个图像并使用它。
错误 35
将生成图像的历史记录输入鉴别器时不转换图像
训练过程有时会从缓存生成的历史图像中向鉴别器馈送样本(并非总是如此,因为这是有条件运行的)。当我们这样做时,我们需要注意“图形”路径 可能 期望一个从 0 到 1 值的图像。这个看你的训练逻辑了。因此,如果您的逻辑需要,在将生成的图像存储到历史缓存之前,将其转换为 0 到 1 之间的值。
hc = np.random.randint(0, nSamples) *#history candidate*
candidateForHistory = genMap[hc]
candidateForHistory = candidateForHistory + 1.
candidateForHistory = candidateForHistory / 2.
GCache.addImage(candidateForHistory, step)
错误 36
优先考虑发生器而不是鉴别器
最初,人们更多地关注优化生成器,而不是鉴别器。这是错误的,因为鉴别器是 GAN 中最重要的部分。鉴别器带路,通过提供健康的梯度来教导生成器。
在 GAN 训练结束时,鉴别器滤波器组也可以用于对象检测和开发有效的分类器。由于他已经被大量的虚假图像轰炸,他也不太容易受到对抗性攻击,我想是这样的。
错误 37
强力鉴别器/强力发生器
可以通过增加更多层或增加滤波器组的数量来增加鉴频器的功率。这可能导致模式崩溃,因为鉴别器可能会快速通过并将发电机推到非常糟糕的区域(梯度差),发电机无法从这些区域出来。
同样强大的发电机将没有鉴别器来引导他。歧视者,谁必须领导的方式和教学,现在被制服。这个配置也不好。
稳定的 GAN 训练的理想设置是鉴别器和发生器功能相同,并反复相互学习。
Losses seen in a Successful GAN training. Gen is trained Twice
在上面的图中,我们可以看到发电机总是被训练两次。鉴别器有时分别针对纯 1 损耗和纯 0 损耗进行优化,有时针对 1 和 0 的总损耗进行优化。这个想法是根据损失的进展在两者之间交替,并在训练中保持平衡。更多关于“自由训练”下的精确策略
错误 38
使用批量标准化时选择了错误的张量图架构
Image courtesy: Self made PPT
如果我们在鉴别器中使用批量规范化,上面的架构将会爆炸。为什么?
考虑送入鉴别器的 3 个批次。3 个批次的“批量”和“统计”不同。同意吗?它们的μ适马将影响鉴别器网络内部执行的批量归一化。每批将被不同地标准化。
因此,您会看到,所报告的 D_LOSS 并不表明“Discriminator”能够很好地阻挡 0。所以,你会预计 G_LOSS 是巨大的。但是…然后你会看到 G_LOSS 报告也少了。这是因为批次统计的差异。
与包含“0”和“1”图像的批次相比,完全相同的“0”图像在单独馈送到鉴别器时具有不同的批次统计。这个架构将 而不是 设置鉴频器和发生器之间的战斗。训练将会退化,什么也学不到。啊!
Image courtesy: Self made PPT
上述架构不易受批量定额相关问题的影响,因为批量统计数据不会改变。看一看!
错误 39
自由训练
Goodfellow 博士在 GAN 的原始论文中描述的训练过程谈到在每一步中训练鉴别器“k”次,而在每一步中只训练发生器一次。这是为了确保鉴别器在学习曲线中领先。然而,这种技术依赖于鉴别器和发生器的相对强度。此外,随着训练的进行,鉴别器或发生器很可能变得过于强大,主训练循环不能适应这些动态变化。
在我的训练计划中,我选择了一个动态的计划。我不确定它如何适用于不同的图像数据集。所以,不保证!
在我的设置中,我选择两种不同的路径来训练鉴别器。一条路径使得鉴别器对生成器非常强。让我们称这条路径为-A。另一条路径可能会也可能不会使鉴别器对生成器更强。当 50%的阳性标记被识别为“阴性”或 50%的阴性标记被识别为“阳性”或两者都有时,我选择路径 A。如果没有,我继续更轻的路径-B,为发电机提供呼吸空间。这确保了没有一个变得非常强大,在鉴别器和生成器之间总是有一个平衡,并且它们的学习是交织在一起的。下图显示了确切的逻辑。
此方案的 Adam 优化器的“Beta1”比率必须设置为较小的值,而不是 0.9。这是因为当我们在训练期间在路径 A 和路径 B 之间切换时,连续的运行可能在迭代方面相距很远。我把它设置为 0.5,它工作得很好。
Image courtesy: Self made PPT
快速对比 Crestle 和 Floyd Hub
如果你是一名实验开发者,就去 www.crestle.com。
如果您是一家企业,正在寻求支持、各种平台和专用 GPU 实例,请选择 www.floydhub.com。
两者都以“秒”为单位计算使用量。太好了!
Crestle 提供 GPU (K80)驱动的笔记本电脑,价格仅为竞争对手的一小部分,如 FloydHub ( 0.34 美元(现在为 0.59 美元)对1.14 美元)。Crestle 在你的浏览器中提供了一个 unix 命令行(称为 Jupyter 控制台),可以用来创建你需要的目录,压缩输出文件,解压输入文件,安装你需要的包等等。这叫灵活性,亲爱的。你可以使用 Jupyter 笔记本界面上传你的输入,它只是“干净”。你可以在几分钟内开始。但是使用 Crestle,你需要知道你在一个 Amazon Spot 实例内部。尽管您的文件在 Crestle 中跨运行持久化(这本身就是一个很好的特性),但是您的运行可能会突然中断。哎呀!
与“Floyd Hub”相比,它提供了名为 floyd-CLI 的 Python 包,这是“加载”数据和代码所需要的。这在一开始看起来很傻……但是……Floyd 支持下载/上传的恢复,如果你使用的是不稳定的互联网连接或者你没有备用电源,这将非常有用!Floyd CLI 也在服务器端处理文件的压缩和解压缩。Floyd hub 还以更高的价格提供更好的支持和专用实例。
Floyd Hub 支持使用“装载”将一个作业的输出重新用作另一个作业的输入。与“Crestle”提供的界面相比,这确实是一个复杂的界面。Crestle 只是为你打开了文件系统,你可以按照自己喜欢的方式来读/写。没有挂载,没有命名空间混淆等等。对于像我这样懒惰的简单开发人员来说,Crestle 是一个明显的赢家。
我为我的 GAN 作品选择了 Crestle。我的公司(www.tavant.com)报销所有这些费用。但是,少即是多。不是吗?
生成的图像
Image courtesy: Screenshot of generated images taken by me
想参加图灵测试吗?
Screenshot of images taken by me
图灵测试答案
请稍微滚动一下……
答:假像排列成 N 的图案
假阳性和假阴性
当你学习假设检验时,有两种错误经常出现——假 正 和假 负技术上分别称为第一类错误和第二类错误*。*
起初,我并不热衷于这些概念,我不明白它们怎么会有用。然而,这些年来,我开始改变想法。我对这些错误理解得越多,遇到得越多,它们就越让我兴奋和感兴趣。看到它们在现实世界中的应用和用途帮助我从一个不感兴趣的学生变成了一个热情的老师。
你知道那些疯狂地谈论一个没人理解或想理解的主题的老师吗?对,现在就是我了!这很棒,所以我想通过这篇文章向你展示这两个错误是如何在不同的和有趣的现实生活环境中产生实际影响的,从而让你达到我的兴奋程度。那么希望,看完之后,你会跃跃欲试地把所有关于假 正 和**假***负** 的事情告诉你爱的人。他们真幸运!*
惊呼者:本文不是来教你如何区分两者的。如果你想了解如何做到这一点,我在这里 做了一个关于这个主题的讲解视频。
让错误成为你的朋友。
你认为哪个错误更严重?
一个假阳性(I 型错误)* —当你拒绝一个真零假设——或者一个假阴性*(II 型错误)——当你接受一个假零假设?
我在很多地方看到这个问题的答案是:一个误报。我不相信这是 100%真实的。
正确的科学方法是形成一个无效假设,让你试图拒绝它,给我一个积极的结果。所以,假设我想看看这篇特定的文章是否比我发布的其他文章的平均表现更好。
考虑到这一点,我会选择零假设:
“我的文章被阅读的次数将与我发布的类似文章的次数相差减去* 或*
如果我拒绝零假设,这意味着两件事之一。
1。 这篇文章表现中等偏上——太棒了!这是我的正面结果。
2。 我犯了一个 I 型错误。我拒绝了一个为真的无效假设。我的测试显示我的表现高于平均水平,但事实上,我没有。我得到一个假阳性。
是的,在这里我的假阳性有一个坏的结果,我会不可避免地认为我的文章比它是更好的,从那时起,我所有的文章都以同样的风格写,最终伤害了我的博客流量。这无疑会对我的职业生涯和自尊心产生负面影响。
那假** 负呢?**
如果说这篇文章是博客写作的杰作,但我的测试表明它并不平庸,这种情况就会发生。当然,短期内我不会尝试用这种风格写文章。然而,我是一个有动力的人,会从他的“错误”中学习,所以尝试不同的技巧,有可能创造出更好的作品。
这不是最好的结果,我可能错过了一个机会,但这绝不像假阳性那样具有毁灭性。****
现在,这是一个最坏的情况是假阳性的情况,然而,一个关键的事实是我以一种特定的方式陈述了零假设。如果我交换了无效假设和替代假设,错误也会被交换。
让我展示给你看。
我的新无效假设:
“我的文章被阅读的次数将会比我发表的类似文章的次数多”
在假** 正的情况下,我会拒绝一个为真的零假设。所以,测试会显示我的杰作实际上是平庸或更糟。还记得这句话吗?这就是上一个例子中的假 负。**
这表明这两种误差是可以互换的。所以,都是关于你书房的设计;你可以改变一些事情来帮助你避免更大的问题。
在积极中寻找积极。
在申请数据科学行业的工作时,一个经常出现的面试问题是:
“你能提供一个假** 正比假 负的结果更好的例子吗?(反之亦然)**
当然,你可以使用上面的例子,然而,一些学者不太喜欢听到交换假设的想法。我只是想证明一个观点,当涉及到这个概念时,一切都不是那么非黑即白。
另外,我有更多的例子给你,你可以向你的潜在雇主展示你真的很了解自己。你很快就会赢得他们的支持!
这些例子都有因科学或法律而无法切换的假设(见,没那么非黑即白)。然而,它们确实给我们带来了假阴性不理想的情况。当然,我们仍然有点叛逆,但这样做是在科学和法律的范围内,所以,谁能阻止我们!
对宝宝还是不对宝宝?
当你做验孕测试时,你是在问:“我怀孕了吗?”
然而,在假设检验中,你有你的零假设:
“我没有怀孕”
拒绝假设给你一个“+”祝贺!你怀孕了!
接受假设会给你一个“对不起,祝你下次好运!”
生物学决定了这一点,所以恐怕不能切换。虽然测试可能会出现故障,而且假** 正确实会发生;在这种情况下,一个假阳性就是你实际上没有怀孕时的那个小“+”。一个假 负,过程会是“–”当你肚子里有个小宝宝在成长。******
这是一个很好的例子,因为更好的情况完全取决于你的情况!
想象一下,有人为了一个孩子努力了很长时间,然后奇迹般地怀孕测试呈阳性。他们在心理上为生孩子做好准备,在短暂的狂喜之后,以某种方式,他们发现他们实际上并没有怀孕!
这是一个可怕的结果!
对于那些真的不想要孩子、没有准备好要孩子的人来说是假阴性,当他们用阴性结果向自己保证时,饮酒和吸烟会对她、她的家庭和她的孩子造成难以置信的伤害。
然而,交换一下这些女性的情况,你会得到尽管不理想,但好得多的结果。
琐事时间!
怀孕测试已经发展到最小化假阴性的可能性。这确实改善了测试,因为虽然你不太可能去看医生来确认阴性结果,但对阳性结果来说是明智的。有许多医学原因导致假阳性,但假阴性只出现在测试的错误执行中。
艾滋病测试
这里有一个更明确的例子。
想象一下,一个病人正在接受艾滋病毒测试。
无效假设是:
“病人没有感染艾滋病毒。”
一个假 阳性的结果起初会让病人心碎;不得不面对这一消息并告诉家人和朋友的创伤不是你希望发生在任何人身上的情况,但在接受治疗后,医生会发现她没有病毒。再说一次,这不会是一次特别愉快的经历。但是没有艾滋病毒最终是一件好事。
另一方面,假阴性意味着患者携带艾滋病毒,但检测结果显示为阴性。这种情况的影响是可怕的,患者将错过重要的治疗,并有很高的风险将病毒传播给他人
毫无疑问,这里的假 负才是更大的问题。对个人和社会都是如此。
琐事:
许多医生称艾滋病结果为“反应性”,而不是阳性,因为存在假阳性。在患者被确定为 HIV 阳性之前,会进行一系列的检测。这并不全是基于一份血液样本。
阳性,直到证明为阴性
在许多国家,法律规定刑事案件中的嫌疑人是:“在被证明有罪之前是无辜的”。
这来自拉丁语
**‘我有遗嘱,有判决,无否定;无效遗嘱检验的性质。
也就是说:“证据在于肯定的人,而不是否定的人;因为,根据事物的本质,否认事实的人不能提供任何证据。”*
因此,零假设是:
“嫌疑人是无辜的。”
很简单,一个假阳性会导致一个无辜的一方被判有罪,而一个假阴性会产生一个无罪的有罪判决。
如果缺乏证据,接受零假设比拒绝零假设更有可能发生。因此,如果法律规定嫌疑人是“有罪的,直到被证明是无辜的。”假设是“嫌疑人有罪”接受虚假的零假设会导致许多无辜的人被监禁。
因此,对许多人来说,冒着(可能)让五名罪犯逍遥法外的风险保护一名无辜者似乎是值得的。
就法律这么回事,普遍的共识是,假的正的会是更大的问题。将一个无辜的人投入监狱的想法令人不安,因为一旦被定罪,证明他们事实上是无辜的并不简单。虽然假阴性会导致有罪的一方逍遥法外,但它可能会导致案件重新审理,或者如果这个人是一个惯犯,他将在以后被定罪。****
琐事:
直到最近,墨西哥还在使用“除非证明无罪,否则有罪”的制度。结果,法官甚至不愿审理大多数刑事案件,因为他们害怕将太多无辜的人投入监狱。自 2008 年以来,墨西哥的刑事司法系统一直在向“无罪,除非被证明有罪”过渡。
你的每一次呼吸,我都会看着你。
酒精测试是必要的麻烦。没人想被拦下做酒精测试,但也没人想被醉酒司机撞死。秋千和回旋处。
无效假设:“你低于酒精限度。”
再一次,很简单,一个假阳性将表明你甚至没有碰过酒精饮料就已经超过了限度。当你喝醉了,或者至少超过限度时,假阴性结果会显示你是清醒的。****
这两个问题都是由于影响呼吸酒精样本的各种因素造成的。为了抵消假阳性(失去执照,接受罚款或坐牢)的问题,法律规定,一个人可以提供血液或尿液样本来证明自己的清白(如果他们是无辜的)。****
考虑到这一点,假阴性显然是更大的问题。允许酒后驾车的人在假设他们清醒的情况下继续开车,显然对他们和周围的人都是危险的。虽然损失几个小时的时间是很小的代价,如果这有助于让更多的人不上路的话。
琐事:
人们被视为合法驾车受损的常见酒精水平范围为 0.00%至 0.08%。世界上最常见的基准是 0.00%,也称为零容差,和 0.05%。开曼群岛的限额最高,为 0.1%。这并不意味着对酒后驾车有更高的容忍度,所以在喝完一瓶杰克·丹尼尔酒上路之前,请记住,当地警察确实是通过频繁检查来执行法律的。
一个人的垃圾是另一个人的财富。
最后我想说的是垃圾邮件。
许多网站会告诉你类似这样的话:“请检查你的垃圾邮件文件夹。我们刚刚发送给您的电子邮件可能会在那里结束。”
电子邮件提供商越来越多地使用数据挖掘算法来过滤垃圾邮件。这是一个值得单独写一篇文章的话题。然而,我们讨论的是电子邮件放错地方的情况。
几周前,我给我妹妹发了一封邮件,她的邮件提供商把它标为垃圾邮件,这让我大吃一惊。他们怎么敢!我能想到的唯一解释是,我用我的个人邮箱给我姐姐的公司邮箱发了邮件。所以,算法看不到我妹妹想要我的邮件的证据(也许它知道一些我不知道的东西……)。因此,它接受了零假设:
“这封邮件是垃圾邮件。”
如果算法拒绝零假设,电子邮件就会通过。一个假阳性将意味着你的收件箱里有来自尼日利亚王子的奇怪的电子邮件,他们想要娶你,或者久违的亲戚询问你的银行细节,这样他们就可以把你曾祖母的表姐的继女的猫的大笔遗产寄给你。****
假阴性很可能是更大的问题。你可能会错过你兄弟姐妹的面试邀请或假日快照,只是因为它们被淹没在大量的垃圾邮件中——你在删除之前半心半意地浏览了一下。
不过这取决于个人偏好,有些人对手机上的通知非常恼火,只看到一封毫无意义的邮件,以至于几封放错地方的私人邮件只是小小的代价。
花絮:
你在脸书上发送的好友请求超过 95%都会被接受,因为你通常会联系你认识的人。这是不正确的垃圾邮件帐户,这是脸书检测他们的方式之一。然而,最近机器人采取了一种策略,他们假装是有吸引力的女性,并将男性用户作为他们的受害者。因为男性用户平均来说会接受这些好友邀请,所以检测机器人需要更长的时间。
这是一些常见的假阳性和假阴性的例子。正如你所看到的,更可取的错误实际上取决于情况本身、你的个人偏好或研究是如何设计的(如果需要,你可以改变假设)。所以,我希望你不要遵循一般的假设,即假阳性会导致更大的问题,并且现在更好地准备产生可靠的例子来支持它。****
现在,我敢打赌,读完这篇文章后,你对假阳性和假阴性的兴趣已经从 0%上升到 100%。如果你想了解这方面的一些科学知识,你可以查看我们的视频I 型误差与 II 型误差。**
祝您愉快!
如果你喜欢这篇文章,请随意看看我的其他文章。“起步的好处”听起来是个不错的起点!
参考资料:
南·瓦格纳(1917 年 6 月 1 日)。【瓦格纳法律语录网页】 。Wagonerlaw.com。检索到2010–10–13。**
deepfakes 的家庭乐趣。或者我是怎么让我妻子上《今夜秀》的
【2018 年 2 月 3 日更新: 在本帖底部新增两个创作。最后一个结果很好
(图片可能需要一段时间加载!)
我第一次听说 deepfakes 是在一周前。感谢推特。谢谢蒂姆·索雷特。
是的,这是相当该死的赛博朋克。但是从表面来看, /r/deepfakes (极其 NSFW!你已经被警告)由使用用户“deepfakes”创建的应用程序来创建假名人色情的人组成。
这在互联网上引起了一场轩然大波,媒体讨论这一切的合法性,网站撤下了 deepfake 的作品,人们恐慌地意识到人工智能会毁了我们所有人。与此同时,尼古拉斯·凯奇正在接管好莱坞。
当每个人都在争论这是好是坏的时候,我不得不发现更多。我首先想到的是什么?我怎样才能把这个应用到我认识的每个人身上(以一种非色情的方式,如果你想知道的话)。
它是如何工作的?
deepfakes 应用程序是一种深度学习算法,可以学习如何重建人脸。给它一堆图片,让它运行几个小时,它就会吐出这些图像的模糊副本。请注意,它不会创建副本。它学习一张脸在不同表情下的样子,并能够仅基于此输出那张脸。Reddit 上有详细的解释,但让我试着简单解释一下。
想象一下,如果你可以盯着一个人看 12 个小时,观察他们所有的表情并吸收到你的大脑中。然后那个人让你在纸上画出他的脸,微笑,哭泣,任何你观察到的表情。你是做什么的?你立即在纸上生成一个摄影质量的草图,从脑海中!(用铅笔)
太疯狂了。
虽然这很酷,但只会变得更好。看到“编码器”那部分了吗?FakeApp 对所有人脸使用一个编码器。是解码器保持了人脸的特异性。最酷的部分来了。让它学会两张脸,事情就变得更有趣了。
好了,现在看看这是怎么回事。编码器获取一张人脸图像,让它通过它的“大脑”,解码器再把它吐出来。在上面的例子中,它可以通过安妮·海瑟薇和我妻子埃尔克的脸来实现。好的,到目前为止还不错。但是现在让我们给它一张安妮的照片,但是使用生成埃尔克的脸的解码器!
你刚给埃尔克拍了张新照片。一张从未存在过的照片,和安妮一样的角度,一样的表情!太神奇了!
家庭乐趣
当然,把名人的脸放在你最喜欢的色情明星身上是一个有趣的用例。但是我们可以利用这些名人做其他事情,比如把你的朋友和家人插入大片和节目中!
为了获得最佳效果,您必须首先找到一个与您希望插入的人的头型相似的男演员/女演员。至于 Elke(我的妻子),我在看《黑暗骑士崛起》的时候偶然发现安妮·海瑟薇可能是个不错的选择。我猜你认识安妮,所以这是埃尔克:
我只需要 850 张埃尔克的照片,1000 张安妮的照片,大量的计算时间,瞧,埃尔克在吉米·法伦主演的《今夜秀》上。
额外效果:现在我们知道短发的:D 看起来像什么了
这里有一个小小的对比 gif:
**
我个人认为这很有趣,可以是无辜的,甚至是一个不错的惊喜/礼物。记住,任何工具都可以用来作恶。只要我们不禁止枪支,这不应该是一个高度优先事项,阿米利特?
有了这项技术,你可以做很多事情。你知道人们发的那些愚蠢的邮件吗?他们用自己的,甚至更糟的,你的脑袋替换了跳舞的精灵的脑袋?好吧,现在你可以把你最好的朋友放进他最喜欢的电影里:让她和帕特里克·斯威兹跳舞,享受她一生的时光,或者让一个外星人从他的肚子里蹦出来。现在一切都触手可及!
除了纯粹的乐趣,我只能想象人们将如何开始把这项技术变成商业创意。时尚将是巨大的(这种发型,这种裙子我会是什么样子……),健身可能会很有趣(我肌肉发达好看吗,我瘦了真的会更好看吗),旅行(这是你站在沙滩上会很有说服力)。它会把广告业带到一个全新的水平。不需要想象如果,他们会告诉你你的“更好”的生活会是什么样子!那幅画面很难从你的脑海中抹去…
与此同时,我又创造了两个。埃尔克是史蒂夫·卡瑞尔的超级粉丝,我突然意识到安妮·海瑟薇和他一起出演了《T2 变聪明》。第一次尝试还可以:
然后我就想试试这个(原视频):
我认为结果很棒:
最初发表于 斯文 。
在高速公路上挨饿:可视化,映射洛杉矶餐馆检查
使用 Python,Matplotlib,Plotly 分析,查看地图上的分级餐厅
“pizza and nachos chip” by Roberto Nickson (@g) on Unsplash
你好。我使用 Python,matplotlib,Plotly 来分析加州洛杉矶县餐馆检查结果数据集,并通过绘制 C 级餐馆来可视化。也许你可以在高速公路上(或者更有可能的是,在堵车时:)仔细阅读这些信息。以下是一个概述:
- 从 ka ggle-inspections,violations 文件导入数据集
- 创建数据框架
- 按违规数量、类型等进行分析、排序。
- 分组、按等级计数、风险并以图形方式显示
- 提取低等级©的餐馆及其地址
- 从谷歌地图中获取他们的地理坐标(纬度,经度)以在地图中使用,将它们存储到[创建]地图
- 在地图上标出那些餐馆的位置
开始之前:
Start a new notebook file:**#TSB - Hari Santanam, 2018**
***#import tools required to run the code***
from mpl_toolkits.mplot3d import Axes3D
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import requests
import logging
import time
import seaborn as sns
读取两个数据集文件:
- 检查文件是所有被检查的餐厅、菜场的清单
- 违规文件是发现的所有违规和相应设施的列表(一个设施可能有多个违规)
***#read in file with all inspections and put in dataframe***
df1 = pd.read_csv('../input/restaurant-and-market-health-inspections.csv', delimiter=',')
nRow, nCol = df1.shape
***#print number of rows and columns***
print({nRow}, {nCol})***#read in file with all health VIOLATIONS and put in dataframe***
df2 = pd.read_csv('../input/restaurant-and-market-health-violations.csv')
Output of file rows x columns
用原始检查分数创建一个数据框架,并绘制在直方图上:
***#Put these two lines before each plot/graph, otherwise it sometimes #re-draws over the same graph or does other odd things***from matplotlib import reload
reload(plt)
%matplotlib notebook
***#draw the histogram for scores***
df2['score'].hist().plot()
Histogram for score distribution — x-axis is score value bins, y-axis is count for each value bin
为标签描述键入以下内容:
***#search for missing grade, i.e, that is not A or B or C***
df1[~df1['grade'].isin(['A','B','C'])]
***#one record (record # 49492) popped up, so we fix it by assigning it a grade C***
df1.loc[49492,['grade']] = 'C'***#find out the distribution of the grades, i.e, how many records in each grade******#basically, group dataframe column grade by grade letter, then count and index on that, and print it***
grade_distribution = df1.groupby('grade').size()
pd.DataFrame({'Count of restaurant grade totals':grade_distribution.values}, index=grade_distribution.index)
注意,上面的总数加起来是 58,872,这是文件中的总行数,这意味着没有没有等级的行。
按餐厅类型(座位类型)分组,并计数和绘制图表
***#group by restaurant type and count # in each category
#then sort from highest # to lowest, then create a bar graph***
temp = df1.groupby('pe_description').size()
description_distribution = pd.DataFrame({'Count':temp.values}, index=temp.index)
description_distribution = description_distribution.sort_values(by=['Count'], ascending=True)
df2['pe_description'].hist().plot()
Grouped by pe_description field (ex: “Restaurant (seats 31–60, high risk”)
用原始检查分数创建一个数据框架,并绘制在直方图上:
***#the previous charts and graphs show breakdown of various types food restaurants with risk
#broken down to high, medium, low.
#This procedure use the split function to break the pe_description field into the sub-string
#after the 2nd space from the end - ex: string x = "Aa Bb Cc", when split applied like this: x.split(' ')[-2] ->sub-string after(not before) 2nd space '=>Bb'***def sub_risk(x):
return x.split(' ')[-2]
***#apply function to get only high, medium, low*** df2['risk'] = df2['pe_description'].astype(str).apply(sub_risk)***#group, count by risk level***
temp = df2.groupby('risk').size() ** *#plot the histogram for the 3 levels of risk***
df2['risk'].hist().plot()
Count by Risk type (High, Medium, Low) , extracted from restaurant type field string
用原始检查分数创建一个数据框架,并绘制在直方图上:
***#show first 10 rows of the violations file dataframe***
df2.head(10)
***#groupb by violation_description, count and sort them from largest violation by count to smallest***
violation_description = df2.groupby('violation_description').size()
pd.DataFrame({'Count':violation_description.values},index = violation_description.index).sort_values(by = 'Count',ascending=False)
Screen shot — Counts for each type of violation
创建一个函数,将字符串定义的值转换为数字,并制作一个热图:
***#create a simple proc for heat map for risk - low, moderate, high***
def convert_risk_value(x):
if x == 'LOW':
return 10
elif x == 'MODERATE':
return 5
else:
return 0
***#create simple proc to map grade to value* **
def convert_grade_value(x):
if x == 'A':
return 10
elif x == 'B':
return 5
else:
return 0
***#call (apply) procs created above***
df2['risk_value']=df2['risk'].apply(convert_risk_value)
df2['grade_value']=df2['grade'].apply(convert_grade_value)
df3 = df2.loc[:,['score', 'grade_value', 'risk_value']]
corr = df3.corr()
corr = (corr)
reload(plt)
%matplotlib notebook
sns.heatmap(corr, xticklabels = corr.columns.values, yticklabels=corr.columns.values, cmap="Purples", center=0)
Screen shot — Heat map — score, grade_value and risk_value
从最常见的违规开始按降序显示违规计数:
***#violations listing from most common, descending - violation description, violation code, counts***
violation_desc=df2.groupby(['violation_description','violation_code']).size()
pd.DataFrame({'Count':violation_desc.values}, index=violation_desc.index).sort_values(by = 'Count', ascending=False)
Screen shot — Violation count by description and code
显示违规最多的设施点:
***#list facilities with most violations and type of violation
#create a dataframe with facility and violation columns, aggregate by size, then count and sort them***
violation_desc2 = df2.groupby(['facility_name','violation_description']).size()
pd.DataFrame({'Count':violation_desc2.values}, index=violation_desc2.index).sort_values(by='Count', ascending=False)
Screen shot — Facilities with the most violations and type of violation
分离并提取等级为“C”的餐厅进行映射。使用 loc 函数,然后删除重复项,这样每个餐馆名称只出现一次。我们稍后将在地图中使用它。
***#get a list of all the restaurants with grade C***
df4 = df2.loc[(df2['grade'] == 'C'),['facility_name','facility_address','facility_zip']]***#only want each restaurant listed once, since many of them have multiple violations, or may be listed more than once for multiple inspections or other reasons***
df4=df4.drop_duplicates(['facility_name'])***#print***
df4
Screen shot — list of restaurants with grade C
下面,我们列出上面的地址(C 级餐馆)并添加城市和州(所有地址都相同)作为完整地址(位置#、街道、城市、州)。这是必需的,因为在国家和世界的其他地区可能有同名的街道和城镇,作为调用 google maps api 的参数,它将为我们提供地理坐标(纬度、经度),然后我们将这些坐标叠加在加利福尼亚州洛杉矶县的地图上。
***#visualize bad restaurants (grade C)on a map, so that if you are in that area, you can avoid them :)***
***#some of them might have remediated their violations, or may be operating under "new management" or maybe even turned over a new leaf - we just don't know***
addresses_to_avoid = df4['facility_address'].tolist()
addresses_to_avoid = (df4['facility_name'] + ',' + df4['facility_address'] + ',' + 'LOS ANGELES' + ',CA').tolist()
添加一些控制台处理,一些常数:
***#some logging and console handling system items***
logger = logging.getLogger("root")
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler() #console handler
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)***#some constants for our upcoming function***
address_column_name = 'facility_address'
restaurant_name = 'facility_name'
RETURN_FULL_RESULTS = False
BACKOFF_TIME = 30 ***#for when you hit the query limit******#api key needed for the call to google maps -if you are wondering #what this is, you missed the 1st couple of paragraphs, please go #back and re-read***API_KEY = 'your api key here'
output_filename = '../output-2018.csv'
***#output file stores lat,lon***
创建一个函数,从上面的列表中调用每个地址,并通过调用 google maps 来获取将用于叠加在加利福尼亚州洛杉矶地图上的坐标。
logger = logging.getLogger("root")
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler() #console handler
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)address_column_name = 'facility_address'
restaurant_name = 'facility_name'
RETURN_FULL_RESULTS = False
BACKOFF_TIME = 30API_KEY = 'Your API key here'
output_filename = '../output-2018.csv'
#print(addresses)***#adapted from Shane Lynn - thanks***
def get_google_results(address, api_key=None, return_full_response=False):
geocode_url = "[https://maps.googleapis.com/maps/api/geocode/json?address={](https://maps.googleapis.com/maps/api/geocode/json?address={)}".format(address)
if api_key is not None:
geocode_url = geocode_url + "&key={}".format(api_key)
#ping google for the results:
results = requests.get(geocode_url)
results = results.json()
if len(results['results']) == 0:
output = {
"formatted_address" : None,
"latitude": None,
"longitude": None,
"accuracy": None,
"google_place_id": None,
"type": None,
"postcode": None
}
else:
answer = results['results'][0]
output = {
"formatted_address" : answer.get('formatted_address'),
"latitude": answer.get('geometry').get('location').get('lat'),
"longitude": answer.get('geometry').get('location').get('lng'),
"accuracy": answer.get('geometry').get('location_type'),
"google_place_id": answer.get("place_id"),
"type": ",".join(answer.get('types')),
"postcode": ",".join([x['long_name'] for x in answer.get('address_components')
if 'postal_code' in x.get('types')])
}
#append some other details
output['input_string'] = address
output['number_of_results'] = len(results['results'])
output['status'] = results.get('status')
if return_full_response is True:
output['response'] = results
return output
调用这个函数,如果一切顺利,它将把结果写到指定的文件中。注意:这个调用经常会遇到 Google 强加的“查询限制”,所以您要么必须手动调用它们(从文件中过滤后),要么从输出文件中删除它们。
***#for each address in the addresses-to-avoid list, call the function we just created above, to get the coordinates, and add to a new list called results2***
results2=[]
for address in addresses_to_avoid:
geocode_result = get_google_results(address, API_KEY, return_full_response=RETURN_FULL_RESULTS)
results2.append(geocode_result)***#now, convert the list with our geo coordinates into a csv file that will be called by another program to overlay on a map.***pd.DataFrame(results2).to_csv('/Users/hsantanam/datascience-projects/LA-restaurant-analysis/restaurants_to_avoid.csv', encoding='utf8')
我们差不多完成了。我本可以用相同的代码创建一个函数,但是为了便于阅读和理解,我用一个新的程序创建了这个函数,这个程序为地图设置配置,从输出文件中调用我们刚才创建的地址坐标数据,并在浏览器选项卡上绘制它。这是它的输出:
这是最后的结果——上面代码的可视化地图输出。
Restaurants with C grade — mapped out for LA county, CA — opens in default browser, new tab
Popups with name, coordinates, address appear when you hover over any location dot
感谢您耐心通读此文:)。你现在可能饿了——如果你碰巧在这个地区,找一家餐馆吃饭,只是不要在那些等级不好的餐馆里!
github 到这里的链接是这里是。
如果你感兴趣,可以看看我的其他文章:
[## 使用 Google Datalab 和 BigQuery 进行图像分类比较
样本数据,简单用法
medium.com](https://medium.com/google-cloud/using-google-datalab-and-bigquery-for-image-classification-comparison-13b2ffb26e67) [## 使用 Google Cloud ML 引擎训练回归模型
在 Google Cloud Datalab 中提交一个培训模型作业
medium.com](https://medium.com/google-cloud/using-google-cloud-ml-engine-to-train-a-regression-model-e2a582de389e) [## 使用 Keras 预测时尚数据集并查看机器学习使用的图像
人工智能使用图像识别学习过程来处理成千上万的图像,并“学习”哪些图像属于哪个…
medium.com](https://medium.com/@hari.santanam/using-keras-to-predict-fashion-dataset-and-see-images-used-by-machine-learning-5f4a889fb1b0) [## 人工智能对 IT 的价值主张
人工智能对于公司内部的大多数业务领域来说都很棒。它有望带来新的洞察力、预测和分析,这使得…
medium.com](https://medium.com/@hari.santanam/value-proposition-of-ai-for-it-1c8903c0ec25)
神奇的模型和如何训练他们
在机器学习项目中试验软件开发管道。
在我多年的软件工程师生涯中,我参与过不同规模和应用领域的软件项目。到目前为止,我很幸运有机会尝试不同的技术堆栈,使我的专业技能始终保持最新,并与当今技术领域不断发展的节奏保持一致。不过,直到最近,我才开始尝试和积累机器学习相关技术的技能,一部分是出于日常工作的需要,一部分是出于个人兴趣(我承认,我算是个极客)。因此,在恢复我的数学理论并学习了一两个主要软件库的基础知识后,我开始尝试复制一些在网上找到的最有趣的例子。
首先,当你开始使用一个全新的技术堆栈时,你可能会很容易记下一些实现 web 教程的随机脚本,或者尝试一些没有特定顺序的变体,只是为了体验一下它的感觉…
不过,我很快意识到,为了能够在更专业的环境中开发我的新技能,我需要以一种更有条理的方式进行。因此,我考虑将这些新技术和工具与我迄今为止通过设计和开发“经典”企业级应用程序所学到的东西相结合,通过将通常的软件开发管道和工具适应于涉及机器学习模型的特定情况。我计划在这里记录我的努力和实验,并把它们作为指南提供给像我一样开始在这个迷人的技术领域前进的人。
首先,我开始从鸟瞰的角度考虑整个软件开发和发布过程。
最佳实践和模式在这个问题上提供了一个有用的视角:举个例子,其中一些实践建议在软件开发和发布生命周期中严格分离构建、发布和运行的三个阶段。构建阶段处理用我们最喜欢的编程语言为我们的应用或服务实际编写源代码,处理源代码版本等方面,通常会产生一个二进制可执行文件包,称为“构建”。接下来的发布(也称为部署)阶段采用这个二进制包,并将其与严格依赖于目标部署环境的特定配置数据相结合(开发、测试和质量保证、试运行、生产等)。这种配置数据可以包括外部数据库或其他类似服务(所谓的“后台服务”)的连接和凭证,部署特定的设置,例如部署的规范主机名等。因此,这个阶段产生的东西是可以立即执行的。作为最后一个阶段,运行阶段在目标环境中执行应用程序或服务的主进程。
这种严格的阶段分离意味着,例如,禁止在运行时环境中直接改变应用程序代码,但是必须启动新的发布周期来改变源代码,产生新的包,并在目标运行时上将其作为新版本执行。这保证了许多好的属性,比如过程的可追溯性、可再现性等等。
因此,所有这些导致建立分离的(至少在概念上)运行时环境,其中不同的阶段由不同的特定环境支持,每个环境配备有最适合支持与所讨论的阶段相关的特定活动的资源级别、软件基础设施工具。
开发环境将需要一些 IDE(如 Eclipse、Visual Studio 或 PyCharm)和语言运行时,以允许开发人员生成他们的代码,持续集成(CI)环境将包含共享、版本化和管理源代码和编译的组件二进制文件(如 GIT、Maven、Jenkins 等)的工具。),最后,目标运行时环境应该配备一些可靠的运行时基础设施,允许软件组件的执行,同时管理诸如分布、负载平衡、容错等问题(最近我对 Kubernetes 很感兴趣)。
现在,当考虑机器学习项目时,首先想到的一个方面是构建阶段在概念上变得稍微复杂一些。开发人员不只是编写一个构建然后执行的程序源代码,而是这个第一个源代码是一个构建然后在某个地方执行的程序以产生另一个“程序”(即 ML 模型),最终将在其他地方执行以服务于客户的请求。
明确地说,CI 和 train 环境之间的实际“物理”分离基本上是由从源代码构建应用程序二进制文件的不同任务与训练 ML 模型相比产生的根本不同的需求所强加的。后者应该比前者需要更高的计算能力和资源,可能需要 GPU、TPUs 等等的支持……我意识到,对于有经验的 ML 实践者来说,这一切听起来可能微不足道,但是我承认,一开始我花了一些时间来正确地关注这个问题,导致了一些最初的困惑,我认为模型训练只是最终可执行工件构建过程中的一个进一步阶段。
类似地,训练环境和目标执行环境的需求可能会有很大的不同,其中最终目标甚至可能只是运行训练模型的某个移动设备,作为某个“人工智能驱动的”移动应用程序的一部分。
在接下来的文章中,我打算研究在设置和操作上述难题的任何部分时可能出现的任何问题,主要关注企业级环境中的相关解决方案,其中可能涉及不止一个开发人员的团队,设计大规模模型或(最重要的)使用大数据集,以及运行时性能、高可伸缩性或弹性等考虑因素很重要。就基于机器学习的软件而言,所有这些都是从一个初学者的角度来看的,就像我正在进行的这项探索工作的“日记”一样。与此同时,我的意图不是提供一些关于如何制作东西的深入的逐步指导,而是对可能出现的问题、您面临的选择或可用选项(最佳实践、软件工具、服务等)采取高层次的观点。)这可能有助于找到所需的解决方案。
我希望这是一个能让一些人感兴趣的主题,也希望收到关于如何改进这一系列帖子的好的反馈和有用的建议。
参考文献和注释
[1] *参见所谓的“12 因素”方法,这是一套最近非常流行的模式和建议,最初是由 Heroku(众所周知的 PaaS 平台)的工程师设计的。这些旨在为构建可移植、高可伸缩和弹性的应用程序提供指导,特别关注基于 web(软件即服务)或基于云的服务,正如大多数现代软件应用程序所期望的那样。https://12factor.net/*T2
FAQ:使用 TensorFlow 构建手写文本识别系统
本文是关于如何使用 TensorFlow 实现一个文本识别模型的文章的后续。它基于 SimpleHTR 库的一个旧代码版本。
有些问题我想在这里讨论一下。我们来看看以下三个一:
- 如何识别图像/数据集中的文本?
- 如何识别包含在行或整页中的文本?
- 如何计算识别文本的置信度得分?
1 如何识别图像/数据集中的文本?
在 IAM 数据集上训练预训练模型。来自 IAM 的一个样本如图 1 所示。该模型不仅学习如何阅读文本,还学习数据集样本的外观。如果您浏览 IAM 单词图像,您会注意到这些模式:
- 图像具有高对比度
- 单词被紧凑地裁剪
- 大胆的写作风格
Fig. 1: A sample from the IAM dataset.
如果你给一个图像输入一个非常不同的风格,你可能会得到一个不好的结果。让我们看一下图 2 所示的图像。
Fig. 2: A sample for which the model recognizes the text “.”.
该模型识别文本“”在这张图片中。原因是模型从未见过这样的图像:
- 低对比度
- 单词周围有很多空间
- 线条非常细
让我们来看两种改善识别结果的方法。
1.1 预处理图像
让我们从一个简单的方法开始,让图像看起来更像来自 IAM 数据集的样本。我们将使用上面的图像来尝试这一点(见图 3)。首先,让我们来修剪它。该模型仍然识别“.”。然后,我们增加对比度。现在,模型给出了一个好得多的结果:“tello”。这几乎是正确的。如果我们通过应用形态学操作来加粗线条,模型最终能够识别正确的文本:“Hello”。
Fig. 3: Preprocessing steps and the recognized text for each of them.
这种裁剪可以用一种分词算法来完成。增加对比度和应用形态学操作是通过以下 Python 代码实现的。
1.2 创建 IAM 兼容的数据集和训练模型
获得良好读取结果的最佳方法当然是根据您的数据重新训练模型。虽然创建数据集可能相当费力,但绝对值得。您需要将图像-文本对转换成 IAM 兼容的格式。下面的代码显示了如何进行这种转换。DataProvider 类的 getNext()方法在每次调用时返回一个样本(文本和图像)。createIAMCompatibleDataset()函数创建文件 words.txt 和目录 sub,所有图像都放在这个目录中。如果您想要转换数据集,您必须修改 getNext()方法(目前它只是为所提供的单词创建机器打印的文本,以显示示例用法)。
转换后,将文件 words.txt 和目录 sub 复制到 SimpleHTR 项目的数据目录中。然后可以通过执行 python main.py - train 来训练模型。
2 如何识别成行或整页的文字?
该型号可输入 128×32 的图像,最多可输出 32 个字符。所以,用那个模型识别一个或者两个单词是可能的。但是,更长的句子甚至整页都无法直接阅读:
- 行:要么将行分割成单词,要么将文本识别模型放大,以便它可以处理整行
- 整页:将页面分割成单个的单词,然后分别阅读每一页
我们先来看看预处理,它既可以用于行级文本处理,也可以用于页面级文本处理。
2.1 预处理图像
如果该行的单词容易分割(单词之间的间隙大,单词的字符之间的间隙小),那么可以使用类似于 R. Manmatha 和 N. Srimal 提出的简单的单词分割方法(参见图 4 的例子)。然后,将分割后的单词分别输入文本识别模型。对于更复杂的文档,可以使用基于深度学习的分词方法。
Fig. 4: Word-segmentation on page-level.
2.2 扩展模型以适合完整的文本行
如果在行级别上工作,您可以轻松地扩展模型,以便输入更大的图像和输出更长的字符串。
表 1 显示了我用于文本行识别的架构。它允许更大的输入图像(800×64 ),并且能够输出更大的字符串(长度可达 100)。此外,它包含更多的 CNN 层(7),并在两层中使用批量标准化。
Table 1: Architecture for reading on line-level. Use option 1 (LSTM) for the recurrent network. Abbreviations: bidirectional (bidir), batch normalization (BN), convolutional layer (Conv).
3 如何计算识别文本的置信度得分?
获得被识别文本的概率的最简单的方法是使用 CTC 损失函数。损失函数将字符概率矩阵和文本作为输入,并输出损失值 L。损失值 L 是看到给定文本的负对数可能性,即 L=-log§。如果我们将字符概率矩阵和识别的文本提供给损失函数,然后取消对数和减号,我们得到识别文本的概率 P:P = exp(-L)。
以下代码显示了如何为一个玩具示例计算识别文本的概率。
结论
这篇文章展示了如何处理不同的数据集以及行级甚至页面级的读取。此外,还讨论了计算置信度得分的简单方法。
参考
最后,概述一下我的其他媒体文章。
奇异明天的迷人故事
人工智能:科学与小说
我们的旅行始于 1956 年 3 月“禁忌星球”电影的上映,这部电影的主角是机器人罗比,他是公认的第一个出现在银幕上的科幻机器人。几个月后,由**【1】领导的一小组计算机科学家在新罕布什尔州的达特茅斯学院举办了为期 6 周的研讨会。**
******
John McCarthy (Turing Award 1971) & Robbie the Robot**
这次研讨会的主题是“人工智能”,这是麦卡锡自己创造的一个术语,他是这样定义的:
“学习的每一个方面或智力的任何其他特征,原则上都可以如此精确地描述,以至于可以制造一台机器来模拟它”。
如果达特茅斯的工作室实际上是由约翰·麦卡锡看了《禁忌星球》然后回家想:“让我们来建造罗比”而引发的,那不是很棒吗?不过,这可能根本不是真的。哦好吧。
不管怎样,这个小组开始工作,为我们所知的人工智能奠定了基础。事实上,大多数参与者将他们的整个职业生涯都奉献给了推动人工智能的发展,在这个过程中获得了不下四个图灵奖:1969 年的马文·明斯基**【3】,1971 年的约翰·麦卡锡,希尔伯特·西蒙【4】&艾伦·纽厄尔【5】1975 年。**
******
Herbert Simon (Turing Award 1975, Nobel Prize in Economics 1978) ad Allen Newell (Turing Award 1975)**
在人工智能的早期,这些聪明的科学家做出了一些预测,比如:
1958 年,希尔伯特·西蒙和艾伦·纽厄尔:“10 年内数字计算机将是世界象棋冠军。
1965 年,希尔伯特·西蒙:“20 年内,机器将能做任何人能做的工作。
1967 年马文·明斯基: 在一代人之内,创造‘人工智能’的问题将得到实质性解决。
1970 年马文·明斯基:“ 在 3 到 8 年的时间里,我们将拥有一台拥有普通人一般智力的机器。
哎呀。
人工智能的冬天来了
预测未来总是有风险的事情,但这仍然提出了一个令人生畏的问题:对于人工智能在合理的时间框架内会(或不会)实现什么,如此聪明的头脑怎么会如此大错特错?不要担心,我们稍后会回答这个问题。
不幸的是,多次未能取得重大进展成为了人工智能的商标。
期望很高,结果很少或根本没有,资金被削减,项目被放弃。不出所料,这些多重的 AI winters 让除了最铁杆支持者之外的所有人望而却步。
这种幻灭最明显的象征来自马文·明斯基本人。2001 年,他做了一个名为“的报告:现在是 2001 年:哈尔在哪里?当然指的是斯坦利·库布里克电影《2001:太空漫游》中的哈尔电脑。更重要的是,早在 1968 年,明斯基就在电影制作期间给库布里克提了建议。在这次演讲中,他明确地提出了“常识问题”😗“今天没有任何程序可以区分狗和猫,或者识别典型房间中的物体,或者回答 4 岁儿童可以回答的问题!”*
****
Marvin Minsky (Turing Award 1969) & HAL 9000
一句话:在实验室环境中玩人工智能很酷,但在现实世界中它永远不会有所成就。结案了。
与此同时,在美国西海岸…
当人工智能研究人员在实验室里绝望的时候,一些初创公司正在重塑世界:亚马逊、谷歌、雅虎,后来脸书和其他几家公司加入进来,它们正在以疯狂的速度发展自己的网络平台。在这个过程中,他们获得了数以百万计的用户,积累了大量的数据。很快就清楚了,这些数据是一座金矿,如果真的可以开采的话!
使用商用硬件,这些公司的工程师开始寻求设计和构建数据处理平台,使他们能够处理原始数据并提取商业价值,这些价值可以转化为收入** …这始终是快速增长的初创公司的一个关键目标!**
2004 年 12 月达到了一个重要的里程碑,当时 Google 发布了著名的 Map Reduce 论文【6】,其中他们描述了一个编程模型和一个用于处理和生成大型数据集的相关实现。不甘示弱的雅虎实现了本文描述的想法,并于 2006 年 4 月发布了他们项目的第一个版本:Hadoop【7】诞生了。
等待火柴的汽油:机器学习爆炸发生了,剩下的,正如他们所说,是历史。
快进几年
2010 年左右:机器学习现在是商品。客户有广泛的选择,从 DIY 到机器学习即服务。数据世界一切都很棒。但真的是这样吗?是的,机器学习帮助我们让很多应用程序变得“更聪明”,但是我们在人工智能方面取得重大进展了吗?换句话说,我们离“建设哈尔”更近了吗?嗯……不。让我们试着理解为什么。
构建机器学习应用的第一步被称为“特征提取”。简而言之,这是数据科学家探索数据集的一个步骤,以找出哪些变量对预测或分类数据有意义,哪些没有意义。虽然这仍然主要是一个冗长的手动过程,但现在已经很好地理解了它,并且可以很好地处理结构化或半结构化数据,如 web 日志或销售数据。
然而,对于复杂的人工智能问题如计算机视觉或计算机语音并不适用,原因很简单,因为要正式定义的特征是什么:例如,是什么让猫成为猫?猫和狗有什么不同?还是来自狮子?
简单来说,传统的机器学习并不能解决这类问题,这就是为什么需要新的工具。进入神经网络!
回到未来
新工具?几乎没有!1957 年,Frank Rosenblatt 设计了一个机电神经网络,感知器【8】,他训练它识别图像(20x20“像素”)。1975 年,Paul Werbos 发表了一篇描述“反向传播”【9】的文章,这是一种允许更好更快地训练神经网络的算法。
因此,如果神经网络已经存在了这么长时间,那么它们肯定要对失败的人工智能尝试负部分责任,对吗?他们真的应该复活吗?为什么他们会突然成功?
确实是非常合理的问题。让我们首先快速了解一下神经网络是如何工作的。一个神经元是一个简单的构造,它将多个加权输入相加产生一个输出**。神经元被组织在层中,其中层‘n’中每个神经元的输出作为层‘n+1’中每个神经元的输入。第一层称为输入层,输入数据,比如图像的像素值。最后一层称为输出层并产生结果,比如图像的类别号(“这是一只狗”)。**
******
The basic structure of a neural network (Source: “Deep Learning”, Goodfellow & Bengio, 2016)**
神经网络的美妙之处在于它们能够自我组织**:给定足够大的数据集(比如,图像作为输入,类别标签作为输出),神经网络能够自动学习**如何产生正确的答案****
由于一个迭代训练过程,它能够发现允许图像被分类的特征**,并反复调整权重以达到最佳结果,即具有最小错误率的结果。**
训练阶段及其自动特征发现非常适合解决非正式问题,但这里有一个问题:它们涉及许多数学运算,随着数据大小的增加(想想高分辨率图片)以及随着层数的增加,这些运算往往会呈指数增长。这个问题被称为“维数灾难”,这也是神经网络几十年来停滞不前的主要原因之一:根本没有足够的计算能力来大规模运行它们。
也没有足够的数据可用。神经网络需要大量数据才能正确学习。数据越多越好!直到最近,收集和存储大量的数字数据还是不可能的。你记得穿孔卡片或软盘吗?
一项重大突破发生在 1998 年,当时 Yann Le Cun 发明了卷积神经网络**【10】,这是一种新型的多层网络(因此被称为“深度学习”)。**
简而言之,CNN 能够有效地提取特征,同时减少输入数据的大小:这允许更小的网络用于分类,这大大降低了网络训练的计算成本。
这种方法非常成功,以至于银行采用 CNN 驱动的系统来实现支票手写识别的自动化。对于神经网络来说,这是一个令人鼓舞的成就…但是最好的还在后面!
Architecture of a Convolutional Neural Network (Source: NVIDIA blog)
神经帝国反击了
到 2000 年代末,三个几乎同时发生的事件使得大规模神经网络成为可能。
首先,大型数据集变得广泛可用。文本、图片、电影、音乐:一切都突然数字化了,可以用来训练神经网络。今天,ImageNet【11】数据库拥有超过 1400 万张带标签的图像,世界各地的研究人员每年都用它来竞争建立最成功的图像检测和分类网络(稍后将详细介绍)。
然后,研究人员能够利用图形处理单元**(GPU)的惊人的并行处理能力来训练大型神经网络。你能相信赢得 2015 年和 2016 年 ImageNet 竞赛的分别有 152 层和 269 层吗?**
最后但同样重要的是,云计算为开发人员和研究人员带来了弹性和可扩展性**,允许他们根据培训需要使用尽可能多的基础设施……而不必长期构建、运行或支付费用。**
这三个因素的结合有助于神经网络实现其 60 年的承诺。
最先进的网络现在能够比任何人更快和更准确地分类图像(误差小于 3%,而人类为 5%)。像亚马逊 Echo 这样的设备能够理解自然语言并和我们交流。自动驾驶汽车正在成为现实。人工智能应用的列表每天都在增长。********
你不想添加你的吗?
Number of layers and error rate of ILSVRC winners
AWS 如何帮助您构建深度学习应用程序
AWS 提供了您开始构建深度学习应用程序所需的一切:
种类繁多的亚马逊 EC2 实例来构建和训练你的模型,随你选择CPU【13】GPU【15】甚至FPGA【16】。
深度学习亚马逊机器映像【17】,预装工具和库集合:mxnet【18】(AWS 官方支持),Theano,Caffe,TensorFlow,Torch,Anaconda 等等。
高级别的人工智能服务【19】用于图像识别(亚马逊识别)、语音转文本(亚马逊 Polly )和聊天机器人(亚马逊 Lex )。
选择权在你,开始吧帮助科学赶上小说!
新的希望?
人工智能每天都在进步。人们只能想知道接下来会发生什么!
机器会学习如何理解人类——而不是相反吗?
它们会帮助人类相互理解吗?
他们最终会统治世界吗?
谁知道呢?
无论发生什么,这些都将是奇妙明天的迷人故事。
注:这是我最近一次主题演讲的编辑稿。原始幻灯片可用 此处 。
时尚 DNA:零售世界中的结构特征映射
Image source: Zalando Research
当将人工智能应用于时尚世界时,其中涉及的服装和其他物品具有许多不同的个体属性,必须定义有意义的结构。
根据项目的相似性来定义它似乎是很自然的:每个项目在抽象空间中都有其明确的位置,相似的项目就在附近。在 Zalando Research ,他们创造了时尚 DNA ,通过收集目录中杂乱无章的信息并将其映射到一个抽象的数学空间——“时尚空间”,使他们的产品属性更容易理解。在那里,物品由一个向量,或者它的“DNA”来表示,并被用来给混乱的时尚产品集合带来秩序。
Zalando Research 的研究负责人 Roland Vollgraf 将参加在阿姆斯特丹举行的机器智能峰会,分享这一领域的专业知识。在 6 月 28 日至 29 日的峰会之前,我与他进行了交谈,以了解更多信息。
你能简单介绍一下你在 Zalando 的工作吗?
我是 Zalando 研究中心的首席研究员。我在机器学习和人工智能领域领导着一个由 15 名科学家组成的研究团队。
你认为是什么主导因素推动了机器学习在时尚行业的最新发展和应用?
很明显,在线零售业务中产生了大量的数据,再加上不断增长的计算能力(目前主要由现代图形处理器提供)。
时尚 DNA 现在或未来潜在的哪些应用最让你兴奋?
我们的时尚 DNA 是将时尚物品映射到数学上方便的欧几里得空间。因此,它为搜索或推荐等各种应用程序的分类提供了一个通用索引。然而,映射并不一致。我个人认为看到特征空间中的白点是最令人兴奋的,也就是说,在我们当前的文章都没有直接映射到的点上。在那里可以找到哪些假设的新鞋或裙子?
总体而言,您认为未来哪些行业会受到机器学习的最大干扰?
在我看来,在不久的将来,自动驾驶汽车将是最具颠覆性的人工智能技术。结果,这可能会让自己开车和拥有一辆车完全过时——我相信这种情况会彻底改变我们城市的面貌。
未来 5 年,我们可以期待看到时尚行业的哪些发展?
其中,将会有全新的面向客户的在线零售应用。想想更好、更智能的搜索体验,比如对话式搜索,允许在与系统对话时询问灵感。计算机视觉和图像处理技术深度学习的进步将允许虚拟试穿应用程序,用户拍摄的自拍可以用她在网上购买的任何类型的服装进行逼真的增强。
Roland Vollgraf 将在 6 月 28 日至 29 日在阿姆斯特丹举行的机器智能峰会上发表演讲,同时还有 自动驾驶汽车机器智能峰会 。会见领先的专家并向他们学习人工智能将如何影响交通、制造、医疗保健、零售等领域。
这项活动的门票有限。立即注册参加。
本次采访中表达的观点可能不代表 RE WORK 的观点。因此,有些观点甚至可能与 RE WORK 的观点相左,但发布这些观点是为了鼓励辩论和全面的知识共享,并允许不同的观点呈现给我们的社区。
时尚 MNIST 分类与 TensorFlow 特色 Deepmind 十四行诗
在这篇文章中,我们将看看如何使用 TensorFlow (TF)和 Deepmind 的十四行诗库在时尚 MNIST 数据集上执行一个简单的分类任务。
这篇文章也可以作为合作笔记本使用。请随意将笔记本复制到您的驱动器上,并修改代码。
我写这篇文章的目的有两个:
- 展示如何在一个简单的机器学习(ML)任务中使用 TF 提供的附加功能。
- 作为 Deepmind 的十四行诗库的一个简单入门示例。
大部分解释都是以代码中注释的形式出现的,所以可以考虑和文章一起阅读代码。这篇文章是在假设读者对 ML 和 TF 框架有基本了解的情况下撰写的。也就是说,我试图提供外部链接到所使用的技术术语。
首先让我们安装 sonnet。通过命令行进行简单的 pip 安装就可以了,但是要确保安装了 TensorFlow 并且版本> = 1.5
$ pip install dm-sonnet
假设安装了其他库,我们将导入所需的 python 库。
**[Out]**
Tensorflow version: 1.10.0-rc1
时尚 MNIST 数据集
更传统的 MNIST 数据集已经被过度使用到了一定程度(99%以上的准确率),不再是一个有价值的分类问题。 Zalando Research 为机器学习研究提供了一个新起点,在 28x28 的图像中捕捉 10 种不同的服装,而不是 10 个数字。这 10 种服装的各种变化构成了时尚 MNIST 数据集。
A Sample from the Fashion MNIST dataset (Credit: Zalando, MIT License)
使用Keras(tensor flow 的高级 API)我们可以通过一个函数调用直接下载时尚 MNIST。由于它相对较小(70K 记录),我们将把它直接加载到内存中。
预处理数据集
由于数据集是为 ML 研究手工制作的,我们不需要进行数据争论。我们需要的唯一预处理是均值居中和方差归一化。所得的数据分布将具有球形结构,导致梯度下降收敛的步骤数量较少。参考 LeCun,Yann A .等人的第 5.3 节“有效反推”关于为什么我们需要进行居中和归一化以实现梯度下降的更快收敛的精确解释。
**[Out]** Downloading data from [https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz](https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz)
32768/29515 [=================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 1s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step Training Data ::: Images Shape: (60000, 28, 28), Labels Shape: (60000,)
Test Data ::: Images Shape: (10000, 28, 28), Labels Shape: (10000,) Random 25 Images from the Training Data:
构建模型
使用 Deepmind 的十四行诗库,我们将建立两个模型,一个是简单的多层感知器(MLP),另一个是卷积网络。然后,我们将设置训练设备,以便在两个模型之间切换是一个简单的配置参数。
顺便说一下, Keras 是另一个高级 API,从 TF v1.9 开始,它就紧密集成到 TF 中。快速原型对于任何 ML 研究项目都是有用的,Keras 和 Sonnet 在这方面都非常有用。诚然,Keras 是一个更加成熟的项目,并且有 TF 团队的官方支持。此外,互联网上有大量的 Keras 教程和项目,再增加一个没有任何意义。另一方面,十四行诗很少在 Deepmind 之外使用,但对于任何跟踪他们的研究的人来说都是必须知道的。
深度思维十四行诗
Sonnet 是来自 Deepmind 的 TensorFlow 库,它抽象出了建模的过程。sonnet 的宗旨是将模型的组件封装为 python 对象(模块),然后可以在需要时插入到 TF 图中,从而为代码重用提供无缝机制。这样的设计让我们不必担心内部配置,如变量重用、重量共享等。有关详细指南,请参考他们的官方文档。此外,它们的源代码有很好的文档记录,值得一读,尤其是在尝试实现某些东西时。
在我们的例子中,我们将创建两个模块:FMNISTMLPClassifier
和FMNISTConvClassifier
。顾名思义FMNISTMLPClassifier
用的是 MLP,FMNISTConvClassifier
用的是卷积神经网络。然后,我们将在 TensorFlow 中设置训练设备,然后插入我们想要训练的模型。
组装训练器材。
训练器械包含以下部件:
- 数据通过输入管道输入到模型中
- 执行梯度下降的优化算法。
- 将由优化器优化的损失函数。
- 正在接受训练的模型。
输入管道
在 TensorFlow 中,向模型提供数据的首选方式是使用[tf.data](https://www.tensorflow.org/api_docs/python/tf/data)
模块。它允许我们以简单和可重用的方式对输入数据进行转换。tf.data
模块允许我们设计输入管道,比如聚合来自多个来源的数据,以可插拔的方式添加复杂的数据操作任务等。在这个例子中,我们展示了它的基本功能,鼓励读者浏览官方的指南。
我们希望输入管道具有以下三个属性:
- 能够在训练和测试数据集之间无缝切换,允许我们在每个时期后执行评估。
- 打乱数据集,以避免从磁盘上的数据排序中了解到意外的关联。
- 对随机梯度下降的数据集进行批处理。
在单个时期中,训练循环将包含覆盖整个数据集的多个小批量训练,然后是对测试数据集的准确度评估。
【计算机】优化程序
Adam(自适应矩估计)优化器是随机梯度下降的变体。在许多其他技术中,Adam 对每个参数使用自适应学习率。这允许与不常见的特征相关联的参数具有积极的学习率,而与常见特征相关联的参数具有低学习率。有关不同 SGD 优化器的详细说明,请阅读这篇精彩的帖子。
损失函数
对模型的输出执行 softmax 后,评估交叉熵损失。更多详情此处。
模型
这里我们将使用我们用 Sonnet 构建的模型。我们将设置培训,以便根据配置参数值交换两种型号(MLP 和康文网络)。
让我们把所有的组件放在一起。
**[Out]**
Epoch 1 ::: Training Time: 27.48s, Training Loss: 0.35541, Training Accuracy: 0.82533, Test Accuracy: 0.86060
Epoch 2 ::: Training Time: 26.22s, Training Loss: 0.27885, Training Accuracy: 0.88165, Test Accuracy: 0.88280
Epoch 3 ::: Training Time: 25.68s, Training Loss: 0.25212, Training Accuracy: 0.89918, Test Accuracy: 0.88710
Epoch 4 ::: Training Time: 25.82s, Training Loss: 0.21601, Training Accuracy: 0.91033, Test Accuracy: 0.89750
Epoch 5 ::: Training Time: 26.27s, Training Loss: 0.18370, Training Accuracy: 0.91778, Test Accuracy: 0.90500
Epoch 6 ::: Training Time: 25.84s, Training Loss: 0.19794, Training Accuracy: 0.92612, Test Accuracy: 0.89190
Epoch 7 ::: Training Time: 26.45s, Training Loss: 0.15230, Training Accuracy: 0.93163, Test Accuracy: 0.90500
Epoch 8 ::: Training Time: 25.84s, Training Loss: 0.15200, Training Accuracy: 0.93763, Test Accuracy: 0.90360
Epoch 9 ::: Training Time: 25.85s, Training Loss: 0.12375, Training Accuracy: 0.94403, Test Accuracy: 0.90550
Epoch 10 ::: Training Time: 26.06s, Training Loss: 0.11385, Training Accuracy: 0.95010, Test Accuracy: 0.91050
就是这样,我们训练了一个卷积神经网络模型,对时尚 MNIST 数据集进行分类,测试准确率 91.050% 。要训练基于 MLP 的模型,只需在train
函数调用中将'conv'
改为'mlp'
。
这篇文章的完整代码可以在 GitHub 上找到:
参考
时尚-MNIST 与深度学习工作室:一种不墨守成规的方法走向深度学习
随着你成为深度学习或机器学习的实践者,你会看到由 1998 年 Yann LeCun 引入的 10 类手写数字组成的 MNIST 数据集在科学论文、博客帖子等中反复出现。
MNIST 如此受欢迎的原因与其规模有关,它允许深度学习和机器学习从业者快速检查和原型化他们的算法。所有机器学习库(例如 scikit-learn)和深度学习框架(例如 TensorFlow 、 Pytorch )都提供了开箱即用的 MNIST 助手函数和便利示例,这也是对这一点的补充。
MNIST Dataset
但是,现在扎兰多研究正在谈论用时尚-MNIST 取代 MNIST。原因如下所列:
- MNIST 太容易了。查看我们的并行基准测试。和“大多数 MNIST 数字对仅通过一个像素就可以很好地区分出来”
- MNIST 被滥用了。看看“伊恩·古德菲勒希望人们远离 mnist。”
- MNIST 不能代表现代 CV 任务。查看“弗朗索瓦·乔莱:关于 MNIST 的想法不会转移到真实的简历上。”
让我们更多地谈论时尚-MNIST。时尚-MNIST 是 Zalando 文章图像的数据集——由 60,000 个样本的训练集和 10,000 个样本的测试集组成。每个示例都是 28x28 灰度图像,与 10 个类别的标签相关联。Zalando 打算将时尚 MNIST 作为原始 MNIST 数据集的直接替代,用于机器学习算法的基准测试。它共享训练和测试分割的相同图像大小和结构。
下面是数据的一个例子(每个类有三行):
Fashion-MNIST Dataset
关于时尚 MNIST 的背景历史已经讲得够多了,是时候从理论跳到实践了。在这篇文章中,我将向整个深度学习社区演示如何使用时尚-MNIST 数据集和 深度学习工作室 ,一个由深度认知(从根本上改变了深度学习的完成方式)创建的深度学习平台。我很快就能够上传时尚-MNIST 数据集、训练卷积神经网络模型和使用 WEBAPP 部署模型。
“信息:我根据深度学习工作室准备的时尚-MNIST 数据集在我的 GitHub 存储库中可用,所以你们也可以从那里下载数据集”
步骤 1:项目创建
当我登录到运行在云中的 Deep Learning Studio 后,我点击了+按钮来创建一个新项目。
步骤 2:数据集分割
我将不同服装的 70,000 幅图像的整个数据集分别分成 80%、10%、10%的训练集、验证集和测试集,并将内存中的加载数据集设置为“完整数据集”。相同的图像如下所示。
70,000 个示例被分配到以下标签之一:
步骤 3:创建卷积神经网络
然后,我创建了一个卷积神经网络,如下图所示,只需简单地拖放层。
信息:如果你们中的任何人对模型背后的代码感兴趣,可以在我的 GitHub 库中找到,相同的链接可以在参考资料部分找到。
步骤 4:超参数调整
我保持纪元编号=100,批量=512,损失函数为分类交叉熵
步骤 5:训练模型
在调整超参数之后,我开始训练我的模型,并且在训练我的 CNN 模型之后,我得到了 0.9513 的训练精度、0.9272 的验证精度、0.1357 的训练损失和 0.2025 的验证损失
训练损失、训练准确度、验证损失和验证准确度的单独图表如下所示:
第六步:推理
推断是使用训练模型来推断/预测测试样本的阶段,包括与预测值的训练类似的正向传递。与训练不同,它不包括反向传递来计算误差和更新权重。这通常是一个生产阶段,在此阶段,您部署模型来预测真实世界的数据。而深度学习工作室只需点击一下,就可以轻松完成这一切推理阶段。
Inference
步骤 7:部署模型
Deep Learning Studio 的这一特性是独一无二的,因为它允许我以 WEBAPP 的形式访问我部署的模型。
Deploying Model as WEBAPP
在我单击 Deploy 并向实例提供服务名之后,就会生成一个 URL。然后,我看到我的模型通过预测不同的时尚服装图片发挥作用。
1. choose file
2. giving the prediction
所以,这就是如何使用时尚 MNIST 和深度学习工作室,我能够在我的 CNN 模型上获得 95%的准确率。既然现在你们都知道我是如何从上到下执行这个项目的每一个步骤,因此通过这篇文章,我想鼓励我所有的读者、深度学习/机器学习实践者和爱好者提出自己的模型或使用相同的模型,并在其上发布 LinkedIn 或 twitter 帖子(** 但不要忘记标记我:)或 深度认知 **),甚至写一篇关于它的文章来分享你的结果,与整个人工智能社区分享。我将急切地等待你的帖子。
感恩时间:如果没有来自 Mahesh Kashyap 和 deepcognition.ai 社区的持续和智力支持,这一切都是不可能的。因此,向 Deep Cognition 团队致敬,他们付出了巨大的努力来创建一个改变游戏规则的最简单的深度学习平台。
参考资料:
- 代码和时尚 MNIST 数据集可以从我的 repo 这里获取。
- 要通过视频教程了解更多关于深度学习工作室的信息,请查看此处的。
- 如果你想阅读更多关于深度学习工作室的文章,作者不是别人,正是法维奥·巴斯克斯点击这里。
- 如果你有兴趣阅读 Zalando 时尚研究-MNIST 发表的论文,请点击这里查看。
感谢您的关注
你利用你的时间阅读我的作品对我来说意味着一切。我完全是这个意思。
如果你喜欢这个故事,那就疯狂鼓掌吧👏 ) 按钮!这将有助于其他人找到我的工作。
还有,跟我上 中**Linkedin如果你想!我很乐意。**
Fast.ai 深度学习课程 Part1 个人学习笔记分享
我想向大家推荐由杰瑞米·霍华德教授的深度学习课程 fast . ai(Kaggle 连续两年的头号竞争对手,Enlitic 的创始人)。了解如何在不需要研究生水平的数学知识的情况下构建最先进的模型——但也不降低任何东西的质量。哦,还有一件事…它是完全免费的!
可以查一下网址: www.fast.ai
我已经花了大约 7 周的时间学习 fastai 课程第一部分,每当我完成一课,我都写下学习笔记,以巩固该课的知识,正如杰里米所说,学习一课的最佳方式是教别人理解该课。这样你就要搞清楚一个概念,确定自己的理解是正确的。另一方面,学习笔记对那些准备学习这一课的人来说是一个完美的建议,告诉他们可能会陷入的困境,或者帮助他们澄清一些令人困惑的概念。
这就是为什么我想与大家分享我的学习经验,告诉他们你将在这一课中学到什么,解释一些困惑,帮助他们开始。
学习笔记由四部分组成:
1 .简报:你要学的东西;
2。任务:你在编码实践中要做什么;
3:重要概念解释:用直白的话解释一些容易混淆的概念。
4。核心代码演示:我实现了 nbs 课程中的代码,并从头重写了它们,修复了一些小错误,并解释了一些重要的代码。我实现了 nbs(笔记本的简称)几乎 90%的代码,因为最初 nbs 的某些部分只是为了解释。
非常抱歉,我用中文写了这些笔记。
我用我的母语写笔记——中文会快得多,也许有一天我会把它们翻译成英文,但 python 是国际化的,如果你忽略中文单词,只关注代码,也许你会知道我想说什么(好吧,那是废话,用谷歌翻译就行了)。
表:
1。第 2 课——猫 vs 狗,使用 vgg16 模型 12。第 3 课—避免过度装配和装配不足的一些技巧
3。第 4 课—第一部分—关于 CNN 的更多细节,在 keras
4 中从头开始构建 CNN。第四课——第二部分——协同过滤和推荐系统
5。第 5 课— NLP 任务,单词嵌入
6。第六课——RNNs 和 LSTM,简单的 RNN 在第号
第七课。第 7 课——图像分类中的核武器(ResNet、InceptionV3 和 FCN)1
第 7 课对我来说是最激动人心的一课,这是我见过的最酷的东西,我等不及要学习第 2 部分了!
如果你对我的笔记有什么建议,请告诉我,我很乐意听到,希望你们喜欢!
原文链接: 学习笔记分享自 forums.fast.ai
天空中的眼睛——使用迁移学习和数据增强的图像分类
很快。人工智能深度学习第一部分
“Side shot of a fighter jet speeing through the air.” by Dan on Unsplash
成为一名战斗机飞行员是我童年的梦想,看着飞机直到它们离开我的视线仍然是一件令人兴奋的事情。当我在考虑一个数据集,开始应用我从 fast.ai 学到的计算机视觉知识时,这就是我玩它们的动机。
这是我的系列的第一部分快。艾深学 。对于那些不知道的人来说, fast.ai 是一门关于深度学习的在线课程,由前 Kaggle 总裁和#1 竞争对手 Jeremey Howard 教授。在我完成了 Andrew NG 在 Coursera 上的深度学习专业化之后,我觉得他自上而下的方法是一个完美的补充。
我将给出飞机与直升机分类的端到端实现,让我们看看 CNN 架构如何区分机翼与桨叶。完整的执行代码可以在 github 上找到。
1.数据准备
我想到不使用任何现有的数据集,所以我自己从谷歌上下载了图片。我用过*火狐的谷歌图片下载器,*这是一个下载图片的便捷扩展工具。我还发现这个 python 包对于自动处理多个标签非常有用。总共有 216 架飞机和 350 架直升机,让我们看看数据集中的样本图片。
我们的数据集看起来足够多样化(至少飞机),图片范围从常规客运航班、螺旋桨、战斗机、玩具飞机、战斗直升机和巨大的搬家工人。让我们看看我们的 NN 如何对付他们。
2.带 ResNet34 的快速模型
我们将使用 ResNet34 预训练模型,它赢得了 2015 年的 ImageNet 竞赛。由于 ImageNet 包含多样化的点击图片,这种架构将很好地适合这个问题。你可以通过这篇优秀的文章来解码 ResNet 架构,其基本理念是使用更深层次的网络,而不会经历收敛方面的退化。
“你不应该使用较小的网络,因为你害怕过度适应。相反,你应该在你的计算预算允许的情况下使用尽可能大的神经网络,并使用其他正则化技术来控制过拟合”
利用 5 个时期、8 的批量大小和 0.01 的学习率,我们能够实现大约 90%的准确度。
Accuracy after training for five epochs
2a。分析结果
Most correctly classified planes
Most correctly classified helicopters
Most incorrectly classified planes
Most incorrectly classified helicopters
Most uncertain predictions
虽然有些飞机很难辨认(着火的那架和‘希思罗’那架),但分类错误的直升机似乎和正确的没什么区别。
3.学习率探测器
学习率决定了您希望更新权重的快慢。虽然对于像我们这样的小数据集(~500 张图像),这没有多大关系,但是学习速率会显著影响模型性能/收敛。
我们将使用论文中开发的技术,用于训练神经网络的循环学习率,其中我们简单地从最小值开始增加学习率,直到损失停止减少。根据下面的图,我们将使用 1e-2 的 LR。
Left: Increasing learning rate every iteration. Right: Identifying the learning rate where there is still a decreasing loss
4.数据扩充
如果我们为更多的时期训练模型,它将开始过度拟合(训练损失变得更少,而验证损失不会)。该模型将开始学习特定于这些数据点的特征,而不是进行归纳。为了克服这一点,我们将使用数据扩充来创建更多的数据。对于这个问题,我们将使用水平翻转和缩放(高达 1.1 倍)。确保你做了相关的增强——对于字母/数字,任何翻转都没有意义,而对于卫星图像,我们可以根据需要翻转和旋转图像。
Augmenting through horizontal flipping and zooming
我们可以看到,通过这个增广数据后,准确率提高到了 92.3%。请注意,我们仍然使用预训练的权重,并且只训练最终的 FC 层。
Accuracy after 5 epochs with augmentation
5.微调以及差分学习速率退火
**学习速率退火:**虽然我们发现 1e-2 是理想的学习速率,但我们实际上已经开始使用它,并随着训练的进行逐渐降低它。这是因为,随着我们越来越接近最佳体重,我们应该迈出更小的步伐。
**带重启的随机梯度下降:**使用上述技术一个历元周期,我们将从 10e-2 再次重启学习速率并继续该过程。这背后的想法是鼓励我们的模型跳出这个最优空间,找到(如果有的话)一个稳定准确的最优空间。将这两者结合起来,学习率就像这样增长—
SGDR: Each cycle corresponds to one epoch
**解冻预训练层:**现在,由于我们已经训练了足够多的最终层,我们将解冻预训练的 ResNet 层并对其进行微调。由于这些层已经在 imageNet 照片上进行了训练,并且初始层将具有更多通用功能,因此我们将使用不同的学习速率来仔细调整它们。因此,初始层将像以前一样使用 1e-4,中间层使用 1e-3,FC 层使用 1e-2。
Final Accuracy after 3 cycles with 1 epoch, 2 epoch and 4 epoch each
我们看到准确率没有太大变化,但提高到了 93%。我们仍然看到验证损失是 0.21,而训练损失是 0.12,我觉得还有改进模型的空间,但我们现在就到此为止。我认为有更多种类的飞机,但没有足够的例子来学习这些特征(这就是为什么我认为我们看到下面很多飞机被错误分类)。
**测试时间增加:**这是在验证/测试时使用增加功能的一个很好的方法。TTA 不仅对你的验证集中的图像进行预测,还对它们的几个随机增强版本进行预测。然后,它从这些图像中提取平均预测值,并加以利用。**我们实现了 94.4%的准确率,**考虑到这种简单而有效的技术,这是一个相当不错的进步。
6.分析最终结果
查看混淆矩阵,有 7 架飞机被预测为直升机(这些似乎是初始模型本身之后不正确的),我们在预测直升机方面做得很好。也许有了更多的飞机图像,我们可能会达到更高的精度。
Final most incorrect aeroplanes
Final incorrect helicopter
非常感谢你一直读到最后。我们已经使用迁移学习、数据增强和差分学习速率退火对飞机和直升机进行了分类,在一个小数据集(~500 张图像)的情况下,达到了 94.4%的相当不错的准确度。如果你喜欢,请鼓掌并分享,如果有任何不清楚或可以改进的地方,也请在评论中告诉我。
代号:https://github.com/murali-munna/deep-learning-fastai
要了解数据科学初学者的实用技巧,请查看这篇文章。
当我开始我的旅程和我现在的位置时,我通过职业经历学到了很多东西…
towardsdatascience.com](/practical-tips-for-beginners-in-data-science-debunking-few-myths-30537117a4e4)
在LinkedIn上联系我
Google Colab 上的 Fast.ai 第一课(免费 GPU)
在这篇文章中,我将演示如何为 fastai 使用 google colab。
关于谷歌可乐的一点…(https://colab.research.google.com/)
Google colab 是 Google 内部的数据科学研究工具,已经有一段时间了。他们早些时候向公众发布了该工具,其崇高目标是传播机器学习教育和研究。虽然已经有一段时间了,但有一个新功能会引起很多人的兴趣。
一次可以免费使用 GPU 作为后端 12 个小时。
GPU 计算免费?你在开玩笑吗?
这些是我脑海中立即闪现的问题,我试了一下。事实上,它工作得很好,非常有用。请仔细阅读本次讨论,了解关于此次发布的更多细节。讨论中的几个要点。
- 后端使用的 GPU 是 K80(此时此刻)。
- 12 小时的限制适用于 VM 的连续分配。这意味着我们可以通过连接到不同的虚拟机来使用 GPU 计算,即使在 12 小时结束后也是如此。
Google Colab 有很多不错的功能,协作是其中一个主要功能。我不打算在这里介绍这些特性,但这是一个很好的探索,尤其是当你和一群人一起工作的时候。
因此,让我们开始使用 fastai 和这项服务。
入门指南
- 你需要注册并申请访问权限,才能开始使用 google colab。
- 获得访问权限后,您可以使用“文件”->“上传笔记本”来上传笔记本。我已经上传了第一课的笔记本。请访问本笔记本以供参考。设置单元格将在共享笔记本中可用。
- 为您的笔记本电脑启用 GPU 后端。运行时->更改运行时类型->硬件加速器->GPU。
- 要交叉检查是否启用了 GPU,您可以运行共享笔记本中的第一个单元。
Cross Check to see if GPU is enabled
安装 Pytorch
由于默认环境没有 Pytorch,我们必须自己安装它。请记住,每次连接到新虚拟机时都必须这样做。所以不要删除单元格。
Installing Pytorch
安装 fastai
fastai 也一样。我们将使用 pip 来安装 fastai。
Installing fastai
除此之外,还有一个缺失的库 libSM,所以我们必须安装它。
下载数据
我们可以下载猫和狗的数据集,并使用几个 bash 命令对其进行解压缩
Downloading Data
完成这些步骤后,我们就可以在 Google Colab 上学习第一课了。在我们庆祝之前让我们讨论一些问题。
过程顺利吗???
目前还没有。但这是意料之中的。我们来看一些小问题。
- 当试图连接到 GPU 运行时,它有时会抛出一个错误,说它不能连接。这是由于大量的人试图使用这项服务,而不是 GPU 机器的数量。根据之前分享的 kaggle 讨论,他们计划添加更多的 GPU 机器。
- 有时,运行时只是间歇性地死亡。这可能有许多潜在的原因。
- 可用的内存容量大约是 13GB,这对于空闲的内存来说太好了。但是对于像第 1 课中的 resnet 这样的大型网络,大多数时候都会出现内存警告。当用解冻和不同的学习率尝试最终的完整网络时,我几乎总是遇到问题,我怀疑是由于内存。
结论:
谷歌确实在帮助降低深度学习的准入门槛。而像这样的工具,会帮助很多买不起 GPU 资源的人。我真的希望这将是一个全面的服务很快,并保持免费。
我会继续更新这个帖子,因为我想出了如何处理这些小问题,并使这个过程顺利。如果有人能够解决这些小问题,请在评论中告诉我。