TowardsDataScience 博客中文翻译 2019(一百六十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

来自潜在空间的鼓形图案

原文:https://towardsdatascience.com/drum-patterns-from-latent-space-23d59dd9d827?source=collection_archive---------11-----------------------

打击乐节拍以及在哪里可以找到它们

TL;DR: 我收集了一个大型的鼓模式数据集,然后使用神经网络方法将它们映射到一个潜在的可探索空间,其中有一些可识别的流派区域。试试互动探索工具或者下载几千个独特生成的节拍

背景概述

近年来,有许多项目致力于神经网络生成的音乐(包括鼓模式)。一些这样项目使用一个潜在空间的显式结构,其中每个点对应一个旋律。这个空间可以用来研究和分类音乐结构,以及产生具有特定特征的新旋律。有些人使用不太复杂的技术,如“语言模型”方法。然而,我无法找到映射到 2D 空间的典型节拍模式的整体表示,所以我决定自己创建一个。

下面,我列出了我在开始自己的工作之前设法找到并分析的相关项目:

  • LSTMetallica —作者使用语言模型方法来预测节拍中的下一步。
  • neuralbeats —另一个语言模型项目,与 LSTMetallica 非常相似。
  • Magenta VAE——谷歌的 Magenta 是音乐生成和增强的有趣模型和项目的伟大来源。特别是 2016 年他们发布了 drum_rnn 型号,2018 年 3 月又发布了 music_vae 型号。从那以后,很多项目都使用了这些模型。
  • 例如,去年 Tero Parviainen 基于 drum _ rnn+magenta . js+tensor flow . js+tone . js 创建了一个非常棒的在线鼓点发生器
  • Beat Blender 是另一个基于 Magenta 的项目(在 NIPS 2017 上首次亮相)。这与我想做的非常相似,然而,作者没有建立不同流派的概览图,而只是在成对的模式之间建立了一个插值空间。
  • 最后但同样重要的是,还有我的另一个项目,神经网络 RaspberryPi 音乐盒,它使用 VAE 空间生成源源不断的类似钢琴的音乐。

数据集构建

我发现的大多数项目都使用手动选择和清理的节拍模式的小数据集,例如 GrooveMonkee free loop packfree drum loops collectionAQ-Hip-Hop-Beats-60–110-BPM

这对我的目标来说还不够,所以我决定从网上的大量 MIDI 收藏中自动提取节拍模式。我总共收集了大约 200K 的 MIDI 文件,然后只保留了那些具有非平凡的第 9 通道(根据 MIDI 标准的打击乐器通道)的文件,所以还剩下大约 90K 的轨道。接下来,我做了一些额外的过滤,基本上与 neuralbeats 和 LSTMetallica 项目中实现的方式相同(我使用了 4/4 拍号,并对乐器子集进行了量化和简化)。

然后,我根据长时间的停顿将曲目分成独立的块,并搜索连续重复至少 3 次的长度为 32 步的模式——为了加快过程,我使用了哈希和一些简单的贪婪试探法。最后,我丢弃了熵值太低的琐碎模式,并检查了每个模式在所有可能的相移中的唯一性。最终,我的收藏中有 33K 个独特的图案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

some examples of distilled patterns

我使用了一个简单的方案来编码每个模式:一个模式有 32 个时间刻度,有 14 种可能的打击乐器(经过简化),所以每个模式可以用 32 个整数来描述,范围从 0 到 16383。

您可以在此下载 TSV 格式的数据集:

  • 第一列保存模式代码(32 个逗号分隔的整数)。
  • 第二列是这个模式在潜在 4D 空间中的点(4 个逗号分隔的浮点值),见下面的细节
  • 第三列是从潜在空间到 2D 投影的 t-SNE 映射(2 个逗号分隔的浮点值),详见下文

神经网络

我使用 pytorch 框架构建了一个网络,其中有一个 3 层 FCN 编码器,将节拍矩阵(32*14 位)映射到 4D 潜在空间,还有一个与编码器大小相同的解码器。第一个隐藏层有 64 个神经元,第二个有— 32 个。我在层间使用 ReLU 和一个 sigmoid 将解码器输出映射回位掩码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我尝试并比较了两种不同的潜在空间平滑技术, VAEACAI :

  • 标准 VAE 产生了足够好的结果,空间映射清晰而有意义,
  • ACAI 空间看起来平滑得多——它更难可视化,但更好取样(见下面的细节)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The METAL beats area on the VAE space projection (left) and the ACAI space projection (right)

鼓代

我用标准逻辑生成了一个随机节拍:从潜在空间中随机抽取一个点,然后用解码器将这个点转换成节拍模式。你也可以从潜在空间的特定区域采样点,以获得该区域特定风格的典型节拍。使用我用来构建数据集的同一套过滤器对产生的模式进行了过滤(参见上面的详细信息)。

VAE 生成的节拍质量约为 17%,换句话说,平均六分之一的生成节拍成功通过了过滤器。在 ACAI 的例子中,质量明显更高——大约 56%,所以超过一半的生成模式通过了过滤器。

我使用每种方法生成了 10K 节拍并发布了它们(格式类似于主数据集文件格式):

也可以下载这些生成的图案制作的 MIDI 包: sampled_vae_midi.zipsampled_acai_midi.zip

空间可视化

我使用 VAE 空间进行可视化,因为它有更清晰的视觉结构。基于该空间的 t-SNE 投影来放置点。一些最初收集的 MIDIs 在文件名中有流派标签,所以我用这些来定位和标记具有特定流派的模式的区域。

我基于 jQueryremodalMIDI.js (带有一个重新编码的 GM1 打击乐声音字体)库构建了可视化器。您可以探索训练集模式的 3K 子集(灰点)+大约。500 个生成的图案(红点)。

试试这里的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决斗深度 Q 网络

原文:https://towardsdatascience.com/dueling-deep-q-networks-81ffab672751?source=collection_archive---------4-----------------------

DQN 家族

用于深度强化学习的决斗网络架构

回顾和介绍

让我们先回顾一下一些重要的定义,然后再看 DQN 论文。这些大部分应该都不陌生。

  • 给定代理的策略π,动作值和状态值分别定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 上面的 Q 函数也可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 优势是通过用 V 值减去 Q 值获得的量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回想一下,Q 值表示在给定状态下选择特定动作的值,V 值表示不管采取什么动作都给定状态的值。然后,直观地,优势值显示了在给定状态下选择一个动作相对于其他动作有多有利。

什么变化和动机

  • (王等)提出了新颖的决斗架构,它通过两个独立的流明确地分离了状态值和依赖于状态的动作优势的表示。
  • 这种架构背后的关键动机是,对于一些游戏来说,没有必要知道每个动作在每个时间步的值。作者举了一个 Atari 游戏 Enduro 的例子,在这个游戏中,在碰撞即将发生之前,不需要知道应该采取什么行动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Atari Enduro. Source: https://gfycat.com/clumsypaleimpala

  • 通过显式分离两个估计器,决斗架构可以了解哪些状态是(或不是)有价值的,而不必了解每个状态的每个动作的效果。就像 Enduro 的例子一样,这种架构在一些任务中变得尤其重要,在这些任务中,行动可能并不总是以有意义的方式影响环境。

体系结构

像标准的 DQN 架构一样,我们有卷积层来处理游戏帧。从那里,我们将网络分成两个独立的流,一个用于估计状态值,另一个用于估计依赖于状态的动作优势。在这两个流之后,网络的最后一个模块组合状态值和优势输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dueling Architecture, Source: https://www.freecodecamp.org/news/improvements-in-deep-q-learning-dueling-double-dqn-prioritized-experience-replay-and-fixed-58b130cc5682/

现在,我们如何组合/聚合这两个值呢?

将两个值相加似乎很直观,从优势值的定义中可以立即看出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,作者提出了关于该方法的两个问题:

  1. 假设和分别给出状态值和动作优势的合理估计是有问题的。因此,天真地将这两个值相加是有问题的。
  2. 两者的简单和是“不可识别的”,因为给定 Q 值,我们不能唯一地恢复 V 和 A。Wang 等人的实验表明,这种可识别性的缺乏会导致较差的实际性能。

因此,神经网络的最后一个模块实现了如下所示的正向映射:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将迫使最大化动作的 Q 值等于 V,解决了可识别性问题。

或者,如在王等人的实验中所使用的,我们也可以使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我们根据以下因素选择最佳行动a*:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

培养

因为决斗架构与标准 DQN 架构共享相同的输入输出接口,所以训练过程是相同的。我们将模型的损失定义为均方误差:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并采取梯度下降步骤来更新我们的模型参数。

履行

所以,我们将通过决斗 DQN 的实施。

1.网络架构:如上所述,我们希望将状态相关的动作优势和状态值分成两个独立的流。如上所述,我们还使用正向映射来定义网络的正向传递:

2.接下来,我们将实现更新功能:

除此之外,标准的 DQN 建筑没有什么变化;关于完整的实现,请查看我的香草 DQN 邮报,或者我的 Github 库:

[## cy oon 1729/深度 Q 网络

Q-learning 家族(PyTorch)算法的模块化实现。实现包括:DQN,DDQN,决斗…

github.com](https://github.com/cyoon1729/deep-Q-networks)

参考

地下城和骰子

原文:https://towardsdatascience.com/dungeons-and-dice-8e326a6fcae4?source=collection_archive---------44-----------------------

桌面角色扮演游戏中随机性、多武装匪徒和数字表征的思考

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Images from Pixabay and https://www.flickr.com/photos/lobsterstew/5508435832

你经常会发现自己和一些好伙伴在一起,并准备好和一些兽人(或者人类,无论你喜欢哪个)战斗,但是,唉,你没有骰子。

通常这个问题会因为不仅需要 6 面模具 D6 ,而且需要所有剩余的柏拉图立体D4D8D12****D20而变得更加严重。D10 有时也被卷入其中。我见过很多解决这个问题的方法,从在纸上写数字然后从盒子里画出来,到地下城主编数字。前者的问题是需要更多可能不在身边的材料,后者是全球机制可能有偏见。

也许他/她希望冒险者成功,或者相反不要太快杀死那个超级酷的怪物。尽管转基因并不意味着它会发生,但一些偏见可能会在潜意识中潜入,破坏所需的随机性。你会接受你的角色因为总经理在激烈的战斗中脱口而出错误的数字而被杀死吗?

一个解决方案是让其中一个玩家在总经理说一的同时说一个数字,然后将他们按骰子大小相加(并加一)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Adding modulo D12 is similar to adding hours on a clock. For example 9+5 mod 12 = 2. Image from pixabay.

但是这真的是一个好的解决方案吗?我们怎么知道它是不是呢?进入伪随机数发生器(PRNGs)的理论。

伪随机数发生器

产生随机性的问题是一个古老的问题。1946 年,约翰·冯·诺依曼在研究原子弹时发现自己需要大量的随机数来进行蒙特卡罗模拟。在蒙特卡罗方法中,人们利用随机性来进行计算。最简单的例子是在正方形内画一个四分之一圆。把沙粒随意扔向图画。计算圆内的颗粒数,除以总数,乘以 4,瞧,你已经用蒙特卡罗方法计算出圆周率了。

seq = [random.randint(0,100) for x in range(200)]
rand_coords = list(zip(seq[::2], seq[1::2]))sum(1 if math.sqrt(x**2+y**2)<=100 else 0 for x,y in rand_coords)*4/len(rand_coords)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

200 grains of sand. Pi = 3.24 in this calculation. More grains makes it more exact.

冯·诺依曼在他的工作中发明了中间的平方方法,可以表述为:取一个种子,比方说 4 位数长,平方它,提取中间的 4 位数,它就成为下一个种子。例如:

8524 -> 72658576 -> 6585 -> 43362225 -> 3622

看起来很随意,但是真的吗?序列 777777 是随机的吗?它在 10⁶发生的几率是 1,但另一方面,758336 也是如此。

检查随机性是一个重要的问题,为此已经设计了许多方法。我们将看看其中的一些。

视觉分析

检查某件事是否不是随机的一种方法是寻找模式。事实证明,人类的视觉皮层在这方面相当擅长,让我们画一个中间的正方形序列:

def plot_rand(seq):
    dim = int((seq.size)**(1/2))
    seq = seq[:(dim**2)].reshape(dim, dim)
    plt.imshow(seq)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你所看到的,它开始时很好,但是过了一会儿就陷入了一个循环。冯·诺依曼知道这可能发生,但他没有其他方法可以快速产生大量的伪随机数。他说,当它陷入循环时,它至少会以一种明显的方式失败。

让我们试试另一个:

plot_rand([(x**2-3*x)%10 for x in range(300)])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

似乎我们已经找到了抽象艺术的一个很好的来源。当然,由于剩余力量的周期性,我们相当有限。

后来,比中间正方形更好的方法被发明了,但是领域被问题困扰。一个例子是 IBMs 杜然算法。乍一看,它似乎能产生很好的随机数,但这是一种错觉。事实上,情况非常糟糕,以至于唐纳德·克努特(Donald Knuth)将它描述为“真正可怕的”,由于 20 世纪 70 年代初杜然的广泛使用,当时的许多结果被视为可疑。

另一个例子是 PHP rand()。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from random.org

拥有糟糕的随机数生成器可能会产生一些非常可怕的后果,因为它们被用于为 SSL 协议生成密钥。能够猜出生成器将要产生的下一个数字的攻击者将能够解密所发送的消息。

但是上面描述的让两个人同时说出数字的方法效果如何呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对我来说很随机,第一次测试通过了。

科尔莫戈罗夫

看待随机性的另一种方式是它很难描述,而有序却很容易描述。

因此100011010111100101110看起来比11111111100000000更随机,因为后者可以描述为 **[1]10 + [0]10 ,但前者更难找到压缩形式。

这是安德雷·柯尔莫哥洛夫的想法,为了纪念他,这个概念被命名为 Kolmogorov 复杂性。

让我们尝试以上述方式压缩我们的序列。

def compress(string):
    return ''.join((char + str(sum(1 for _ in group)).replace('1','')) for char, group in groupby(string))

*在上面的代码中,我们只处理了最简单的一个字符的情况,因此例如 10101010 不会被该算法压缩。更好的压缩算法留给读者作为练习。

400 的 radom.randint()被压缩到 395,而两人的数字得到 390。够接近了,第二次测试通过。

卡方检验

卡方检验是一种确定拟合优度的方法。即:零假设符合观察到的行为的概率是多少。如果我随机选择一串数字 0-9,我的无效假设是每个数字都以 10%的频率出现。

让我们把我们的序列放入卡方检验。

chisquare([v/len(seq) for k,v in Counter(seq).items()], [.1]*10)

random.randint()得出的卡方值为 0.03。我通过捣碎按钮生成的随机序列 ges a 0.12,所以不完全随机。来自两个按钮捣碎序列的序列得到了 0.04,我认为这是非常好的。每第五个位置有“1”的随机序列得到 0.38。

但这里感兴趣的不仅仅是数字的分布。我们还对二元组感兴趣,那就是:两个连续的数字。数字 1-9 可能以均匀分布的方式出现,但也许两个数字“29”比“23”出现得更频繁,因为我在生成数字时使用两只手,并且倾向于在它们之间交替。三元组和更高的也可以尝试。

当用二元模型测试时,random.randint()得到 0.2,我的按钮 mashing 得到 1.28,我们添加的序列得到 0.34,每第 5 个位置有“1”的随机序列得到 4.45。

不完美,但足够接近,第三次测试通过。

圆周率

我们当然可以使用上面描述的蒙特卡罗方法,但是要反过来。因为我们知道圆周率应该是多少,PRNG 越接近越好。

我们得到 2.96。不完全是圆周率,但其中一个原因是我们只有整数 0-9。在这种情况下,random.randint(0,9)得出 2.9。

第四次测试通过。

顽固的测试

顽固测试是 1995 年在随机数字光盘上首次发现的一系列测试。它们对 10000 长的随机序列效果更好,这里就不用了。

多股武装匪徒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A multi-armed bandit situation. From https://www.inverse.com/article/13762-how-the-multi-armed-bandit-determines-what-ads-and-stories-you-see-online

虽然这一切看起来都很好,但可能仍然有一个小问题。聪明的玩家会注意到 GM 生成的数字不是随机的,而是遵循一种模式,一种可能被滥用的模式。

除了听起来像是角色扮演游戏冒险中的人物之外,一个多臂强盗实际上是强化学习中的一个问题。假设你有一个吃角子老虎机,又名单臂强盗,但这个有几个手臂。他们都有不同的支付率,你不知道。你必须一边走一边想办法,同时努力实现利润最大化。像往常一样,在强化学习中,当你做出正确的决定时,你通过获得奖励来学习该做什么。

这个概念的一个延伸是上下文多武装匪徒(CMAB)问题,其中你也看上下文,例如一天中的时间。

让我们使用上下文强盗库将我们的情况建模为一个 CMAB。上下文是以前的数字,每当我们的算法选择一个高于平均值的数字,它就会得到奖励。我们的特定算法是 Bootstrapped Thompson 采样,这是一种使用 Beta 分布确定每个动作正确的概率的算法。

def run_bandit(seq, nchoices, reward_func):
    base_algorithm = LogisticRegression(random_state=123, 
                                        solver='lbfgs')
    beta_prior = ((3, 7), 2) model = BootstrappedTS(deepcopy(base_algorithm), 
                           nchoices = nchoices, 
                           beta_prior=beta_prior) r_hist = []
    a_hist = []
    X_hist = [] model.fit(X=np.array([[0]]), a=np.array([0]), 
              r=np.array([0])) for X,y in ngram(seq, 2):
        a = model.predict(np.array([[int(X)]]))[0]
        a_hist.append(a)
        X_hist.append([int(X)])
        r = reward_func(a,y)
        r_hist.append(r)
        model.fit(X=np.array(X_hist), a=np.array(a_hist), 
                  r=np.array(r_hist))

    return r_hist np.mean(run_bandit([random.randint(0,9) for x in range(200)], 10, lambda a,y: 1 if (a+int(y))%10 >= 5 else 0))

结果是:

对于 random.randint(),该算法平均获得 0.51 分

对于 GM 生成的序列,该算法平均得到 0.63 分。

可以看出,该算法实际上学会了滥用由 GM 创建的序列中的规则。

奖励 1:石头剪刀布

同样的方法也可以用来赢得石头剪刀布,顺便说一下,只要使用 nchoices=3 和不同的奖励函数。尝试:

np.mean(run_bandit(sequence, 3, lambda a,y: 1 if int(a) == (int(y)+1)%3 else 0))

虽然这看起来很糟糕,但人们必须记住,人类不是计算机。人类不太可能像我们的算法那样利用序列中的小规律。

我们通过了吗?我想应该由你来决定。你的角色扮演聚会包括雨人或者有类似能力的人吗?如果不是,我会说这是一个通行证。

额外收获 2:数字的表示

一个并非完全无关的问题是向总经理传达数字。通常的情况是,在 GM 掷出骰子后,他/她想要知道例如一个玩家的能力分数,而其他玩家听不到。这可以通过用手指显示一个数字来实现,但是通常的方法只能显示 0-10 的数字,而能力分数通常是 18。

解决这个问题的一种方法是使用基数 6,一只手是第一阶,另一只手是第二阶。这样,一个人可以从 0 一直走到 35。如果这还不够,你可以使用二进制来得到 1023,尽管你需要相当灵活的手指。

如果具体范围接近 1–110,中文数字手势似乎是一个很好的选择。特别是因为我们的数字系统是以 10 为基数的,这使得这些手势更容易理解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

玩基于随机性的游戏时没有骰子是一个不容易解决的问题,事实上,即使知道你是否解决了它也是一个困难的问题。幸运的是,即使它并不完美,让 GM 和玩家同时喊出数字对大多数情况来说似乎已经足够了。

DxR:将 2D 数据可视化连接到沉浸式空间

原文:https://towardsdatascience.com/dxr-bridging-2d-data-visualization-into-immersive-spaces-d77a20d5f9e9?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(with permission from ShutterStock #616733024)

在 IEEE VIS 2018 上,来自不同大学的研究人员提交了一篇论文,描述了一种用于快速部署沉浸式数据可视化的新工具包,称为 DxR ( D 数据可视化在 mi X ed R eality)。[1]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文代表了将几个技术集群合并到一个集成开发环境中的重大努力。这跨越了带有 Unity3D 场景的 JSON Vega 可视化设计,支持商业 VR 产品,如 Oculus RiftHTC Vive微软 Hololens (中等价位的 VR 头戴设备)。

科罗拉多大学博尔德分校教授丹妮尔·萨菲尔的一篇文章引起了我的注意。她总结了几个数据可视化项目,并将 DxR 的重要性描述如下:

“虽然我们对 MR(混合现实)在可视化方面的效用的理解仍然有限,但 DxR 等工具可以帮助加快这一领域的发展。通过使构建和部署沉浸式可视化更容易,我们可以更好地理解这些显示技术在什么时候以及为什么对数据分析有用。这些工具对怀疑者和支持者都有帮助,允许他们构建新的应用程序,并快速进行研究,以测试沉浸式可视化可能提供的限制。”2

她总结说,更多的混合现实可视化实验对于“准确理解何时以及为什么”它们是有用的,以及它们的限制。

正如 Szafir 的文章所指出的,高级数据可视化是许多业务应用程序的关键要素。使用最新显示技术的压力(由视频游戏行业驱动)正朝着 中描述的超越桌面的视觉化——下一件大事 发展。作者调查了虚拟现实在几种应用和技术中的潜力,总结如下:

“可视化研究人员需要开发和适应今天的新设备和明天的技术。今天,人们通过鼠标与视觉描绘互动。明天,他们将触摸、滑动、抓取、感觉、听到、闻到甚至品尝数据。”[3]

手脏

先玩玩看 DxR 工具包的表现是否如宣传的那样…

首先,阅读DxR 论文 !如果你对可视化语法和 Unity3D 开发有所了解的话,这篇文章写得很好,也很容易理解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://sites.google.com/view/dxr-vis/home

二、进入 DxR 网站 查看 5 分钟视频,简洁明了。花时间浏览 Vega-Lite 网站并滚动浏览众多示例(注意左边的 Vega vis 规范)。这是相当多的使用案例!

这为 DxR 引入沉浸式空间的功能增添了一份风味。

第三,执行代码,如下所示:

  1. 点击下载 DxR 的链接,下载 UnityPackage 文件。选择最新版本。另存为文件;这不是 GZ。该文件稍后将被导入到您的 Unity 项目中。此外,确保你的 Unity 版本匹配,因为奇怪的事情可能会发生。使用新的 Unity Hub 管理您的所有 Unity 版本,或者只安装一个新的 Unity 版本。
  2. 点击快速入门指南通读概述。理解 Unity 场景中的 Vega-Lite 示例。
  3. 重点介绍 中的五个步骤设置**** 部分,这是大部分的工作。注意:你需要新手熟悉 Unity3D 来创建一个新的 Unity 项目,导入 Unity 资源包,了解层级项目检查器面板,玩 Unity 场景。如果需要帮助,可以查看 Unity3D 的优秀入门教程
  4. 尝试一些现成的例子。首先,浏览 DxR 示例页面。所有这些都可以在 DxRExamples assets 文件夹中找到。双击经典场景以将资源加载到层次窗口中。打开收藏文件夹,记下条形图、散点图等的 DxR…子文件夹。单击第一个项目 DxRBarchartBasic。在检查器面板中,而不是 Vis 脚本及其全局变量 Vis Specs URL,它指向 Examples/Classics/bar chart _ basic . json。在此 Vis Spec 的 JSON 中是“data”属性,包含要显示的数据的值。在其他 Vis 规范中,“URL”属性指定 json 文件名
  5. 按照下一节创建你的第一个沉浸式视觉来创建你自己的视觉。还有额外的教程涵盖了 GUI 控件和自定义标记(使用预设)。用自己的数据,玩得开心!
  6. 创建自定义标记。我特别喜欢在 Unity 中灵活使用预置的游戏对象作为 DxR 标记。注意在研究火焰标记及其 C#粒子脚本时,自定义标记和通道中的教程信息丰富。

反光

DxR 是将传统 2D 数据可视化连接到沉浸式空间的良好开端。如下所述,在未来的 DxR 版本中,有几个扩展是需要的。这些扩展有望来自持续的研究资助和开源社区的贡献。

扩展 DxR 标记编码。DxR 已经实现了令人印象深刻的 Vega-Lite 规范,这在最初并不明显。研究 DxR 语法文档,以及 Google 工作表文档

例如,DXR 使用 x、y、z 位置和旋转的标记编码提供 3D 可视化,类似于 Unity 变换类型。下面是一个名为 Streamline 的标准示例,显示在示例部分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Vis Spec and Rendering for the Streamline Example

在上述 vis 规格中,使用了圆锥的标记。注意到使用x 方向类型来控制标记的方向向量。这不同于 xrotation 类型,后者控制单位变换旋转属性。更改 vis 规格以查看差异。DxR 文档中隐藏的宝藏!

不过 Unity 有丰富的渲染能力。如何将标记编码扩展到处理纹理、着色器、声音、动画、粒子等?胡同玩家的动作功能列表将是目标。

作为织女星进化的 PyViz。最近,一个名为 PyViz 的社区已经形成,集成了几个基于 python 的可视化包,包括 Vega。这幅 PyVis 背景图描绘了宏伟的画面。目前,只有 Plotly 使用 WebGL 的 3D viz 是有限的,正如在 FAQ 页面上关于【PyViz 是否包含 3D 支持的解释。路线图页面提供了他们当前/未来的发展方向。没有提到 Unity3D。绝对是一个可以利用的快速发展的社区。

**提升数据整合能力。**当前的数据集成功能支持在 Vis 规范中明确嵌入数据(对于非常小的数据集),或者作为 Unity StreamingAssets 文件夹中的静态 JSON/CSV 文件。

然而,Vis 规范中的 URL 属性可以通过 web 服务调用扩展到远程 SQL 数据库访问。此外,处理数据流到 Unity 的能力,在数据改变时自动更新,并与数据服务器交互。这是一项重要的工作,可以借助现有的开源资源(如 PyViz commuity)。

利用微软混合现实工具包。 DxR 建立在 Unity 环境中的 HoloToolkit 之上。微软最近将 HoloToolkit 转换为混合现实工具包(MRTK),并且正在积极推进。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Architecture of Mixed Reality Toolkit

目标是…“旨在加速针对微软 HoloLens 和 Windows 混合现实耳机的应用程序开发的脚本和组件集合”,其中确实包括 Steam VR(如 HTC Vive 和 Oculus Rift)和 OpenXR 平台。 MRTK github 在麻省理工学院许可下,基于 Windows 10 UWP ( 混合现实 API)构建。问题是如何将 MRTK 整合到 DxR 中,利用其新兴的功能,同时平衡新兴的竞争 VR 工具包。

实体-组件-系统合一。另一个相关的发展是 Unity 的新实体-组件-系统架构,以及作业系统和突发编译器。在以成群结队的军队为特色的视频游戏的驱动下,Unity 正在测试这种新的架构,它将驱动游戏对象行为的数据(作为实体的组件)与执行这些行为的代码(作为系统)分开。最好的介绍是一系列的六个视频教程加上例子

当 ECS 成熟时,它的潜力将是创造和激活 Unity 对象(具有复杂行为和外观的 gliphs),数百万个!将 gliph 的所有数据打包到一个实体中,然后传输到 GPU,这是创建这种可视化的唯一方法。这种能力可以允许新的复杂的可视化方法。

只有一个维度?

以上集中于将 2D 可视化连接到 3D 沉浸式空间。然而,这是否意味着只有一个维度可以用于我们的可视化?

2015 年我写过一篇关于 虚拟现实对数据可视化 有用吗?4这是基于不列颠哥伦比亚大学数据研究员塔玛拉·芒兹纳的评论。她的简短回答是“不”,因为: 3D 只在空间设置中需要,广义上讲,VR 的成本超过了它的好处。科学可视化通常具有显示数据的自然 3D 背景,因此对于观察者来说是直观的。如果自然的 3D 背景不存在,那么 VR 还有存在的理由吗?我的结论是…

…虚拟数据世界应该提供独特的功能(如协作),并与 2D 可视化协同工作(将它们融入现实世界)。[如果我们]天真地使用虚拟数据世界来将 2D 可视化再扩展一个维度,我们将无法找到[虚拟现实可视化]的有效用例。

从那以后,我研究了几种创造性地使用这个维度的方法。以下是我正在寻求的一些建议;

  • 设想构建一个虚拟世界,代表整个复杂系统的动态(如数字城市)。水平面将类似于物理世界,而垂直维度将代表抽象(和分析)层次的增加。记住这里没有重力!
  • 支持多用户环境,以促进同时观察相同行为的人之间的协作,每个人都有自己的专用工具。
  • 用信息过载字形(标记),例如基于研究的 Gistualizer5场景的要点 5。注意 DxR 例子暗示了这种现象。
  • 将潜在空间(嵌入)可视化在经过训练的神经网络的隐藏层中。[7]一种方法是通过从权重创建统一纹理来过载字形。第二种,更有趣的方法是探索整个 100+维空间,一次 3 维。在 Unity 中需要一个智能导航器来在这个高亮度空间中漫游!

如果你对此感兴趣,让我们来构建沉浸式世界吧!请加入沉浸式分析社区进行合作。【 网站twitterlinkedinslackgithub 】。

参考

  1. Sicat,Ronell 等人 DXR:用于构建沉浸式数据可视化的工具包。(2018).https://sites.google.com/view/dxr-vis/homehttps://github.com/ronellsicat/DxR
  2. 萨菲尔,丹奈儿。 IEEE VIS 2018:色彩、交互、&增强现实。(2018).https://medium . com/multi-views-visualization-research-explained/IEEE-vis-2018-color-interaction-augmented-reality-AE 999 b 227 c 7
  3. 罗伯茨、乔纳森等人超越桌面的可视化——下一件大事。(2014).https://ieeexplore.ieee.org/document/6879056
  4. 黑客马拉松,理查德。VR 对数据可视化有用吗? (2015)。
    https://www . immersiveanalytics . com/2015/10/is-virtual-reality-used-for-data-visualization/
  5. Bellgardt,Martin 等人 Gistualizer:多维数据点的沉浸式字形。(2017).https://vr.rwth-aachen.de/publication/02157/
  6. 奥利瓦,奥德。一场戏的要旨。(2005).https://www . science direct . com/science/article/pii/b 9780123757319500458
  7. 科尔森威尔。神经网络嵌入解释。(2018).
    https://towards data science . com/neural-network-embeddings-explained-4d 028 E6 f 0526

使用人工智能染头发(或看起来更老)

原文:https://towardsdatascience.com/dye-your-hair-or-look-older-using-ai-930bc6928422?source=collection_archive---------13-----------------------

使用 StarGAN 进行图像到图像的翻译。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Matthew Bennett on Unsplash

我会告诉你一些不可否认的事实。总有一天你会变老——你会变得不一样。

事实上,在你的一生中,你的外貌会发生很大变化。**

你希望自己看起来有点不同。我不会怪你,我也喜欢那样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A sample of StarGAN reconstructing images with new target domains

你现在就可以这么做。你可以尝试金发——没有任何染料——变老 50 岁,或者甚至改变你的任何照片上的情绪以微笑,看起来生气或害怕——所有这些都不需要任何工作。

如果我不工作,谁会工作?

艾。或者如果你想更具体一点,它是你计算机内部某处的一个 GPU(或者在云上)。

我使用 Pytorch 实现了 StarGAN(GAN:Generative Adversarial Network),这是一种可扩展的方法,用于图像到图像的翻译** — 酷脸改变表情/特征的东西— 它使用深度学习来重建一个新领域的人的照片(例如,皱眉的男人→微笑的男人,或者黑发的女人→金发的女人)。**

图像到图像的转换是将照片的某一方面改变为另一方面

如果你没有听说过,图像到图像的翻译听起来像是科幻电影里的东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

cycleGAN (not StarGAN) can translate the season the image is in using GANs.

这个概念背后的前提非常简单(尽管这个概念并不简单),所以请听我说完。

在基本水平上,完全训练的网络获取输入图像,识别其域分类(一个方面,例如季节、头发颜色或年龄),并用不同的域重建相同的图像(例如,冬天→重建为夏天)。

所以这相当于翻译一幅图像。

是这样的。有许多类型的模型可以执行图像域的这种转换。但是与 StarGAN 相比,他们的结果非常弱。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

StarGAN (bottom) compared to other GAN image translation frameworks

与其他只能学习固定翻译(如黑发→红发)而不能反向重建图像的模型不同,StarGAN 旨在学习如何在一个单一的生成对抗网络** (GAN)中从多个数据集翻译多个域。**

生成对抗网络

甘现在在某种程度上是人工智能的温床。这种技术可以生成看起来 100%真实但实际上根本不真实的图像。

好好看看下面的图片。没有一个是真的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“But I swear I’ve seen them somewhere!” — Everyone who looks at this image

这是如何工作的?

生成性对抗网络由两个不断相互博弈的神经网络组成(因此是对抗的)。

第一个网络叫做发电机。生成器的作用是生成尽可能精确的假图像。****

第二个网络称为鉴别器**。它负责区分真实图像和生成器生成的图像。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Have you ever seen these people before? Well, neither has anyone else 🤯. All these faces are computer generated by a GAN.

把甘斯想成这样。一个伪造者(制作者)正试图从一个画廊伪造艺术品,但是他并不知道艺术品的真实样子。把他想象成一个盲人伪造者。

侦探(鉴别者)是一名世界级的伪造艺术品侦探,他的角色只是尽可能多地了解画廊中的艺术品,以便他能够完成确定艺术品是伪造还是真实的工作。

游戏开始时,侦探是对。盲伪造者的唯一输入是他的伪造艺术是否变得更好。

最终,伪造者开始创作对侦探来说与画廊里真正的艺术品难以区分的艺术品。

每次伪造者或侦探犯了错误,他们都会从中吸取教训,变得更聪明。

这意味着,即使这些网络在相互竞争,因为它们学会了更好地做自己的工作,另一个网络也被迫在自己的工作上做得更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里有一些不足为奇的东西。

每年都有新的人工智能技术/概念发布,使过去在模型任务方面的尝试完全相形见绌。

好的部分来了…

介绍 StarGAN

是的,生成从未生活过的人的真实的全新面孔是非常酷的— 和怪异的— 但是 GANs 可以做的远不止这些。

StarGAN 以一种非常聪明的方式使用 GAN 的来创建最好的图像到图像的翻译器(到目前为止)。

你已经看到了 StarGAN 的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

StarGAN translates target domains for a handful of celebrity photos.

它是这样工作的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Remember how GANs work?

  1. 鉴别器被训练:

StarGAN 过程的第一步是训练鉴别器和发生器开始产生真实的重映射图像。

该型号的鉴频器有两个输出;

  • 确定图像是真的还是假的,
  • 正确标记图像的领域(棕色头发,女性等)

2.原始图像被转换到目标域

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This Is How StarGAN works.

好了,现在鉴别器已经训练好了,是时候创建真正的假图像了。

生成器被馈送原始图像,它的预定目标域并生成假图像。

所以在这一步,生成器实际上构建了图像。

3.“假”图像被重建回原来的 ( 什么????)

这一步似乎有点反直觉。

在其中,生成器获取假图像,然后将其重建回其原始域。

它试图重建原始图像。

然后,该重建图像再次通过最后一步,以制造赝品。这样重复多次,才能让照片真的好看。

为什么?

原因很简单。当转换图像域(产生假图像)时,图像不保留原始图像的内容并不困难。

它偏离原始面貌太远,即使它做翻译领域的工作。

为了解决这个问题,研究人员使用了 CycleGAN 中使用的一种叫做的循环一致性损失。这种方法通过生成假图像并通过生成器重建原始输入的过程来循环。

4.再次欺骗鉴别器的时间

这是真正好玩的部分。

做完一个假的/翻译的图像后。图像通过鉴别器,鉴别器决定图像是否是假的并选择其标签。

如果图像足够好,鉴别器会正确地标记它,并认为它是一个真实的图像。

如果没有,那么…是时候更加努力工作了。

星际之门就是这样工作的吗?

是的,本质上。

但是 ,StarGAN 后面还有一大堆关于 实际研究论文的信息(去看看吧!).

让我们再复习一遍。

外卖食品

  • 图像到图像的转换是可以改变你头发颜色(实际上)或者你最喜欢的自然照片的季节的技术。它使用 GANs 改变(图像的一个方面)。
  • ****生成性对抗网络是由一个生成器和一个鉴别器组成的网络,它们不断地相互博弈。这场比赛让甘斯有能力变得更好,提高自己。
  • StarGAN 是一个大规模执行图像到图像翻译的框架。在其中,生成的图像实际上被重建回原始图像,然后一个赝品被多次生成以保持其原始性。

在你走之前

  • 一定要看看我的其他文章!
  • 注册我的每月简讯
  • 看看我新做的网站
  • 在 Linkedin 上添加我以保持更新!s

垂死的舌头和维度的诅咒

原文:https://towardsdatascience.com/dying-tongues-and-the-curse-of-dimensionality-96b42c628559?source=collection_archive---------37-----------------------

自然语言处理能把濒危和非西方语言挤出科学吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Kobu Agency on Unsplash

在过去的十年里,自然语言处理得到了迅猛发展。随着计算能力和数据可用性的提高,挖掘人类语言以获得洞察力的市场非常强劲。

然而,随着 NLP 的激增,我们必须密切关注它正在扩展的空间。我们是否在用我们收集的数据和用来分析数据的工具创造一个以英语为母语的反馈回路?

非英语语言特征使得用以英语为母语的人设计的工具执行 NLP 变得复杂。

总的来说,NLP 技术是由以英语为母语的人发明的。英语倾向于语言学家所说的分析型语言。这意味着它每个词的词素数量很低,缺乏其他语言用于时态、人称、语气和体等事物的语法标记,而是通过词序和与其他词的联系来表达。

例如,在英语中,下列句子是不等价的:

克劳斯吃沙拉。

沙拉吃掉了克劳斯。

但在德语(融合语言)中,它们都意味着“克劳斯正在吃沙拉”,因为融合形态学表明格标记使得词序不太必要:

克劳斯死了。

丹·萨拉特是克劳斯。

在粘合和多合成的语言中,每个单词甚至可以有更多的含义:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是大多数 NLP 库都是针对英语和类似英语的欧洲语言的标记化、词条化和词性标注而优化的。

低容量、难以处理的数据使偏见永久化。

虽然资源一直在扩大,但除了英语之外,其他语言的选择仍然较少。在某种程度上,这个难题源于对拥有最多数据的语言应用 NLP 的偏见。英语仍然是互联网的语言,因此,它和其他富裕、互联国家的语言一样,在数据集中的比例过高。没有足够的数据,在较小的语言上使用传统的高维 NLP 技术将不会有效。

由于 NLP 经常被用于提供高价值的市场洞察和刺激投资,这种关注的缺乏可能导致一种自我延续的循环,在这种循环中,低资源语言继续获得较少的服务,因此产生的数据比更受关注的语言少。最终,他们可能会失去发言者,而世界将会失去语言多样性

然而,正如我们所知,在项目层面上,“应该非常小心,不要匆忙删除或更改值,尤其是在样本量很小的情况下。”Max Kuhn 和 Kjell Johnson,应用预测建模 33(第 5 版。2016).“此外,异常数据可能表明正在研究的人口中的特殊部分刚刚开始被抽样。”同上 34。从跨语言数据科学的宏观角度来看,这个建议同样适用。对于历史上研究不足的语言来说,这种初步探索可以产生巨大的影响——对于研究它的知识分子、可以从这种见解中受益的企业,以及从自己的语言得到认可和检查中受益的社区。

弥补差距需要认真关注。

必须首先在数据收集阶段缩小差距。一些 NLP 从业者已经开始在语言学研究过程中更早地实现机器学习,以提高语料库可用的机会。确保领域语言学家和数据科学家进行交流以产生互利的、机器可读的语料库是一个重要的考虑因素。

其他技术可以通过实现不需要这种高维特征创建的方法来寻求充分利用稀疏数据集。半监督和非监督技术可以用来避开休斯现象。要使现有模型适应全新的结构,不仅需要语言知识,还需要创造性思维。在这种情况下,神经技术是有益的。一个小组已经使用深度学习来复兴塞内卡。在谷歌的帮助下,其他公司也在跟进。

机器学习给了我们一个前所未有的机会来保存和探索前几代人从未有过的研究不足的语言。那些接受挑战的人不仅会丰富自己,还会丰富我们对共同语言遗产的集体理解。

动态图表:让您的数据移动

原文:https://towardsdatascience.com/dynamic-charts-make-your-data-move-19e540a06bd3?source=collection_archive---------20-----------------------

动态图表给我们一种直观和互动的体验。本文将解释什么是动态图表以及如何制作动态图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

From FineReport

1.动态图表是如何工作的?

上图是用 BI 报告工具 FineReport 制作的包含动态图表的仪表板。点击饼状图的相应位置,可以得到具体区域的数据,交互性很强。

我们来对比一下 Excel 呈现的数据。是不是显得单调冰冷?相反,动态图表能带给我们直观的体验,更好的展现数据的差异。接下来,我将从定义、优点、制作方法等方面介绍动态图表,让您对动态图表有一个更清晰的认识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.什么是动态图表?

可能你们很多人认为有动画效果的报表是动态报表。其实动态报表是指没有固定报表模板,需要根据实际业务数据生成模板的报表。而这往往是通过动态图表实现的。动态图表的核心是数据和图表类型可以根据不同的情况即时显示。除了显示一般的静态图表内容,它们还必须具有良好的交互性。

简单来说,动态图表的核心就是报表数据可以随时调用。比如老板想查看某个月的数据,只需要设置一个参数过滤条件。当老板在控件中选择时间和月份时,报表将只显示该月的数据。这称为动态报告。

动态图表的目的是为了更方便快捷地查询和读取数据。在此基础上,动态图表需要包含大量的逻辑功能,例如:

  • **参数过滤:**根据不同的条件查看不同的数据。这是动态图表的基本功能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 参数联动:联动两个或两个以上的组件,实现数据之间的自动关联。比如点击年销售额,该年的订单明细,月退货率和销售额排名会挂钩。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Drill Down :动态图表的常用功能主要是实现无限层数据的展开,以及更高维度的明细数据的展开。例如,下钻图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 参数面板动态显示:由于一些需要,很多情况下,一些查询条件只有满足某个条件才会显示。例如,如果您选择一个地区,随后的参数框将自动显示该地区的城市和消费者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

动态查询:如果数据库中有多个表,我们如何提高查询效率?此时,您可以设置动态数据列,例如,在控件中输入" jia “,它将显示所有表格中带有” jia "的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.如何制作一个很酷的动态图表?

3.1 基础图表制作流程

这里我们选择 FineReport 做动态图表。在 FineReport 中,图表的工作流程类似于 Excel,数据准备—插入图表—选择图表类型—选择分类轴、系列名称和系列值—设置图表样式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 不同的图表类型

这主要是文字、数字、网格的美感,以及整体的色彩和谐。这些可以在 FineReport 中定制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你甚至可以做一个卡片栏报告。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3 数据可视化小部件

除了表单的类型之外,可视化图表还有动态显示部分,这就是所谓的动态可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4 仪表盘

想要让最终的动态图得到大家的认可,要牢记三点:设置版面、搭配颜色、修饰动态效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注:本文所有动态图表均摘自fine report。这个工具是由我工作的数据研究所开发的。个人使用完全免费。你可以下载它来练习制作图表和仪表盘。

4.制作动态图表的工具

最后,对于公司中的不同角色,他们通常会根据工作需要使用不同的工具来创建动态图表。这三个场景是最常见的,也许可以给你一些参考。

  • 利用 Excel 内置的图表做一些规律的图表。用 Excel 制作的高级复杂图表如动态图表、图表的过滤显示可以通过编写 VBA 来实现。
  • 使用 R、Python 的编码语言,调用图表函数包,呈现可视化数据,常用于数据分析师
  • 使用 Echarts、HighCharts、D3.js 等开源可视化插件,嵌入代码,开发插件包,常用于可视化工程师和前端开发。

您可能也会对…感兴趣

让你的数据报告脱颖而出的指南

2019 年你不能错过的 9 款数据可视化工具

新手如何打造一个很棒的仪表盘?

数据可视化中前 16 种图表类型

什么是大屏幕的数据可视化,如何实现?

动态元嵌入

原文:https://towardsdatascience.com/dynamic-meta-embeddings-f97e2c682187?source=collection_archive---------16-----------------------

如果你在过去的几个月里阅读过任何与 NLP 相关的书籍,你不可能没有听说过伯特GPT-2埃尔莫这些人进一步拓展了 NLP 任务的范围。尽管这些技术很棒,但是有很多 NLP 问题设置你无法使用它们。你的问题可能不是真正的语言,而是可以用记号和序列来表达。你可能正在处理一种没有预先训练选项的语言,也没有资源来自己训练它。
也许你只是在处理一个非常特殊的领域(但是你知道 BioBERT 吗?).

因此,您可以选择处理预先训练好的嵌入(不是由上述模块生成的)。今年早些时候的 Kaggle Quora 虚假问题分类就是这种情况,参赛者不能使用 BERT/GPT-2/ELMo,但只能获得四组预训练的嵌入。这个设置引发了一个有趣的讨论,即如何组合不同的嵌入,而不是只选择一个。
在这篇文章中,我们将回顾一些将不同的嵌入组合成单一表示的最新技术,这被称为“元嵌入”。
一般来说,我们可以将元嵌入技术分为两个不同的类别。第一个是(1)当创建元嵌入的过程与它们将被用于的任务分离时,以及(2)当训练元嵌入与实际任务同步时。
我不会在这篇文章中介绍使用第一个提到的过程(1)的方法,它们中的大多数都非常简单,包括嵌入维度的平均、连接等。然而,不要把简单误认为是弱,因为提到的 Kaggle 竞赛获胜解决方案使用了嵌入的加权平均。
如果你想了解更多关于这类方法的信息,你可以在下面两篇文章中找到。简单得令人沮丧的元嵌入——通过平均源词嵌入来计算元嵌入
b通过使用嵌入集合的系综学习元嵌入
在下一节中,我们将介绍使用第二个提到的过程(2)的两种技术。

(上下文)动态元嵌入

本节中的技术都来自脸书人工智能研究论文“用于改进句子表示的动态元嵌入”,并提出了两种新技术,“T2”动态元嵌入(DME) 和“T4”上下文动态元嵌入(CDME) 。这两种技术都是附加在网络开始处的模块,并且具有可训练的参数,这些参数从与网络其余部分相同的梯度中更新。这两种技术的共同步骤是原始嵌入的线性投影。下图提供了投影的可视化效果;虚线表示学习的参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Projection, learned parameters in dashed line

使用由此产生的投影,将计算关注系数,以使用这些投影的加权和。DME 和 CDME 计算这些系数的方式不同。

测距装置(Distance Measuring Equipment)

DME 使用的机制只依赖于单词 projections 本身。每个单词投影乘以一个学习向量 a ,这产生一个标量——因此对于 N 个不同的投影(对应于 N 个不同的嵌入集),我们将有 N 个标量。这些标量然后通过 softmax 函数传递,结果是注意系数。然后,这些系数用于创建元嵌入,这是投影的加权和(使用系数加权)。
该步骤如下所示(虚线表示已学习的参数)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: Creating the DME embedding, learned parameters in dashed line

如果你说 TensorFlow(或 Keras),你可能更喜欢在代码中看到它——下面是 DME 的 Github 要点(精简版),完整代码可以在这里找到

CDME

CDME 使用双向 LSTM (BiLSTM)将上下文添加到混合中。如果你对这个术语感到不舒服,我不会在这里详述 LSTMs,回顾一下关于它们的经典的 colah post

与 DME 的唯一区别在于注意力系数是如何计算的。
就像 DME 一样,首先序列被投影,然后投影的序列通过 BiLSTM。
然后,不使用单词本身,而是使用正向和反向 LSTMs 的级联隐藏状态(在单词的对应索引中)和向量 a 来计算关注系数。
这个过程的可视化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Creating the CDME embedding, learned parameters in dashed line

同样,如果你喜欢阅读下面的代码是 Github gist 的精简版,完整版在这里

就这些,希望你学到了新的东西,欢迎发表你的想法和问题。👋

https://www.datascience.co.il/blog查看更多内容、博客和新闻

Keras 中的动态元嵌入

原文:https://towardsdatascience.com/dynamic-meta-embeddings-in-keras-42393d246963?source=collection_archive---------22-----------------------

了解不同嵌入的有价值的组合

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Khushbu hirpara on Unsplash

许多 NLP 解决方案利用预先训练的单词嵌入。选择使用哪一种通常与最终性能有关,并且是在大量试验和手动调谐之后实现的。脸书的人工智能实验室一致认为,做出这种选择的最佳方式是让神经网络自己找出答案。

他们引入了 动态元嵌入 ,这是一种简单而有效的嵌入集成监督学习方法,可以在同一模型类中的各种任务上实现最先进的性能。这个简单但非常有效的方法允许学习一组选择的单词嵌入的线性组合,这优于各种嵌入的简单串联。

如上所述,作者在 NLP 领域的各种任务上证明了他们的解决方案的有效性。我们限制自己在一个文本分类问题中采用这些技术,其中我们有 2 个预训练的嵌入,并希望智能地组合它们以提高最终的性能。

数据

我在 Kaggle 上发现了一个有价值的数据集,其中包含了来自 BBC 档案馆的文章全文(总共 2225 篇)。新闻属于 5 个主题领域:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Label distribution

我们的目标是对它们进行正确分类,为此,我们希望训练不同类型的嵌入,智能地组合它们,并在此基础上构建我们的分类器。开始时,对原始语料库应用标准的清洗程序。作为嵌入模型,我选择了最常见的类型:Word2Vec 和 FastText。我们可以使用 Gensim 轻松地训练它们,将它们“拖放”到 Keras 架构中(记住为每个选定的嵌入框架保持相同的嵌入大小)。我手工仔细计算了这个过程,以便在需要时控制填充过程:Keras 的 Tokenizer 对象和 pad_sequence 函数使所有事情变得简单。

当我们以多次训练的嵌入(也是像手套或类似的模型的预训练形式是完美的)和顺序语料库结束时,我们准备好组合我们的权重。

模特们

在原始论文中介绍了两种不同的技术:

  • 动态元嵌入(DME) : 原始嵌入被投影到新的空间中,通过 LSTM 编码器添加额外的可学习权重,遵循注意机制。然后将它们与其原始格式线性组合。用喀拉斯语说:
def DME(maxlen): inp = Input(shape=(maxlen, 100, 2))
    x = Reshape((maxlen, -1))(inp)
    x = LSTM(2, return_sequences=True)(x)
    x = Activation('sigmoid')(x)
    x = Reshape((maxlen, 1, 2))(x)
    x = multiply([inp, x])
    out = Lambda(lambda t: K.sum(t, axis=-1))(x) return Model(inp, out)
  • 【上下文动态元嵌入(CDME) : 如上,原始嵌入被投影到一个新的空间,增加额外的可学习权重;但是现在通过 BiLSTM-Max 编码器应用了上下文相关的系统。最终追求的是自我关注机制和与原格式的加权组合。在 Keras 语言中(没有提供 Keras 双向层的最大池合并,所以我们必须自己编码):
def CDME(maxlen, latent_dim=2): inp = Input(shape=(maxlen, 100, 2))
    x = Reshape((maxlen, -1))(inp)
    x = Bidirectional(LSTM(latent_dim, return_sequences=True))(x)
    x = Lambda(lambda t: [t[:,:,:int(latent_dim/2+1)],  
                          t[:,:,int(latent_dim/2+1):]])(x)
    x = Maximum()(x)
    x = Activation('sigmoid')(x)
    x = Reshape((maxlen, 1, 2))(x)
    x = multiply([inp, x])
    out = Lambda(lambda t: K.sum(t, axis=-1))(x) return Model(inp, out)

我们重新创建了两个通用代码块,它们通过一个动态过程来执行嵌入组合。这两种解决方案都可以放在网络的起点,紧接在我们的嵌入的读取和连接之后。在它们上面,我们可以根据不同的目的叠加正常的图层。在我们的例子中,我们添加一些递归层来正确分类我们的新闻文章。我们以这两种架构结束:

对于 DME :

concat_inp = Concat_Emb([embedding_matrix_w2v, embedding_matrix_ft], maxlen=max_len)
dme = DME(max_len)
x = dme(concat_inp.output)
x = GRU(128, dropout=0.2, return_sequences=True)(x)
x = GRU(32, dropout=0.2)(x)
out = Dense(y.shape[1], activation='softmax')(x)dme_model = Model(concat_inp.input, out)
dme_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

对于 CDME:

concat_inp = Concat_Emb([embedding_matrix_w2v, embedding_matrix_ft], maxlen=max_len)
cdme = CDME(max_len)
x = cdme(concat_inp.output)
x = GRU(128, dropout=0.2, return_sequences=True)(x)
x = GRU(32, dropout=0.2)(x)
out = Dense(y.shape[1], activation='softmax')(x)cdme_model = Model(concat_inp.input, out)
cdme_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

现在,我们已经准备好执行培训,并看到一些结果。这两个模型都能够在测试数据上达到大约 93%的总体准确率,并且每个类别都有很高的召回分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

允许访问多种类型的嵌入(不管它们是预先训练的还是特别构建的),我们允许神经网络通过预测每种嵌入类型的权重来学习它偏好的嵌入( DME ),可选地取决于上下文( CDME )。我们在文本分类的 NLP 任务中实现了这一点,只是简单地将这一过程与处理这类问题的常规方法结合起来。

查看我的 GITHUB 回购

保持联系: Linkedin

参考文献

改进的句子表征的动态元嵌入:杜维基拉,王和赵京贤;脸书人工智能研究;纽约大学;CIFAR 全球学者。

数据科学家的动态编程

原文:https://towardsdatascience.com/dynamic-programming-for-data-scientists-bb7154b4298b?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Dimitri Houtteman from Pixabay

算法面试

如何轻松解决 DP 问题?

算法和数据结构是数据科学不可或缺的一部分。虽然我们大多数数据科学家在学习时没有上过适当的算法课程,但它们仍然很重要。

许多公司在招聘数据科学家的面试过程中会询问数据结构和算法。

现在,许多人在这里问的问题是,问一个数据科学家这样的问题有什么用。 我喜欢这样描述,一个数据结构问题可以被认为是一个编码能力测试。

我们都在人生的不同阶段进行过能力倾向测试,虽然它们不是判断一个人的完美代理,但几乎没有什么是真的。那么,为什么没有一个标准的算法测试来判断人的编码能力。

但我们不要自欺欺人,他们需要像你的数据科学面试一样的热情,因此,你可能需要花一些时间来研究算法、数据结构和算法问题。

这篇文章是关于快速跟踪这项研究,并以一种易于理解的方式为数据科学家解释动态编程概念。

动态编程是如何工作的?

假设我们需要找到第 n 个斐波那契数。

斐波纳契数列是一系列数字,其中每个数字(斐波纳契数)是前面两个数字的和。最简单的是 1,1,2,3,5,8 等系列。答案是:

def fib(n):
    if n<=1:
        return 1
    return fib(n-1) + fib(n-2)

这个问题与递归方法密切相关。但是你能发现这里的问题吗?

如果您尝试计算 fib(n=7 ),它会运行 fib(5)两次,fib(4)三次,fib(3)五次。随着 n 变大,对同一个号码进行了很多次调用,我们的递归函数一次又一次地计算。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

递归本质上是一种自顶向下的方法。当计算斐波那契数 n 时,我们从 n 开始,然后递归调用 n-2 和 n-1 等等。

动态编程 中,我们采取自底向上的方法。它本质上是一种迭代编写递归的方法。我们首先计算 fib(0)和 fib(1 ),然后使用以前的结果生成新的结果。

def fib_dp(n):
    dp_sols = {0:1,1:1}
    for i in range(2,n+1):
        dp_sols[i] = dp_sols[i-1] + dp_sols[i-2] 
    return dp_sols[n]

为什么动态编程很难?

递归是一个数学概念,对我们来说很自然。我们试图通过把一个大问题分解成小问题来寻找解决方案。

现在,动态规划需要完全相同的想法,但在动态规划的情况下,我们预计算所有可能需要以自下而上的方式计算的子问题。

我们人类本质上是天生以自上而下的方式工作的。在我们的学习中,大多数人在深入之前都试图深入事物的广度。或者是我们的思维方式。

那么,如何开始自下而上的思考呢?

我发现解决下面的问题给了我很多关于 DP 如何工作的直觉。 一旦我能够解决这个问题,我自己就对 DP 非常满意,希望它也能帮助你。

基本上这个想法是,如果你知道一个小问题的解决方案,你是否能推导/解决一个更大的子问题?

最大路径和

给定一个装满黄金的 m x n 网格,找出一条从左上到右下的路径,其中最大化沿其路径的黄金总和。我们只能从(0,0)开始向下或向右移动

现在可以肯定有许多途径。我们可以一直走到右边,然后到底。或者我们可以走一条曲折的路?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是只有一条/几条路会让你变得富有。

那么,你是如何开始思考这样一个问题的呢?

当我们考虑动态编程问题时,我们采用自底向上的方法。所以我们从思考最简单的问题开始。在我们的例子中,要解决的最简单的问题是基本情况。如果我们必须到达单元格(0,0),我们可以获得的最大黄金价值是多少?

答案很简单——就是单元格的值本身。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以我们转到一个更难的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

cell (0,1)和 cell (1,0)呢?

这些也很简单。我们只能通过(0,0)到达(0,1)和(1,0),因此我们可以获得的最大黄金是单元格(0,1)/(1,0)中的值加上我们到达单元格(0,0)时可以获得的最大黄金

cell(0,2)呢?同样只有一条路。因此,如果我们知道(0,1)的解,我们只需将单元格(0,2)的值相加,就可以得到(0,2)的解

现在让我们试着对任意一个单元格做同样的事情。我们想在这里推导出一个关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以在任意单元格的情况下,我们可以从顶部或者从左侧到达它。 如果我们知道单元格顶部和左侧的解,我们就一定可以计算出任意当前目标单元格的解。

编码

一旦我们有了直觉,编码工作就非常简单了。我们从计算第一行和第一列的解开始。然后我们继续用之前得到的关系计算网格中的其他值。

def maxPathSum(grid):
    m = len(grid)
    n = len(grid[0])
    # sol keeps the solutions for each point in the grid.
    sol = list(grid)
    # we start by calculating solutions for the first row
    for i in range(1,n):
        sol[0][i] += sol[0][i-1]
    # we then calculate solutions for the first column
    for i in range(1,m):
        sol[i][0] += sol[i-1][0]
    # we then calculate all the solutions in the grid
    for i in range(1,m):
        for j in range(1,n):
            sol[i][j] += max(sol[i-1][j],sol[i][j-1])
    # return the last element
    return sol[-1][-1]

结论

在这篇帖子里,我谈到了我对动态编程问题的看法。

我首先问自己我能解决的最简单的问题,以及我是否能通过使用简单问题的解决方案来解决更大的问题。

动态编程构成了数据科学/机器学习工作面试中一些最常见问题的基础,对这些问题的良好理解可能会帮助你获得理想的工作。

所以出去用 Leetcode/HackerRank 解决一些问题吧。这些问题确实很有趣。

如果你想学习算法和数据结构,也可以看看我在系列的其他帖子。

继续学习

如果你想了解更多关于算法和数据结构的知识,我强烈推荐 UCSanDiego在 Coursera 上的 算法专门化。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意

在 SAS 中从单个数据集动态拆分/创建多个数据集

原文:https://towardsdatascience.com/dynamically-split-create-multiple-datasets-from-single-dataset-in-sas-7a6ea1f5f15d?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将一个数据集分割成多个数据集是 SAS 程序员经常面临的挑战。例如,将从世界各地收集的数据分割成独特的国别数据集,其中每个数据集只包含特定于该国的数据。在这种情况下,程序员经常被迫对程序进行硬编码,并使用多个循环来完成工作,这不是一种好的做法。然而,SAS 为这个问题提供了一个漂亮的、一次性的、可重用的解决方案。让我们直接进入它。

导入数据集

我们有以下全球销售数据集( Worldwide_Sales.xls ):

所有数据集和代码文件都可以在 GitHub(【https://github.com/pramodkumavat/createMultipleDatasets/)找到。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们首先将这个数据集导入到我们的 SAS 环境中。

页(page 的缩写)s:请将数据集文件 Worldwide_Sales.xls 复制到您的 SAS 工作目录 myfolders 中。

**proc import out=work.sales
datafile='/folders/myfolders/Worldwide_Sales.xls'
dbms=xls replace;
getnames=yes;
run;**

运行上面的代码将把我们的数据集作为 work.sales 库加载到 SAS 中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要理解导入代码中使用的各种选项,这个 FAQ 就是你所需要的。

创建多个数据集

业务需求表明,我们必须从全球数据集创建国家唯一的数据集。这样创建的每个数据集将包含该特定国家的销售数据。为此,我们首先需要从数据集中提取唯一的国家名称。

步骤 1:提取唯一的国家名称

**proc sort data=work.sales out=work.unique (keep=Country)
nodupkey;
by country;
run;**

运行上面的代码将为我们提供数据集中唯一的国家名称。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一旦我们提取了国家名称,现在让我们创建我们的神奇代码,在单个数据语句中动态创建国家级数据集。

步骤 2:动态创建多个数据集

**data _null_;
set work.unique;
call execute('data ' !! compress(Country) !! '; set work.sales; where Country = "' !! Country !! '"; run;');
run;**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如您在上面的输出中所看到的,在左侧,我们看到已经创建了国家唯一的数据集。

幕后的魔法

让我们一行一行地理解代码的每一个方面,这使得魔术成为可能。

**data _null_;**

我们将输出数据设置为 null ,因为我们不想创建单个数据集,而是一次创建多个数据集,这一点我们稍后会看到。

**set work.unique;**

我们将输入数据集设置为 work.unique ,其中包含唯一的国家名称。我们这样做是因为我们希望在每次迭代中创建独特的国家级数据集。

**call execute('data ' !! compress(Country) !! '; set work.sales; where Country = "' !! Country !! '"; run;');
run;**

这才是真正的交易!您可能已经注意到,我们在 call execute() 语句中编写了一个嵌套查询。如前所述,SAS 提供了这个漂亮的解决方案来创建多个数据集,而不使用多个循环。

execute() 调用中,我们以数据语句开始,然后附加上我们唯一的国家名称。国家这里只是来自我们 work.unique 数据集的变量。 compress 函数应用于 Country 变量,因为我们的国家名称中有空格(例如,新西兰、英国)。这个 compress 函数在创建唯一数据集时删除国家名称中的空格。

然后我们放分号()结束我们的数据步骤,然后将输入数据集设置为 work.sales 。很明显,我们将输入设置为父数据集 work.sales ,使用它我们将创建唯一的数据集。然后,我们放入 where 条件,以便它从父数据集中挑选国家级数据。然后,我们用 run 语句结束嵌套查询,并关闭 execute() 调用。代码的最后一个 run 语句是为了结束外部查询。

完整代码

我在这里粘贴完整的 SAS 代码供您参考。这个 SAS 代码(dynamicmultipledatasets . SAS)以及使用的数据集( Worldwide_Sales.xls )可以从 GitHub 这里下载。

*** Importing the dataset in SAS;proc import out=work.sales
datafile='/folders/myfolders/Worldwide_Sales.xls'
dbms=xls replace;
getnames=yes;
run;* Extracting country names from the dataset;proc sort data=work.sales out=work.unique (keep=Country)
nodupkey;
by country;
run;* Creating multiple datasets from the parent dataset;data _null_;
set work.unique;
call execute('data ' !! compress(Country) !! '; set work.sales; where Country = "' !! Country !! '"; run;');
run;**

希望这对你有帮助。请评论您的反馈/建议。干杯!

基于自然语言处理和无监督学习的电子商务评论分析

原文:https://towardsdatascience.com/e-commerce-reviews-analysis-902210726d47?source=collection_archive---------14-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

picture credits to www.oberlo.com

在这个项目中,我想练习自然语言处理无监督机器学习。在对我能从网上获得的数据集做了一些研究后,我找到了一个真实的电子商务企业的女装数据集。我认为,如果我能为企业开发一种从他们的服装评论中提取见解的自动化工具,这可能会很酷,对企业很有用。因为阅读成千上万的评论并不容易,而且是一项耗时的任务。

由于各种原因,这可能是有价值的。例如:

  1. 了解趋势:了解人们在谈论什么,他们喜欢什么或不喜欢什么。
  2. 根据用户反馈改进产品。
  3. 跟进用户不喜欢的产品,进一步了解问题所在。
  4. 为了降低退货率,重新进货费用是电子商务成功甚至生存的一大开支。

以上是你可以对顾客评论做的一些事情。

我想解决的问题

因此,为了这个项目的目的,我想探索以下几点:

  1. 话题建模:比如人们在谈论的那个服装/鞋子有哪些正面和负面的东西。通过计算某个主题中出现的单词或单词组合的频率,看看我是否能找到任何主题。
  2. 使用聚类将好的和坏的评论“分离”:通过聚类的方法,将不同产品的好的和坏的评论分离出来或找到模式,以便发送给相应的部门关注。这可能非常困难,因为聚类方法是一种无监督的机器学习技术,可以从数据中找到隐藏的模式。

项目设计

  1. 清理并对我的数据执行探索性数据分析(EDA)
  2. 我清理的文本数据的矢量化(计数矢量化器和 TF-IDF)。
  3. 生成一个单词云,看看人们谈论的最频繁的单词是什么。
  4. 进行主题建模,看看我是否能找到一些人们正在谈论的不同主题。
  5. 使用聚类方法从我的文本数据中聚类出模式,看看我是否能聚类出那些不好的评论(或不同类型的评论)。并使用 TSNE 可视化我的集群。
  6. 最后,使用数据集中的评级列执行监督学习问题,以对好评和差评进行分类。

我使用的数据和技术

我使用的数据集可以从 Kaggle 获得,由 23486 条不同的服装评论和 11 个不同的栏目组成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

snapshot of the data

我在这个项目中使用的工具有 numpy、pandas、matplotlib、seaborn、wordcloud、 sklearn 特别是与 CountVectorizerTfidfVectorizerKmeansTSNENMFTruncatedSVDsilhouette_scoreMultinomialNB

数据清洗&探索性数据分析(EDA)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

how many NAs in the dataset

  • 数据集中有一些 NAs,我将把它们放在这里。
  • ReviewText 列将是我的 NLP 主要列。
  • 除了 ReviewText 列,我还创建了另一个名为 CombinedText 的列,它将 Title 和 ReviewText 列连接在一起。因为我认为你也可以从评论标题中得到一些隐藏的数据。
  • 最后,我将清理后的数据保存起来以备将来使用。

WordCloud

接下来我要做的是创建一个单词云,看看人们谈论/使用最多的单词是什么。在此之前,我需要:

  1. 将我的文本全部修改成小写
  2. 删除评论中可能存在的一些不太有用的常用词,如连衣裙、连衣裙等。
  3. 然后使用 Count 和 TF-IDF 矢量器对文本数据进行矢量化。例如:
count_vectorizer = CountVectorizer(ngram_range=(1, 2),  
                                   stop_words='english', 
                                   token_pattern="**\\**b[a-z][a-z]+**\\**b",
                                   lowercase=**True**,
                                   max_df = 0.6, max_features=4000)
tfidf_vectorizer = TfidfVectorizer(ngram_range=(1, 2),  
                                   stop_words='english', 
                                   token_pattern="**\\**b[a-z][a-z]+**\\**b",
                                   lowercase=**True**,
                                   max_df = 0.6, max_features=4000)

cv_data = count_vectorizer.fit_transform(df.ReviewTextLower)
tfidf_data = tfidf_vectorizer.fit_transform(df.ReviewTextLower)

代码基本上是说将文本矢量化为 1-gram 和 2-gram(也尝试了 3-gram),使用包中预设的“英语”停用词,所有内容和模式都是小写,忽略文档中频率高于 0.6 的词,最多 4000 个特征/尺寸。

然后我用下面的代码创建一个单词云:

for_wordcloud = count_vectorizer.get_feature_names()
for_wordcloud = for_wordcloud
for_wordcloud_str = ' '.join(for_wordcloud)

wordcloud = WordCloud(width=800, height=400, background_color ='black',
                      min_font_size = 7).generate(for_wordcloud_str)

plt.figure(figsize=(20, 10), facecolor=**None**)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)

plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

most frequent words that customers are talking about

话题建模

在我做主题建模之前还有一步,就是使用 LSANMF 来降低我输入文本数据的维度。例如:

*# try using 10 dimensions*
n_comp = 10
lsa_tfidf = TruncatedSVD(n_components=n_comp)
lsa_cv = TruncatedSVD(n_components=n_comp)
nmf_tfidf = NMF(n_components=n_comp)
nmf_cv = NMF(n_components=n_comp)

lsa_tfidf_data = lsa_tfidf.fit_transform(tfidf_data)
lsa_cv_data = lsa_cv.fit_transform(cv_data)
nmf_tfidf_data = nmf_tfidf.fit_transform(tfidf_data)
nmf_cv_data = nmf_cv.fit_transform(cv_data)

然后我们可以进行主题建模,下面是一个输出示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

example of a few topics

您可以生成不同数量的主题,通过测试不同数量的主题来找到最佳数量,并查看这些主题对您是否有意义。

聚类

在运行聚类算法之前,最好您的输入数据标准化为平均值 0 和标准差 1。因为您的要素可能不在同一比例上,换句话说,这可能与从要素 a 增加 1 个单位和从要素 b 增加 1 个单位不是一回事。

*# initialize standardscaler*
**from** **sklearn.preprocessing** **import** StandardScaler
SS = StandardScaler()

*# transform my reducer data using standardscaler*
lsa_tfidf_data_sclaed = SS.fit_transform(lsa_tfidf_data)
lsa_cv_data_sclaed = SS.fit_transform(lsa_cv_data)
nmf_tfidf_data_scaled = SS.fit_transform(nmf_tfidf_data)
nmf_cv_data_scaled = SS.fit_transform(nmf_cv_data)

然后你可以使用无监督的机器学习算法,针对不同的话题或者不同类型的评论做聚类。在这个项目中,我使用了 KMeans ,还使用了惯性和轮廓分数作为代理来帮助我确定我应该使用的最佳聚类数。然后使用 TSNE 来帮助我可视化生成的集群。例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TSNE plots for different number of clusters

在确定了多少个聚类是最佳聚类之后,您可以打印出最接近每个聚类质心的文档以供检查。例如:

indices_max = [index **for** index, value **in** enumerate(kmeans.labels_) **if** value==3]
**for** rev_index **in** indices_max[:5]:
    print(rev_index, str(df.ReviewText[rev_index]))
    print("**\n**")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

example of a few documents

分类

我们可以尝试从分析文本数据中分离好的或坏的评论的另一件事是执行分类问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

snapshot of the data

在我们的数据中,我们有一个名为 Rating 的特性,它是客户对产品的评分,1 表示最不满意,5 表示最满意。

我们可以将 Rating 列设置为目标变量,将 engineered CombinedText 列设置为独立变量,看看是否可以构建一个分类器来自动对评论进行分类。

我做的第一件事是将排名 1 到 4 归为差评(标记为 1),而排名 5 是我们的好评(标记为 5)。这两个等级并不完全平衡,但都在可接受的范围内。我用朴素贝叶斯逻辑分类器构建了分类模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Before and After modification of the Rating column

我用于模型评估的指标,我使用回忆分数,因为我关心当我预测审查是好的审查但实际上不是时的情况。我得到的最好的召回分数是 0.74,没有太多的工程。如果在模型上有更多的时间和探索,分数可能会更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

recall score fo both bad (rank 1) and good (rank 5) reviews

吸取的教训

  • 无监督学习和有监督学习真的是天壤之别,因为它的本质!
  • 您将会花费大量时间来尝试理解如何对您的数据进行聚类,除了 KMeans 之外,还有许多聚类方法。
  • 在进行文本分析或 NLP 时,您可能会花费大量时间清理文本数据以获得最佳结果。例如,如何根据您的数据和您想要解决的问题的上下文来决定使用什么停用词,如何进行词条整理,如何进行向量化,如何降低维度并避免维度诅咒等等。

未来

如果我有机会延长该项目,我想跟进以下内容:

  • 探索不同类型的聚类算法和 NLP 技术。
  • 添加新的停用词。
  • 构建一个 Flask 原型应用程序来创建一个自动流程,从用户评论中推荐(分离)不同的主题。

非常感谢您的阅读,如果您有兴趣探索我使用的代码和资源,这个项目在我的 github repo 上。

作为强化学习问题的电子商务搜索重新排序

原文:https://towardsdatascience.com/e-commerce-search-re-ranking-as-a-reinforcement-learning-problem-a9d1561edbd0?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Clem Onojeghuo on Unsplash

作为一个术语,搜索是超负荷的:它既描述了寻找某物的愿望,也描述了寻找的过程。

任何搜索工作流程都有三个主要部分:

搜索预处理:涉及 查询理解 的整个工作流程。从 语言识别字符过滤标记化拼写纠正 词干化和词条化查询重写 (在查询理解之后,查询被传递给搜索引擎用于信息检索和排序。

**信息检索&排名:**它涉及检索在搜索引擎中被编入索引的信息(文档),并根据传递给搜索引擎的查询对它们进行排名。

**搜索后处理:**根据外部信号对从引擎检索到的搜索结果进行重新排序,并显示搜索结果。

搜索后处理—根据点击流数据重新排序

搜索最容易获得的外部信号/反馈之一是用户点击数据。我们试图将用户点击建模为相关性的函数,并对搜索结果进行重新排序。

聚集和处理的点击流数据(点击归一化的时间和位置)将具有以下形式:

在我们深入研究重新排序的方法之前,让我们定义一下本文中使用的一些术语。

确定性过程:指系统未来状态不涉及随机性的过程。如果我们从开始,相同的初始状态确定性模型将总是给相同的结果

**随机过程:**指随机确定的过程。随机优化产生并使用随机变量。

**马尔可夫决策过程:**指离散时间随机控制过程。它为决策过程提供了一个数学框架,其中结果部分是随机的,部分是由决策者控制的。它包含以下内容:

一个马尔可夫决策过程(MDP)是一个元组 M =(状态空间,动作空间,报酬,状态转移函数,折扣率)。MDP 的目标是找到一个从任意状态 s 开始最大化期望累积回报的策略。如果回报未知,这是一个强化学习问题。

强化学习侧重于在探索(未知领域)和利用(现有知识)之间找到平衡。

MDP 遵循马尔可夫性质,这意味着状态能够以这样一种方式简洁地总结过去的感觉,即所有相关信息都被保留,因此未来状态仅取决于当前状态。

多臂土匪:是 MDP 的特例,那里只有一个州。术语“多臂强盗”来自一个假设的实验,在该实验中,一个人必须在多个动作(即吃角子老虎机,即“单臂强盗”)中进行选择,每个动作都有未知的支付。目标是通过一系列选择来确定最佳或最有利可图的结果。在实验开始时,当赔率和支出未知时,赌徒必须确定要拉动的机器、其顺序和次数。

MDP 和多臂强盗的区别

为了区分 MDP 和多臂强盗,我们以餐馆为例:我们可能经常去我们最喜欢的餐馆,有时尝试一些新的,以找到一个潜在的更好的。如果说我们对每一家餐厅的偏好从未改变,土匪就是一个非常合适的提法。如果在吃了日本食物后,我们的偏好改变到中国食物,那么建模和探索状态转换是更合适的,因此 MDP。

回到重新排序的问题

学习排名方法是基于外部反馈的搜索结果重新排名的黄金标准。他们的工作原理是优化注释数据上的 NDCGMRR地图。这些方法有两个明显的缺点:

  • 它需要大量带注释的数据来训练,并且在索引/目录中引入新的文档/产品会使事情变得更加复杂。
  • 在获得大量反馈之前,它不会探索新的文档/产品,因此会引入偏见。

强化学习就是为了解决上述两个问题而出现的。

在搜索领域,如果我们有无限长时间的反馈数据,我们可以使用 frequentist 方法。尽管如此,因为那是不可能的,我们总是用当前的知识更新我们先前的信念(贝叶斯方法)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://xkcd.com/1132/

我们可以将搜索会话建模为 MDP,其中的流程如下:搜索查询 1、添加到购物车、搜索查询 2、添加到购物车……,结账。有一篇很棒的论文描述了这种方法。我们采用一种更直接的方法,其中我们为单个查询(单个状态)的点击建模,即多臂 Bandit。

作为多臂强盗问题的搜索重新排序

我们将针对搜索查询 q 检索到的搜索结果视为不同的手臂,将点击/添加到购物车的任何结果的概率视为拉动手臂的机会。在这种情况下,奖励将是最大化搜索查询 q 的点击/添加到购物车的总次数。

有多种方法可以解决多臂土匪问题。我们分析了实现它的不同方式。

1)贪婪

我们选择数量为ε,ε的用户来显示随机结果(拉随机臂),同时显示其余用户的最佳结果(拉得分最高的臂)。这有助于我们探索所有可能的组合。这里的主要挑战是选择正确的ε。如果太小,我们将无法探索所有的武器/产品。如果它太大,许多用户会发现自己的排名结果很差。

2)政策梯度

在该方法中,我们选择一个策略,例如 softmax 策略,并且从 softmax 分布中随机选择 arm。我们维持每个手臂/文档/产品的平均奖励,梯度代理向最大奖励方向移动。如果出现以下情况,这将是一种理想的方法:

  • 自观察开始以来,所有产品/武器均已推出&
  • 环境中没有新条目(搜索结果页面)。

3) 置信上限(UCB)

这种方法基于 面对不确定性的乐观主义原则 。我们取置信区间的上界,并据此选择产品/拉臂。如果能实时更新上面提到的表格,这是最好的方法之一。

4)汤姆逊取样

多臂 bandit 的最有效方法之一,它考虑了每个臂的概率分布(汇总表图 1)。这里的基本思想是,从每个 arms 元组(good_samples,total_samples),可以生成置信区间,并且可以在 LCB 和 UCB 之间给定随机值。

当总样本数较低时,间隔较宽。尽管如此,随着总样本数的增加,置信区间变紧,最好的结果开始持续获得更高的分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Chris Stucchio’s article on bandit algorithms illustrates sharpening of the probability distribution with increase sample size

这在开发和探索之间取得了完美的平衡。在这里,如果我们使用威尔逊的置信区间,而不是贝叶斯区间,我们会得到更好的结果,因为它们更好地模拟了数据中的不对称。

Tensorflow 刚刚发布了他们深度上下文土匪论文实现。将尝试在其中实现的方法,并将其与随机抽样进行比较。请关注此空间了解更多信息。

参考资料:

  1. https://medium . com/sajari/reinforcement-learning-assisted-search-ranking-a 594 CDC 36 c 29
  2. https://medium . com/@ dtunkelang/search-the-all-the-story-599 F5 d 9 c 20 c
  3. https://www . chriss tuccio . com/blog/2013/Bayesian _ bandit . html
  4. https://medium . com/hacking-and-gonzo/how-Reddit-ranking-algorithms-work-ef 111 e 33 d0 d 9
  5. https://www . Evan miller . org/how-not-to-sort-by-average-rating . html
  6. https://towards data science . com/how-not-to-sort-by-population-92745397 a7ae
  7. https://medium . com/@ sym 0920/the-多臂-土匪-问题-bba9ea35a1e4
  8. https://towards data science . com/13-非数学家多臂强盗问题解决方案-1b88b4c0b3fc

利用区块链和深度学习的电子投票设计

原文:https://towardsdatascience.com/e-voting-design-utilizing-blockchain-and-ai-6bb064a01874?source=collection_archive---------22-----------------------

研究如何利用区块链和深度学习来创建电子投票系统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Element5 Digital on Unsplash

投票是民主的一个重要方面,这是公民决定谁将领导国家的方式。这也意味着那个国家的未来会如何发展。我的祖国印度尼西亚目前正在为 2019 年总统选举投票。全世界大约有 1.93 亿人是合格选民。公民投票权对这个国家来说是一场后勤噩梦。为了做到这一点,让我们来分解一下数字:

印度尼西亚在全球招募了 600 万名选举雇员

印尼有 81 万个投票站

为了建立这些投票站,工作人员要乘飞机、乘船和步行到达偏远的村庄。这不是一个小的壮举,这是令人印象深刻的,总是让我惊讶的努力实现这一点。我们可以在选举的某一天这样做,公民可以自由投票。但是,有了技术,难道我们不应该让这变得更容易,更少欺诈,并帮助增加投票率,目前约为 76%。我们目前有技术可以帮助我们使投票更加安全和容易。

有两种技术可以重新定义信息的安全性以及个体性的保证,即区块链和深度学习。在这篇文章中,我们将经历不同的阶段,我认为电子投票将在选举期间开始整合。

第一阶段区块链整合

就地投票最重要的一个方面是确保你投给谁的信息被正确计算。目前的投票做法是用纸笔人工计票。这意味着在计票过程中存在人为失误的空间。有了区块链技术,我们将能够存储谁投了票和他们投了谁的票的信息,这可能是匿名的,取决于我们如何获得许可。这个问题有多种解决方法!

我们需要考虑这应该是在公共还是私人区块链。

如果我们要使用公开的区块链身份证信息,由于个人的安全原因,不应该公布。但目前公共区块链面临的最大问题之一是,截至 2019 年 4 月,在公共区块链上完成 1.9 亿笔交易是不可行的。让我们来看一些截至 2019 年 1 月的快速数据:XRP 最快的公共区块链大约每秒 1000 笔交易。如果我们只有 1 亿人与区块链一起投票,那么确认所有投票将需要大约 27.7 小时。但这是如果 XRP 只有在网络中投票确认,这是不正确的,因为其他类型的交易正在发生,这将意味着它将需要远远超过 27 小时。

我们已经看到了公共区块链存在的一些问题,这意味着目前这个系统通过使用许可区块链更加可行。根据区块链的类型,每秒可以处理大约 3000 个事务。因为在未来几年内,我们不可能让每个人都注册区块链。最无缝的方法是允许投票主持人输入 KYC 的选民数据,然后允许选民投票。这将有助于加快计票的处理速度,并确保数据的可靠性。因为我们使用基于许可的区块链,所以我们有办法控制谁能够查看信息,信息可以存储在哪里,以及如何与之交互。

第二阶段深度学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by teguhjati pras from Pixabay

但是,如果我们能够通过专门使用面部识别技术来利用 DL,从而使这一过程变得更加容易,那会怎么样呢?这项技术已经被利用了,比如你的 iPhone 解锁手机的时候。现在,iPhone 的技术非常强大,因为它使用深度感知来实现用户面部的准确性。这使得使用它来确保投票者是他们所说的那个人要安全得多。虽然这项技术已经存在,但在你将面部识别数据存储在哪里以及你将从哪里获得这些数据方面还存在一些问题。尽管有些国家的数据可能比其他国家更容易获得。

这些不仅是电子投票需要解决的问题,也是个人身份信息需要解决的问题。尤其是如果我们要开始把我们的身份放在区块链上。

投票的未来会是怎样的?

如果我们现实一点,对许多国家来说,最有可能的实现是首先保护数据。以下是我对现在或至少未来 2-3 年的设想。

1。个人将带着他们的 ID 进入投票站。然后,官员将检查个人的 ID,确保他们被允许投票,官员将用户的数据输入到区块链。这可以通过扫描 ID 或手动输入来完成。

2.一旦官员允许,他们就会去投票站投票。

区块链上有什么样的数据?

我们可以知道他们什么时候投票,谁是允许他们投票的官员,但我们可以这样做,这样我们就不知道你投了谁的票。这一切都是在不变性的环境中进行的,确保所有数据都没有被更改。

这也只是一个想法,但并非不可能实现。未来,我将能够登录我的政府应用程序账户,在我舒适的床上投票。当我打开手机时,它会扫描我的脸,我可以在几秒钟内立即投票。

非常感谢你的阅读!

说说你的想法?我们如何改进这个设计?有没有更无缝的集成?你认为我们永远不会有电子投票吗?

如果你喜欢这个想法,请在 LinkedIn 上与我交流,并在 Medium 上关注。

端到端学习,(几乎)通用的 ML 方法

原文:https://towardsdatascience.com/e2e-the-every-purpose-ml-method-5d4f20dafee4?source=collection_archive---------3-----------------------

E2E 可以用来解决每一个机器学习问题吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Su San Lee on Unsplash

对于那些从事机器学习的人来说,最重要的技能之一就是知道对于给定的问题,哪种方法是正确的选择。一些选择是琐碎的(例如,监督的或无监督的,回归或分类),因为它们与问题公式化本身有关。然而,即使在定义了你要解决的问题之后,通常还有无数的算法可以使用。

例如,假设您想要开发一个能够预测分类变量的系统。为了解决这个问题,可以使用分类树、K-最近邻或者甚至人工神经网络。当然,许多不同的算法存在是有原因的,即使它们解决的是类似的问题:每一种算法都有其特殊性,我们可以从中受益。

让任务变得更加困难的是,为了解决一些问题,如语音识别和自动驾驶,由许多层组成的架构是必要的(例如,预处理、特征提取、优化、预测、决策)。对于每一层,可以使用许多不同的算法。

问题是:为了获得更好的结果,必须应用内层的变化及其相应的算法。然而,由于每一层都负责解决特定的任务,因此很难确定这样的变化将如何影响整个系统。

端到端(E2E)学习指的是训练由代表完整目标系统的单个模型(特别是深度神经网络)代表的可能复杂的学习系统,绕过传统流水线设计中通常存在的中间层。

端到端学习

E 第二端到端学习是深度学习领域的一个热门话题,它利用深度神经网络(DNNs)的多层结构来解决复杂问题。类似于人的大脑,每个 DNN 层(或层组)可以专门执行此类问题所需的中间任务。Tobias Glasmachers 证明了 E2E 是如何在深度学习的背景下被构建的[1]:

“这种优雅但直截了当且有些蛮力的技术[E2E]已经在深度学习的背景下得到普及。这是深度神经架构模糊学习机和其他处理组件之间的经典界限的一个看似自然的结果,它通过将可能复杂的处理管道铸造到神经网络的连贯和灵活的建模语言中。”

这种替代方法已经成功地应用于解决许多复杂的问题。下面你可以看到 E2E 是如何应用于语音识别和自动驾驶问题的。

语音识别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Arthur Caranta

口语理解系统的传统方法设计是具有几个不同组件的流水线结构,由以下序列举例说明:

音频(输入)——>特征提取——>音素检测——>单词合成——>文本转录(输出)。

这种流水线结构的一个明显的限制是,每个模块必须在不同的标准下分别进行优化。E2E 方法包括用单个神经网络代替上述链,允许使用单个优化标准来增强系统:

音频(输入)————(神经网络)——→抄本(输出)

迈克·刘易斯等人介绍了自然语言谈判的 E2E 学习方法2。由此产生的系统是一个基于单个神经网络的对话代理,能够通过协商达成协议。这是通过使用来自包含各种不同谈判策略的大型人际谈判记录数据集的数据来训练神经网络来实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Mike Lewis et al. 2

E2E 方法的另一个好处是,尽管问题很复杂,但不需要深入了解问题,也可以设计出运行良好的模型。Ronan Collobert 等人解释了如何使用统一的神经网络架构和适当的自然语言处理(NLP)学习算法来避免特定任务工程和大量的先验知识[3]:

“[……]我们试图在多个基准测试中超越*,同时避免特定任务的工程。相反,我们使用一个能够发现足够的内部表示的单一学习系统。[……]我们避免特定任务工程特征的愿望阻止了我们使用大量的语言知识。相反,我们通过传输在大型无标签数据集上发现的中间表示,在大多数任务中达到良好的性能水平。我们称这种方法为“几乎从零开始”,以强调减少(但仍然重要)对先验 NLP 知识的依赖。*

自动驾驶

一个自主驾驶系统可以归类为由许多层组成的复杂系统的一个显著例子。根据 Alexandru Serban 等人提出的架构,我们可以使用 5 个不同的层来设计自动驾驶系统4:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Alexandru Serban et al. 4

输入数据来自几个传感器(照相机、激光雷达、雷达等)。)在传感器融合层进行处理,以提取相关特征(如物体检测)。处理完所有数据并提取相关特征后,在第二层创建一个“世界模型”。该模型包括周围环境以及车辆内部状态的完整图像。

根据这个模型,系统必须选择在行为层做出哪些决定。根据车辆的目标,基于系统策略提出多个行为选项,并通过应用一些优化标准来选择最佳的一个。

做出决定后,系统确定车辆必须执行的动作,以满足在规划层选择的行为,最后,控制值被发送到车辆控制层的执行器接口模块。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Bram Van Oost on Unsplash

在“自动驾驶汽车的端到端学习”一文中,Mariusz Bojarski 等人提出了一种 E2E 系统,能够直接从嵌入式摄像头提供的像素控制自动驾驶汽车5。该系统能够学习中间步骤的内部表示,例如检测有用的道路特征,仅使用人类转向角度作为训练信号。卷积神经网络(CNN)的使用在所提出的系统中起着重要的作用,因为它能够从图像数据中提取有用的特征:

“CNN 的突破是从训练样本中自动学习特征。CNN 方法在图像识别任务中尤其强大,因为卷积运算捕捉了图像的 2D 性质。”

设计的 CNN 超越了模式识别,学习驾驶汽车所需的整个处理流程。网络架构由 9 层组成,包括一个标准化层、5 个卷积层和 3 个全连接层。该系统使用在新泽西州中部、伊利诺伊州、密歇根州、宾夕法尼亚州和纽约收集的真实驾驶记录数据进行训练。下图显示了培训系统设计的框图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Mariusz Bojarski et al. 5

凭借大约 72 小时的驾驶数据,该系统能够学习如何在不同的道路类型和天气条件下驾驶汽车:

“从不到 100 小时的驾驶中获得的少量训练数据足以训练汽车在各种条件下运行,包括高速公路、本地和住宅区道路,以及晴天、多云和雨天。CNN 能够从非常稀疏的训练信号(单独转向)中学习有意义的道路特征。例如,该系统在训练期间学习检测道路的轮廓,而不需要明确的标签。”

E2E 的局限性

如果在输入和输出之间使用单个 DNN 对上述例子有效,为什么不使用它作为解决所有机器学习问题的通用方法呢?

许多原因使得 E2E 在不同情况下不可行:

  • 大量的数据是必要的:将一些先前的知识结合到训练中被认为是在许多应用中提高性能的关键因素。对于没有整合这种先验知识的 E2E 学习,必须提供更多的训练实例。
  • ***难以改进或修改系统:*如果必须应用某些结构变化(例如,通过添加更多功能来增加输入维度),则旧模型没有用,必须更换和重新训练整个 DNN。
  • ***高效可用模块无法使用:*很多技术在解决某些任务时是高效的。例如,最先进的物体识别系统在很大程度上是分布式的,但是一旦它被集成到 E2E 系统中,它就不能再被认为是 E2E 了。
  • 难以验证:如果需要高级别的验证,E2E 可能变得不可行。由于复杂的架构,潜在的输入/输出对的数量可能大到无法进行验证。这对于像汽车工业这样的行业来说尤其重要。

除了这些问题之外,E2E 可能不适用于某些应用,如[1]所示:

“我们已经证明,对于训练由多个非平凡模块组成的神经网络模型来说,端到端学习可能非常低效。端到端的学习甚至会完全中断;在最坏的情况下,没有一个模块能够学习。相比之下,每个模块能够学习其他模块是否已经被训练并且它们的重量被冻结。这表明,复杂学习机器的训练应该以结构化的方式进行,首先训练简单的模块,并独立于网络的其余部分。”

结论

End-to-end 无疑是解决复杂任务的绝佳工具。使用单一模型专门从输入直接预测输出的想法允许开发可以被认为是最先进的极其复杂的系统。然而,每一种增强都是有代价的:虽然在学术领域受到推崇,但由于需要大量的训练数据和验证的困难,行业仍然不愿意使用 E2E 来解决其问题。

参考

[1] Glasmachers,Tobias。“端到端学习的局限性。” arXiv 预印本 arXiv:1704.08305 (2017)。

2刘易斯、迈克等人,《交易还是不交易?用于谈判对话的端到端学习。” arXiv 预印本 arXiv:1706.05125 (2017)。

[3]科洛伯特、罗南等,《自然语言处理(几乎)从无到有》机器学习研究杂志 12。2011 年 8 月:2493–2537。

4塞尔班、亚历山德鲁·康斯坦丁、埃里克·波尔和约斯特·维瑟。“完全自动驾驶汽车的标准驱动软件架构.” 2018 IEEE 软件架构伴侣国际会议(ICSA-C) 。IEEE,2018。

5 Bojarski,Mariusz 等,“自动驾驶汽车的端到端学习” arXiv 预印本 arXiv:1604.07316 (2016)。

EagleView 使用 Keras 和 ArcGIS Pro 使用 Mask-RCNN/DeepLabV3+进行高分辨率图像语义分割

原文:https://towardsdatascience.com/eagleview-super-high-resolution-image-segmentation-with-deeplabv3-mask-rcnn-using-keras-arcgis-9be08caac42c?source=collection_archive---------19-----------------------

机器学习中的计算机视觉为 GIS 提供了巨大的机会。其任务包括获取、处理、分析和理解数字图像的方法,以及从现实世界中提取高维数据以产生数字或符号信息,例如以决策的形式。13在过去的几年里,计算机视觉正日益从传统的统计方法转向最先进的深度学习神经网络技术。

在这篇博客中,我将分享几个使用 Keras 和 ESRI ArcGIS Pro 工具以及深度学习和转移学习技术的经验实践,以从超高分辨率的 3 英寸 EagleView (Pictometry)影像构建建筑物足迹图像分割网络模型。

2018 年, ESRI 和微软与切萨皮克保护组织合作,训练深度神经网络模型,从 1 米 NAIP 分辨率航空影像数据源预测土地覆盖。该神经网络在架构上与 Ronnenberger 等人的 U-net ( 2015 )相似,是一种常用的语义分割模型。每年,佐治亚州科布县的 GIS 核心小组都会收到来自 EagleView(Pictometry)的 3 英寸超高分辨率正射影像。深度学习模型可以应用于这种超高分辨率的正射影像来分类土地覆盖或提取建筑物足迹吗?有几个挑战——超高分辨率图像通常呈现各种植被类型和重叠;建筑物和树木在图像中产生了浓重的阴影,这可能会对真实的地面物体进行错误的分类。

一开始,我非常保守,因为我决定使用一台只有 CPU 的笔记本电脑来训练大约 3800 幅图像。考虑到土地覆盖和建筑足迹的复杂性,这对于深度学习来说是一个相当小的数据集,因为如果你阅读教科书,经常会说深度学习需要大量的训练数据才能获得更好的性能。但这也是一个现实的分类问题:在现实世界中,即使是小规模的图像数据也很难收集,而且非常昂贵,有时甚至几乎不可能。能够使用小型数据集并训练一个强大的分类器是一个称职的数据科学家的关键技能。经过多次尝试和运行,结果证明非常有希望,特别是使用最先进的 Deeplabv3+和 Mask-RCNN 模型。

研究区域和训练图像数据集准备

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig.1 — Cobb County 2018 3in EagleView imagery covers with 433 1x1 mile tiles.

科布县的地理区域覆盖了分辨率为 3 英寸的 433 个 1 x 1 英里的图像切片。县 GIS 组在某些区域有一个建筑物覆盖区面图层。出于训练目的,选择了一个靠近县中心的图像切片作为图像训练数据集(图 1)。建筑物覆盖区面要素图层用于处理地面真实掩膜标注。ArcGIS Pro 2.4 版本中的“导出深度学习的训练数据”。地理处理工具的用于导出实例分割数据集的图像和掩膜(图 2)。输出图像的尺寸为 512x512x3,旋转角度设置为 90 度,以生成更多的图像来防止过度拟合,并帮助模型更好地泛化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 2 — ArcGIS “Export Training Data for Deep Learning”

1。用 Mask-RCNN 模型训练

生成的训练数据集包含超过 18000 个图像和标签。通过进一步的数据处理以去除没有标记的图像,最终数据集具有超过 15000 个训练图像和标签。然而,在只有 32gb 内存的笔记本电脑上,不可能将如此大的数据集输入到 Mask-RCNN 模型中,这需要巨大的内存来进行训练。

训练策略是看看概念验证将如何工作,所以我逐渐增加数据集,以 3800 个数据集的试验馈入 CNN。

我使用了令人印象深刻的开源实现 Mask-RCNN 库,MatterPort 在 Github 上构建了这个库来训练这个模型。

Mask-RCNN 有效地检测图像中的对象,同时为每个实例生成高质量的分割掩模。该方法通过与现有的用于边界框识别的分支并行地添加用于预测对象遮罩的分支来扩展更快的 R-CNN5。可以阅读研究论文更好的理解模型。(图 3)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 3. — Mask R-CNN framework for instance segmentation. Source: https://arxiv.org/abs/1703.06870

需要在类(Utils.dataset)中修改三个主要函数,以将您自己的数据集加载到框架中。有关数据加载实现,请参见下文。锚的比率设置为(16,32,64,128,256)以预测较小的住宅建筑尺寸。IMAGES_PER_GPU 设置为=1,因此 CPU 可用于训练模型(图 4)。图像和遮罩的示例(图 5)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 4 — Load Cobb Pictometry datasets to Mask-RCNN framework.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 5 — An example of a random image and mask from datasets.

这里,迁移学习技术应用于主干网 ResNet-101 模型。我首先用 epoch =5 训练最后完全连接的层,以适应住宅建筑类,然后用 35 个 epoch 训练整个网络。

在 32gb 的 CPU 上,完成训练过程需要将近 48 个小时(图 6 和图 7)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 6 — Model training result. The loss is reasonable good.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 7 — Loss charts.

这里有两个推论,原始图像没有用于训练(图 8 和图 9)。有趣的是,推断面具比原始面具更准确地描绘了建筑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 8 — Original image that was not used in training

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 9 — Inference mask more accurately delineating the building than the original mask.

另一个有趣的例子是,一幅图像没有用于训练和屏蔽推断结果(图 10 和图 11)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 10 — An image that was not used in training.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 11 — Inference instance masks.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 12 — This is a cropped image and inference mask not used in the training. The orange line indicates the image cropped position. With 3000 training datasets, the result is very promising.

2。用 Deeplabv3+型号训练 T3

Deeplabv3+是由谷歌研究团队开发的最新艺术级语义图像分割模型。该模型的特点是级联或并行使用 atrous 卷积,通过采用多个 atrous 速率来捕捉多尺度背景(图 13)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig.13 — https://ai.googleblog.com/2018/03/semantic-image-segmentation-with.html

使用来自 ArcGIS 的相同训练数据集导出深度学习工具的训练数据,对图像和掩膜进行增强处理,并保存到 HDF5 压缩文件中,以便于加载到训练模型中(图 14)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 14 — A random example of image and mask.

我在 Github 这里使用了 Deeplabv3+的 Keras 实现。下面是 Keras 训练模型和主干 Mobilenetv2,它的参数比 Xception 模型少(图 15)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig.15 — Define DeepLabv3+model.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 16 — Five epochs training result.

只有 5 个历元训练运行,结果非常有希望(图 16)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 17 — Training loss converged plot.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 18 — Image and inference from trained year 2018 imagery of Deeplabv3+ model

我运行 Python 脚本对任意裁剪的 2064x1463 尺寸图像进行推理,该脚本裁剪并处理 16 张(512x512x3 dim)图像以获得推理栅格。(图 19)。随着对图像的进一步检查和推断,我们可以看到建筑物阴影的影响会降低建筑物边缘的准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 19 — A cropped 2018 EagleView image with inference raster (25 rasters of 512x512 dim)

使用相同的训练模型来预测 2019 年裁剪图像的相同区域,结果非常相似,只有微小的局部差异(图 20)。该模型确实有助于未来一年的图像推断。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 20 — A cropped 2019 EagleView image with inference raster (25 rasters of 512x512 dim)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 21 — 2018 inference raster overlay the original image.

将上述图像和推论添加到 ArcGIS Pro 后。(图 21)

上面的影像栅格被转换为面要素,然后使用 ArcGIS Pro 3D analysis 中的正则化建筑物覆盖区和适当的参数来正则化原始检测。(图 22)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 22 — Use ArcGIS Pro Regularize Building Footprint tool to clean up building polygons.

然后,我用两张 20,000 x 20,000 尺寸的完整 2018 切片图像运行 python 推理脚本,这两张图像彼此相距约 3 英里。脚本裁剪并处理 1600 张(512x512x3 dim)图像以进行推理。使用 32GB RAM 的纯 CPU 笔记本电脑完成每个图块大约需要一个小时。参见(图 23)。有遗漏的分类建筑物主要是因为使用非常小的训练数据集和覆盖在建筑物顶部的树木。从该县的不同位置选择几个有代表性的瓦片作为训练数据集可以提高结果的准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig. 23 — Two complete tiles of EagleView 2018 image with inference raster (1600 rasters of 512x512 dim on each)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

fig.24 inference raster overlay the image tile in ArcGIS Pro.

结论:

虽然它是一个相对较小的数据集,但 Mask-RCNN 和 Deeplabv3+深度学习模型都使用转移学习技术为超高分辨率图像分割提供了有希望的结果。由于原始建筑物覆盖区地面真实要素多边形的精度较低,以及笔记本电脑 CPU 和内存的限制,在某些图像分类和实例分割中,性能结果可能无法超越人类数字化仪。然而,这种深度学习训练过程的准确性可以通过增加来自该县不同位置的高质量训练数据集以及应用数据变化增强方法来进一步增强。该模型可用于多年影像以推断用于比较的要素检测,甚至可用于 ArcGIS 工具模型构建器的低成本要素描绘,以实现业务任务的自动化。更重要的是,上述深度学习训练过程可以应用于其他类型的图像实例或分割案例。( 请看我下一篇博客 )

1。赖因哈德·克莱特(2014)。简洁的计算机视觉。斯普林格。ISBN978–1–4471–6320–6。**

2。琳达·夏皮罗;乔治·斯托克曼(2001 年)。计算机视觉。普伦蒂斯霍尔。ISBN978–0–13–030796–5**

3。蒂姆·莫里斯(2004)。计算机视觉和图像处理。帕尔格雷夫·麦克米伦。ISBN978–0–333–99451–1。****

4。Bernd jhne;霍斯特·豪埃克(2000 年)。计算机视觉与应用,学生和从业者指南。学术出版社 书号978–013085198-7。**

5。 【明凯】格鲁吉亚彼得·多拉尔*罗斯·吉希克 (2018)。面具-RCNN https://arxiv.org/abs/1703.06870v3*****

6. Deeplabv3+ model,https://github . com/tensor flow/models/tree/master/research/deep lab

7。https://blog . keras . io/building-powerful-image-class ification-models-using-very-little-data . html

8。http://pro . ArcGIS . com/en/pro-app/tool-reference/image-analyst/export-training-data-for-deep-learning . htm

9。https://pro . ArcGIS . com/en/pro-app/tool-reference/3d-analyst/regulate-building-footprint . htm

10。https://blogs . TechNet . Microsoft . com/machine learning/2018/03/12/pixel-level-land-cover-class ification-using-the-geo-ai-data-science-virtual-machine-and-batch-ai/

11。U-Net:用于生物医学图像分割的卷积网络:https//lmb . informatik . uni-freiburg . de/people/Ron neber/u-Net/

耳朵生物识别—机器学习更进一步…

原文:https://towardsdatascience.com/ear-biometrics-machine-learning-a-little-further-1839e5d3e322?source=collection_archive---------9-----------------------

更精确的生物识别技术的领先创新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Neural Networks (Image by Gerd Altmann from Pixabay)

像其他使用面部、虹膜和手指的生物特征一样,耳朵作为一种生物特征包含大量特定和独特的特征,允许进行人类识别。耳朵的形态在 10 岁后会有轻微的变化,医学研究表明,耳朵形状的显著变化只发生在 8 岁前和 70 岁后。随着年龄的增长,它的大小确实对称地增长,并开始向下凸出,但这是一个可测量的影响。研究表明,耳朵每年只变化 1.22 毫米。还有,耳朵的颜色分布和脸不一样,几乎是均匀的。耳朵的位置几乎在侧面脸的中间。甚至在对象从远处没有意识到的情况下,也可以捕获耳朵数据。人耳生物特征可以作为被动生物特征的一个很好的例子,并且不需要主体的太多合作,这满足了当前环境中认证系统的保密性要求。

数码相机从不同角度拍摄环境中对象的侧面人脸图像,从中分割、预处理耳朵部分。然后在不同的测试情况下分析特征向量,这些测试情况包括人脸在同一平面、不同平面、不同光照条件等的旋转。将作为输入提供给机器学习模型,该模型将被训练以识别环境中的人。该过程虽然复杂,但将开发一种系统,该系统将提供经认证的基于耳朵的生物识别系统。

受控环境

相机 A 的目的是在不期望耳朵有太大倾斜或旋转的情况下获得侧面脸部的清晰照片。同时,相机 B 和相机 C 用于为同一个人的多个图像捕获更多的侧面照片,以形成特征矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Environment

从侧面人脸分割耳朵—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Camera — A

图像(a)是从照相机捕捉的侧面脸。在图像(b)中,完成了地形标记。地形标记用于查找曲面和边缘。图像©是腐蚀和膨胀的差异,即对轮廓面应用形态学操作以锐化特征。图像(d)是(b)和©的简单点积。通过模糊(d) 10 次来获得图像(e ),从而可以应用连通分量分析。在图像(f)中,找到每个连通分量的复杂度,并用不同的
颜色进行着色。由于发现最复杂的区域是耳朵,为了更快的计算,将其分割并转换成图像(g)中的灰度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Camera — B & C

数据集和预处理

数据集准备是任何机器学习模型的第一步。在该系统中,使用一个深度神经网络来获取环境中对象的特征和特性。需要一个大的数据集作为神经网络的输入。每个对象至少 500 个图像来适当地训练网络,因为所有类别都是耳朵机器的图像,很容易与特征和特性混淆,每个对象的样本越多,就越容易找到明显的特征。数据集应涵盖各种各样的图像,例如不同光照条件、不同角度、高斯滤波器、模糊等的图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DNN Architecture

在训练 CNN 网络的时候,有一些小的遮挡需要被覆盖,比如耳朵被头发、耳机或珠宝覆盖。图像增强有助于生成多份略有变化的图像副本,从而增加数据集。例如,可以使用 Keras 的数据发生器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dataset with slight variations

DATADIR = "./dataset"
CATEGORIES = ["Subject1", "Subject2", "Subject3", "Subject4"]

for category in CATEGORIES:
    path = os.path.join(DATADIR, category)

    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
        break
    break

IMG_WIDTH = 60
IMG_HEIGHT = 100
new_array = cv2.resize(img_array, (IMG_WIDTH, IMG_HEIGHT))

training_data = []

def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)

        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_WIDTH, IMG_HEIGHT))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass

create_training_data()
print(len(training_data))

random.shuffle(training_data)

卷积神经网络

因为我们使用的是图像数据集(而不是。csv 文件或数字数据),在数据预处理完成后使用 CNN。预处理的数据被传递到神经网络的结构。由于耳朵的表面积小于面部,因此耳朵所需的计算时间也较少。灰度图像由网络的输入层获取。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CNN Architecture

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Convolution

步幅卷积和最大池用于增加每个隐藏层的深度(特征)。

卷积滤波器减少 9 个图像像素以生成单个像素,而不影响特征。

a = []      #feature set
b = []      #labels

for features, labels in training_data:
    a.append(features)
    b.append(labels)

a = np.array(a).reshape(-1, IMG_WIDTH, IMG_HEIGHT, 1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Depth Increase (Pixel decrease)

# Create the model
model = Sequential()

model.add(Conv2D(32, kernel_size=4, strides=1,activation='relu', input_shape=(IMG_WIDTH, IMG_HEIGHT, 1)))
model.add(Conv2D(32, kernel_size=4, strides=2,activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(64, kernel_size=4, strides=1,activation='relu'))
model.add(MaxPooling2D(pool_size=2))
# model.add(Conv2D(64, kernel_size=4, strides=2,activation='relu'))
# model.add(Dropout(0.5))
# model.add(Conv2D(64, kernel_size=4, strides=1,activation='relu'))
# model.add(Conv2D(64, kernel_size=4, strides=2,activation='relu'))
model.summary()

model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4, activation='softmax'))
model.summary()

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train the model
model.fit(X_train, to_categorical(Y_train), batch_size=32, epochs=5)# Evaluate the model
scores = model.evaluate(X_test, to_categorical(Y_test))

print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

model.save('model_opt.h5')

在最后的密集层中,完成特征分类(FC ),基于该特征分类将对象分类到网络的相应类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Training and testing

图表显示了深度神经网络的同一类的重叠曲线和不同类的不同曲线的精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Graph

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Authorized user

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unauthorized user

限制

可能会有不同类型的遮挡情况,如头发、耳机或耳朵受伤或被布覆盖。个人获得认证的机会将变得更少。由于用于特征提取的纯耳百分比较小,因此精度会受到影响。该系统旨在关注小型环境房间,如安全室、董事会议、医学实验室等。

未来范围

耳朵是人体中最小的骨头。这对于网络罪犯来说很难复制。此外,它还可以用来测量温度、血流量、心率和葡萄糖水平。Ear 生物识别系统将在以下领域有多种用途:身份验证、访问和考勤控制、旅行控制、需要授权的金融和其他交易、远程投票、自动化工作设备的使用、行动控制。例如,如今机场使用面部和虹膜生物测定的组合来认证个人,相反,可以使用单耳生物测定系统来以相同的准确度实现个人的真实性。身体的每一个特征都会影响一个人的总体性格——脸、眼睛、手掌甚至笔迹。通过笔迹的个性分析被用于检测该人是否在说谎等。同样,耳朵可以用来分析一个人的性格。耳垂有很多可以用于性格分析的特征——附耳垂、宽耳垂、窄耳、尖耳、圆耳垂、方耳、耳突等。

总结

耳朵生物识别系统的最大优点是在人们不知情的情况下识别他们。这一特性将改变被动生物识别的动态,并可以在生物识别领域实现完全自动化。指向焦点—

  • 具有各种图像的大型数据集(每个受试者 500 个样本),用于正确训练学习模型。
  • 预处理图像以减少计算时间。
  • 良好的网络架构(没有太多损失或丢失)。
  • 运行足够多的历元来高效训练网络(建议用 GPU)。
  • 使用训练好的模型来精确地预测这个人。

恭喜你坚持到了最后。太棒了。点击这里从我的 GitHub 账户获取源代码。

请随意提问,因为我们正在学习和机器一样的东西…

参考文献—

  1. 闫平和凯文·w·鲍耶,IEEE 研究员,“使用 3D 耳朵形状的生物识别”,IEEE 模式分析和机器智能汇刊,第 29 卷,第 8 期,2007 年 8 月
  2. John D. Bustard,IEEE 学生会员,和 Mark S. Nixon,IEEE 准会员,“从二维图像进行不受约束的人耳识别”,IEEE 系统、人和控制论汇刊-A 部分:系统和人类,第 40 卷,第 3 期,2010 年 5 月
  3. 智能系统研究中心的比尔·巴努和惠辰。计算机人耳识别。加州:加州大学河滨分校【在线】。doi:10.1007/978–1–84800–129–9。
  4. Eyad Haj Said,北卡罗来纳州立农业技术大学,北卡罗来纳州格林斯博罗,Ayman Abaza 和 Hany Ammar,计算机科学和电气工程系。“使用数学形态学在彩色面部图像中进行人耳分割”,IEEE 2008。

推土机的距离

原文:https://towardsdatascience.com/earth-movers-distance-68fff0363ef2?source=collection_archive---------5-----------------------

语义搜索中文档相似性的语义度量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Luis Enrique Ruiz Carvajal on Unsplash

⚠️在我的博客⚠️中读到了的原帖

这是我最初的语义搜索帖子的续篇。这个是关于推土机的距离,可以应用在语义搜索上。

动机

语义搜索引擎从其本体中检索结果的方式是通过计算与查询最接近/最相似的文档。为了获得顶部最相似的文档,该算法计算查询和许多文档之间的距离。当获得相似性时,文档被相应地排序,并且位于顶部的文档被检索。

例如,假设本体有 5 个文档:

  • 查询:'我如何开始数据科学的职业生涯?’
  • 文档 1: 《烹饪的科学:如何做出一顿丰盛的饭菜》
  • 文件二:‘2019 年数据科学突破
  • 文档 3: ’ 海洋生物学家获得数据科学工作的指南’
  • 文献 4:‘关于黑猩猩的数据是行为科学的基础’
  • 文档 5:‘数据科学是 21 世纪的顶级职业’

首先,我们计算查询和 5 个文档之间的距离,将具有最高相似性的文档返回给用户。

文档之间的这个距离是什么?人类可以很快知道哪个文档最适合这个查询,因为语言是我们与生俱来的,我们理解每个单词和整个句子的意思,我们甚至可以预测每个文档是关于什么的。简单的语法错误或稍微不同的词序不会影响我们的思维过程。

在几秒钟内,我们得出结论,文档#3 是最接近的:即使用户可能没有海洋生物学背景,海洋生物学家的经验可能会被证明是有用的。

但是计算机是如何计算两个句子之间的距离的呢?一个句子不仅仅是一系列单词:每个单词都有它的位置,有一个我们凭直觉理解的无形的潜在语法结构,因为我们从出生开始就接触语言,但计算机在历史上很难获得这种“直觉”。

一个简单的文档相似性度量是计算两个句子之间有多少共同的单词,而不考虑位置:

  • d(查询,文档 1) = 3(科学,如何,a)
  • d(查询,文档 2) = 2(数据,科学)
  • d(查询,文档 3) = 3 (a,数据,科学)
  • d(查询,文档 4) = 2(数据,科学)
  • d(query,doc5) = 4(数据,科学,职业,in)

根据这个标准,文档#5 是与查询最相似的文档。但是我们很快意识到有些词是不相关的,‘a’。how ‘,’ in '等词并没有给句子增加意义。这些词被称为停用词,在大多数文本处理算法中会被删除。

词汇上的细微变化也不包括在这个指标中。动词的现在时与过去时、单数与复数、副词与形容词等。被认为是不同的词,而实际上,它们指的是几乎相同的术语。词干化、词汇化和标记化是获取单词词根形式的方法。

最后,文档#3 应该因为包含单词“job”而得分,在这个上下文中,它是“career”的同义词。“职业”和“工作”应视为等同物。,与文件#5 中的“职业”一词相同。在算法中包含同义词覆盖率可以大大提高性能。

如果我们深入挖掘,有人可能会说“我如何做 X”在意思上类似于“某人做 X 的指南”,尽管实现它是另一回事。

总之,使用语义文档相似性度量的动机是通过使用同义词、下义词等语义特征来改进现有的度量。

有许多文档相似性度量,词汇的和语义的。你可以读到他们中的许多人,更偏重于理论更实用

这篇文章是关于运土机的距离(EMD)的,这是一种语义方法,其中考虑了单词的含义和用户的意图。

推土机距离(EMD)

在 EMD 的情况下,文档之间的距离基于单词之间的语义距离,其中单词存储在称为 WordNet 的电子词汇数据库中。一旦获得单词之间的语义距离,EMD 通过单词之间的多对多匹配来计算文档相似度。也就是说,一个文档中的三个单词可能与另一个文档中的一个单词意思相同。[1]

1.定义

让我们从句子、单词和文档中抽象出来,假设文档是加权点的分布。分布是位置为和权重为的元组。

两种分布之间的 EMD 与将一种分布转换成另一种分布所需的最小工作量成比例。

1 单位是将一单位重量移动一单位距离所需的功。

2.直觉

直觉上,重量从一个分布流向另一个分布,直到它们相同,类似于用成堆的灰尘填充。一个分布充当一组孔,而另一个分布的点是污垢。2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example 1

从空间中显示两个分布的初始点开始,一个分布被指定为灰尘的角色,而其他分布被指定为孔的角色,每个灰尘点被指定为孔的一个点(不一定每个孔的点都有一个灰尘点),并且灰尘反复地向孔“移动”,直到它填满孔。

移动灰尘的成本/ 工作取决于灰尘的重量/数量以及需要移动的距离。

点与点之间的地面距离度量可以是欧几里得,曼哈顿…但是不要把这个距离和单词之间的距离混淆。这个地面距离仅仅是维度空间中的点之间的距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example 2

在示例#2 中,红色分布必须覆盖的距离大于示例#1 中的距离,因此需要更多的来“移动灰尘”。

EMD 算法的目标是优化如何分配权重,以使所有的灰尘覆盖所有的孔洞,同时将权重移动尽可能短的距离。

注意:在这种情况下,两种分布是平衡的,也就是说,污垢的数量等于孔的数量。一旦所有的洞都被盖住了,就不会有灰尘留下,或者一旦所有的灰尘都被放进去,就不会有多余的洞了。如果你想看到不平衡的分布,考虑阅读2

有许多方法来分配权重,红色分布中最左边的脏点可以与蓝色分布中最低的洞点相匹配,但这不是很有效。计算 EMD 的一个步骤是获得两个分布之间最可行的流量

3.注释

符号和公式可以在我的演示文稿[0]的幻灯片中找到。我试着让这篇文章更加理论化和直观化,而不要过于深入数学。

4.流动

给定两个分布 x 和 y,它们之间的流是定义 x 和 y 之间的权重分布的任何矩阵 F。矩阵 F 中的每个点 f_ij 表示 x_i 处与 y_j 匹配的权重量。

注意:强调 any, a 流可以是任意的权重分布,无论是否有效。寻找有效/可行的流程是 EMD 所基于的优化问题。

**寻找可行流:**流 F 是可行的当且仅当它满足每个 f_ij 的以下约束:2

  1. f_ij 必须为正,匹配权重不能为负。
  2. 移动到孔 y_j 的重量不能超过 x_i 中存在的重量。最多可以移动污垢点中的所有污垢。
  3. 从污垢点 x_i 移动的重量不能超过 y_j 中存在的“孔”的量。孔中不能有污垢溢出。
  4. 在所有点上移动的所有重量必须是分布中的总重量。所有的灰尘必须盖住所有的洞,没错。没有污垢漂浮在周围,没有洞被覆盖。

满足这些要求的流程被认为是可行的。

5.工作

可行流在匹配 x 和 y 时所做的是 x 和 y 中每个点的匹配权重乘以距离

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.电机驱动的(electric motor-driven 的缩写)

推土机的距离是匹配 x 和 y 的最小工作量,由较轻分布的总重量标准化,但在这种情况下,两种分布具有相同的总重量,因此不存在较轻分布。功简单地除以一个分布的总重量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化问题是找到最小化工作的流。重量,所有的重量,都必须移动。但是哪个权值到哪个点,用什么量,取决于点与点之间的距离,这样权值就不用移动太远,这就是优化问题。

7.一些例子2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example 3

关于工作的非最佳与最佳流程。在左边的场景中,0.26 重量(d=316.3)所覆盖的距离导致功如此之高。这个例子相当直观,最优流量相对容易获得。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example 4

一个不太直观的例子,在这种情况下,分布中的*总权重是不同的。*所以要么会有脏物溢出,要么孔不会被完全盖住。

8。总结

推土机的距离是将一种分布移动/转换成另一种分布所需的距离。这些分布的两个特征是点在一个空间中,在例子中是 2D,并且每个点都有一定的权重。通过计算分配这些权重的最有效方式,我们得到一个表示 EMD 的数字。

9.EMD 作为文档相似性的语义度量

这与这篇文章要讨论的文档相似性的语义度量有什么关系?正如开头提到的,文档之间的距离是基于单词之间的语义距离,其中单词存储在一个称为 WordNet 的电子词汇数据库中。让我们试着将这个 WordNet 表示映射成点数和权重的分布:3

  • WordNet 是一个大型图形或语义网络,其中网络的每个节点代表一个真实世界的概念(房子、老师、艺术)。
  • 每个节点包括:
    一个 synset ,一组表示相同概念的同义词,以及
    一个 gloss ,一个真实世界概念的简短定义或描述。
  • 同素集之间的每个链接描述了同素集所代表的真实世界概念之间的一种语义关系(上义词、下义词、部分义词、全义词等)。

句子 X 可以被描述为点和权重的分布,其中:

  • 这些点是单词的 WordNet 表示(在长度为 N 的向量中,我们可以将其视为一个 N 维空间)
  • 权重是单词的 TF-IDF 值(显示单词对于文档有多重要的度量)。5

通过找到最小化工作以匹配 x 和 y 的流来计算 EMD,归一化为 1,并且如下获得文档相似度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

推土机的距离是一种距离,其中 N 维空间中的点的位置和重量是关键的。

通过将单词转换为单词向量,将权重转换为 TF-IDF 值,EMD 可以用作文档相似性的语义度量。

与语义搜索的关系

EMD 可以用来计算查询和文档的语义相似度,从而在语义搜索的本体匹配阶段发挥作用。

字移动器的距离

WMD 是 EMD 的一个类似的、更新的变体,但是使用 word2vec 而不是 WordNet。它发布于 2015 年[6],有几个实现教程可用,对学习 measure 的实现方面非常有用。

为了我的演讲,我对这个话题进行了深入的研究,我希望我用一种清晰简洁的方式对它进行了总结。如果有什么解释得不够好,我很乐意再试一次。

我真的很感激任何反馈,不完整或错误的信息,我可能已经包括在内。感谢您的阅读!

参考

[0]: 语义搜索,2018 年我在 LMU 大学攻读硕士学位时发表的演讲幻灯片

[1]: 面向基于命名实体的相似性度量:挑战与机遇,De Nies 等人,2014

[3]: 将词典和语料库信息合并到语义相关度的上下文向量测量中,Pathwardan,明尼苏达大学,2003 年

[6]: 从单词嵌入到文档距离,Kusner 等,2015。

相关链接

请求原谅比请求许可更容易:一个简短的 Python 例子。

原文:https://towardsdatascience.com/easier-to-ask-for-forgiveness-than-permission-a-short-python-example-e115566a3b8c?source=collection_archive---------29-----------------------

一个简单的概念,可以帮助您避免重复解析所有给定的数据,而您只需要用一个小样本来交叉检查它们。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Pisit Heng on Unsplash

想象一下,你已经记下了你看过的电影,以及每部电影你看了多少次。

出于某种奇怪的原因,您将注释保存在 python 字典中:-),
其中键是电影标题,值是您观看电影的次数。

movies = {
...
'The Godfather' : 5,
'Pulp Fiction' : 2,
...
}

在某个时候,你决定你只想在你的字典里保留黑帮电影,而不是别的。
所以你得用黑帮电影清单来反复核对你的字典。

一种方法是获取字典键,并查看它们是否包含在给定的黑帮列表中。
这个结果到 O(k*n) 动作总计,如果我们在黑帮名单里有 k 值,在电影字典里有 n 值

gangster_list = [..] # k valuesfor key in movies.keys(): # n values
    if movies[key] in gangster_list:
        continue
    else:
        del movies[key]# O(k*n) actions in total

但是如果黑帮电影排行榜包含了 100 万部电影,其中你看过的黑帮电影接近大黑帮排行榜的末尾呢?

假设你已经看了 10 部黑帮电影。
上面的‘in’检查将导致对你所观看的每部电影的几乎整个黑帮列表进行解析,结果是:
O([列表中的 1m 个值] * [观看的 10 部黑帮电影]) = O(10m)个动作。

反而是请求原谅比请求允许更容易!

我们可以用 O(k)行动的成本从大黑帮名单中产生一个虚拟字典:

gangster_dic = {}
for movie in gangster_list:
    gangster_dic[movie] = None

而黑帮字典的内容将会是:

{ # k keys without values
...
'Goodfellas' : None,
'The Untouchables' : None,
...
}
del gangster_list # To balance used memory

现在,我们可以直接搜索每个观看过的电影名称:

for key in movies.keys(): # n values
    # O(1) action
    try:
        gangster_dic[key]
        # do nothing: this is a gangster movie
    except KeyError:
        del movies[key]
        # delete the movie, since we did not find it in the   
        # gangster movies dictionary

如果我们失败了,没什么大不了的;我们处理异常。

**这其实是我们想要的:**为了例外发生而删除了一部我们看过的电影,那不是黑帮片。

总的来说,动作的成本是:
O(k)用于字典,加上
O(n * 1)用于检查所观看的电影在黑帮电影集合中是否存在,
导致总共 O(k+m) 个动作。

如果我们再次假设,k=1m,n=10,那么我们总共得到(1m+10) = O(1m)个动作。

我们将所需行动从最初的 1000 万减少到了 100 万!或者总的来说需要的动作少了#n 倍!

**请求原谅比请求许可容易**这个概念多次对我派上用场。我希望你也会发现它很有用!

使用 PySpark 轻松查询 Python 中的 ORC 数据

原文:https://towardsdatascience.com/easily-query-orc-data-in-python-with-pyspark-572749196828?source=collection_archive---------25-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Eric Han on Unsplash

优化的行列(ORC)是一种面向列的数据存储格式,是 Apache Hadoop 家族的一部分。虽然 ORC 文件和处理它们通常不在数据科学家的工作范围内,但有时您需要提取这些文件,并使用您选择的数据管理库来处理它们。

最近,我遇到了一种情况,我想处理一些以 ORC 格式存储的对象数据。当我把它读出来时,我不能直接把它写到数据帧中。我想分享一些以 ORC 格式获取数据并将其转换成更容易接受的格式的技巧,比如熊猫数据帧或 CSV。

为此,我们将利用 Pyspark。如果你刚刚开始使用 Pyspark,这里有一个很棒的介绍。在本教程中,我们将快速浏览 PySpark 库,并展示如何读取 ORC 文件,并将其读出到 Pandas 中。

我们将从终端内部安装 PySpark 库

Pip install pyspark

从这里,我们将引入 PySpark 库的两个部分,SparkContext 和 SQLContext。如果你是 Spark 新手,那么我推荐这个教程。您可以将 SparkContext 视为所有 Apache Spark 服务的入口点,也是我们 Spark 应用程序的核心。SQLContext 被认为是 Spark SQL 功能的入口点,使用 SQLContext 允许您以一种熟悉的、类似 SQL 的方式查询 Spark 数据。

from pyspark import SparkContext, SQLContext
sc = SparkContext(“local”, “SQL App”)
sqlContext = SQLContext(sc)

你可以在上面的代码中看到,我们还为 SparkContext 声明了一些细节。在这种情况下,我们说我们的代码在本地运行,我们给它一个 appName,在这种情况下我们称之为“SQL App”。

一旦我们创建了 SparkContext(这里称为 sc ),我们就将它传递给 SQLContext 类来初始化 SparkSQL。

至此,我们已经安装了 PySpark 并创建了 Spark 和 SQL 上下文。现在到了重要的一点,读取和转换 ORC 数据!假设我们将数据存储在与 python 脚本相同的文件夹中,它被称为“objectHolder”。要将它读入 PySpark 数据帧,我们只需运行以下命令:

df = sqlContext.read.format(‘orc’).load(‘objectHolder’)

如果我们想把这个数据帧转换成熊猫数据帧,我们可以简单地做以下事情:

pandas_df = df.toPandas()

综上所述,我们的代码如下:

from pyspark import SparkContext, SQLContext
sc = SparkContext(“local”, “SQL App”)
sqlContext = SQLContext(sc)
df = sqlContext.read.format(‘orc’).load(‘objectHolder’)
pandas_df = df.toPandas()

现在我们有了。只用几行代码,我们就可以读取一个本地 orc 文件,并将其转换成我们更习惯的格式,在这个例子中,是一个熊猫数据帧。

使用 Python 轻松抓取和总结新闻文章

原文:https://towardsdatascience.com/easily-scrape-and-summarize-news-articles-using-python-dfc7667d9e74?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

There’s lots of news to read and lots of coffee to drink!

在今天的数字世界中,我们被无尽的信息轰炸。我们有无限滚动的社交媒体和 24 小时新闻循环。因此,有大量的新闻需要关注,我们必须能够快速消化!

因此,让我们来做一个练习,将新闻文章压缩到更容易理解的大小。

我们将使用 requestsBeautifulSoup 包抓取一篇示例文章,然后我们将使用优秀的 gensim 库对其进行总结。你可以通过在我的 Github 上下载这个 Jupyter 笔记本来参与互动。

让我们开始吧!

# Imports
import requests
from bs4 import BeautifulSoup
from gensim.summarization import summarize

现在我们来挑选一篇有趣的文章:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Link - I want to read it. But I bet it’s TOO long!

现在我们有了一篇文章,我们将检索它的内容:

# Retrieve page text
url = '[https://www.npr.org/2019/07/10/740387601/university-of-texas-austin-promises-free-tuition-for-low-income-students-in-2020](https://www.npr.org/2019/07/10/740387601/university-of-texas-austin-promises-free-tuition-for-low-income-students-in-2020)'
page = requests.get(url).text

网页抓取:

现在我们刮吧!

首先,我们将把页面内容转换成一个 BeautifulSoup 对象,这将允许我们解析 HTML 标签。

# Turn page into BeautifulSoup object to access HTML tags
soup = BeautifulSoup(page)

然后,我们需要找出哪些 HTML 标签包含文章的标题和正文。对于一个伟大的 HTML 入门,看看HTML.com

为此,我们将使用 Google Chrome 出色的 Inspect 工具。在新标签中打开我们选择的新闻文章,在页面上点击右键,从下拉菜单中选择 Inspect 。这将调出检查工具,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

If for some reason you’re not using Chrome, now’s the time to start

单击上面概述的小按钮,找到与您在页面上看到的任何内容相对应的 HTML 标签。

当您将鼠标悬停在页面上您想要选择的文本上时,在本例中是文章的标题和正文,您将看到哪些 HTML 标签用于标识该文本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Headline is identified with the

tag

文章标题被

标签包围。我们将选择页面上的第一个

标签,如下所示:

# Get headline
headline = soup.find('h1').get_text()

文章的正文由

标签包围。这一次我们必须找到页面上包含的< p >标签中的所有标签,因为文章的每个段落都包含在一个< p >标签中。

# Get text from all <p> tags.
p_tags = soup.find_all('p’)
# Get the text from each of the “p” tags and strip surrounding whitespace.
p_tags_text = [tag.get_text().strip() for tag in p_tags]

如果您检查我们在’ p_tags_text’ 变量中检索到的文本,您会注意到有些文本不是来自主文章,比如作者的名字和一些图像标题。因为它们也是用< p >标签描述的,所以我们也选择了它们。为了清理我们所拥有的文本,我们可以使用一些快速列表理解来过滤掉我们所知道的不属于主要文章的文本类型。

在本文中,图像标题包含换行符’ \n '来添加空格。因为我们知道文章中的实际句子不会有随机的换行符,所以我们可以安全地删除它们。类似地,我们可以删除不包含句号的文本,因为我们知道文章中任何合适的句子都会包含句号。这将漏掉作者的名字和其他一些不相关的信息。

# Filter out sentences that contain newline characters '\n' or don't contain periods.
sentence_list = [sentence for sentence in p_tags_text if not '\n' in sentence]
sentence_list = [sentence for sentence in sentence_list if '.' in sentence]
# Combine list items into string.
article = ' '.join(sentence_list)

总结:

现在我们有了文章的正文,我们可以对它进行总结了。

Gensim 是一个用于各种 NLP 任务的优秀 Python 包。它包括一个相当强大的摘要功能,易于使用。它是基于本文 ( 文档)的发现的 TextRank 算法的变体。正如您将看到的,我们可以在一行代码中使用它:

summary = summarize(article_text, ratio=0.3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

That’s pretty good!

你有它!我们已经检索了文章的标题,并创建了内容摘要。现在你可以用大约 1/3 的时间理解文章的主旨,然后继续你的一天。

在我的下一篇文章中,我将通过创建一个命令行实用程序来扩展这个功能,该实用程序可以抓取和总结一篇文章,并自动将摘要通过电子邮件发送给您自己。敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值