ml5:友好的Web开源机器学习库

作者:Daniel Shiffman和ml5.js合作者

伊丽莎白·弗格森动画漫画

丹尼尔·希夫曼是ITP的副教授。ml5.js是来自纽约大学ITP社区的学生、研究生、教师和校友以及其他合作者的友好群体的贡献的产物。过去和现在的撰稿人包括汉娜·戴维斯、尼基塔·哈金斯、海莉·黄、丽莎·贾姆霍里、达利斯·卡泽米、斯蒂芬妮·科尔顿、安德鲁·李、亚历杭德罗·马塔马拉、艾登·纳尔逊、丹·奥维德、伊宁·施和克里斯托巴尔·瓦伦苏埃拉。

问题3-

技术还不够。

把技术看作是一种工具,它本身什么也做不了。

将技术视为团队中每个人都可以自由学习、理解和探索的东西。

-红色烧伤

每年秋季在ITP,许多来自世界各地不同背景的学生都会在一门名为“计算媒体概论”的课程中第一次看到代码。这不是一门计算机科学课程,而是一门关于学习计算思维并将计算应用于个人激情的课程,无论是艺术、舞蹈,生物学、社会公正、时尚等等。没有测试,也没有记忆的算法,只有创造性的项目要做,唯一的要求就是尝试一下。这是ITP的一个关键任务——找到使技术和编码更易访问和更具包容性的方法每个人都可以自由和创造性地学习、理解和探索。

动画片应该是绘画课上的电脑,学习如何画猫。

入门课程的主要工具是第5页,一个来自加工基础其任务与课程一致:“empow”所有兴趣和背景的人都需要学习如何编程和使用代码进行创造性工作,尤其是那些可能无法使用这些工具和资源的人现代普罗米修斯:加工史,写:

Processing最初的任务是创建一个软件,让视觉化的人(设计师、艺术家、架构师)可以学习代码,并帮助技术含量更高的观众流畅地处理图形。我们立志要让人们成为精通软件的人阅读软件。我们想改变世界各地大学和艺术学校的课程设置。而不是教学生如何使用软件,我们认为教他们如何创造软件。

通过加工,艺术家可以发明自己的工具,而不是依赖别人创造和维护的工具。如今,“软件素养”无疑比以往任何时候都重要。算法以我们无法预料的方式影响着我们的生活,所谓的“深度”学习研究的爆炸式增长进一步扩大了它们的影响范围。我们之间的互动现在不仅仅是相互协商,还包括自动驾驶车辆、不断聆听的助手、识别我们面部表情和姿势的摄像头。如果没有访问和理解机器学习模型、底层数据和驱动软件的输出,我们如何有意义地参与、质疑和提出替代方案?机器学习面临着与15年前简单学习代码类似的挑战。这是哪里ml5.js公司进来:一个初学者友好的网络库,向程序员介绍机器学习,从算法和数据到模型和培训。

学习中的机器学习障碍

初级程序员面临两个主要障碍当前的机器学习工具。首先,必须安装和配置开发环境,其次,必须实现底层数学运算.

以Google的TensorFlow为例,它是最流行的机器学习开源库之一。安装说明需要通过通过终端接口输入的复杂命令序列来设置和配置python环境,如下图所示。

一个web浏览器的屏幕截图,显示了安装基于python的库Tensorflow的步骤。

2017年夏天,deeplearn.js将机器学习引入网络,为使机器学习更容易访问铺平了道路。Deeplearn.js是一个开源硬件加速机器智能javascript库由Nikhil Thrat和Daniel Smilkov,来自谷歌的研究人员大画面组领导费尔南达·维加斯和马丁·瓦滕伯格。与python的前辈不同,不需要安装和配置环境就可以使用deeplearn.js。学生、艺术家、教育者、修补者、研究人员可以简单地访问一个网址,在浏览器中运行一个机器学习模型。2018年3月30日,谷歌宣布deeplearn.js成为TensorFlow.js,进而扩展功能、特性和开发团队以支持项目。

尽管在浏览器中运行机器学习模型很容易,但想要自己编写代码的初学者仍然面临数学符号和低级技术代码的挑战。机器学习框架通常适用于具有微积分、线性代数、统计学、数据科学等高级知识的人,以及在python或C++等语言中有多年编程经验的人。对研究和开发新的机器学习模型和体系结构,从这一点开始,可以把有其他背景的新人拒之门外。初学者可能会被标量、向量、矩阵、操作、输入层、输出等之间的细微差别所淹没,而不是创造性地思考如何将机器学习用作艺术平台。

此外,TensorFlow.js示例是使用JavaScript语言本身的最新特性编写的,初学者可能不熟悉这些特性。以下是“入门”示例中的TensorFlow.js代码示例:

//小TFJS训练/预测示例。
异步 功能 myFirstTfjs公司() {
//创建一个简单的模型。
常量 模型 = 转铁蛋白.相继的();
模型.添加(转铁蛋白..稠密的({单位:1, 输入形状:[1]}));
//为培训准备模型:指定损失和优化器。
模型.编译({
损失:“meanSquaredError”,
优化器:“新加坡元”
});
//为训练生成一些合成数据。(y=2x-1)
常量 X轴 = 转铁蛋白.张量2D([-1, 0, 1, 2, , 4], [6, 1]);
常量 ys公司 = 转铁蛋白.张量2D([-, -1, 1, , 5, 7], [6, 1]);
//使用数据训练模型。
等待 模型.适合(X轴, ys公司, {时代:250});
//没有看到模型上的数据推断。
//应该打印大约39。
文件.getElementById('微型输出').内文本 +=
模型.预测(转铁蛋白.张量2D([20], [1, 1]));
}

这并不是对TensorFlow.js的批评;文档和示例非常优秀,而且非常全面。只是为了不同的观众。虽然它适合具有高级JavaScript知识的经验丰富的数据科学家,但它不太适合初学者。2018年秋季,代表ITP的Daniel Shiffman获得了Google Faculty Research Award,与TensorFlow.js团队合作,并开发了一个更高级别的库来解决这一差距。

与此同时,Cristobal Valenzuela(ITP'18)已经创建了一个github存储库,名为p5deeplearn:deeplearn.js与p5相遇”. 这个存储库是ml5.js的起源,“5”向p5.js和处理哲学本身致敬。在ITP,我们组织了一个每周的工作组来讨论图书馆的发展问题,并邀请了客座艺术家和研究人员参与其中。嘉宾和合作者包括贾布里勒·阿什、凯特·康普顿、汉娜·戴维斯、大流士·卡泽米、吉恩·科根、凯尔·麦克唐纳和施伊宁。

不同居民的头像

走进机器学习之门

在编程入门课程中,是否可以包括一个为期一周的机器学习模块?可以使用什么工具?js团队用越来越普遍的web编程语言JavaScript打开了在单个URL上进行机器学习的大门。有了ml5.js,我们邀请初学者进门。该库建立在TensorFlow.js之上,没有其他外部依赖性,它提供了在浏览器中访问机器学习算法和模型的功能,并提供了使用初学者友好的JavaScript的示例。通过向初学者介绍机器学习,我们希望激发创造性的实验,并引发关于数据、培训、算法偏差和伦理的讨论。

怎么会这样?第一个向初学者介绍机器学习主题的例子是什么?让我们考虑一下图像分类的常见任务。ml5.js公司(通过TensorFlow.js)提供了一个接口,用一行代码从云中加载一个“预先训练”的模型。

分级机 = 新的 ml5型.图像分类器(“移动网络”);

这种型号,被称为MobileNet公司“是在图像网,一个由大约1500万张图片组成的数据库,上面有1000种不同的分类。模型对给定图像的分类完全取决于训练数据—包括哪些内容,排除了哪些内容,以及这些图像如何标记(或错误标记)。

正如在ml5js.org上演示的,模型和图像分类器可以用来对图像进行分类。


另外,当与p5视频元素链接时,分类器可以标记录制的或实时视频的帧。

视频 = 创建捕获(视频);
分级机 = ml5型.图像分类器(“移动网络”, 视频);

一旦发生这种情况,事情会变得稍微复杂一些,因为当分类器完成对图像的分析并准备返回结果时,必须使用回调的概念。

分级机.预测(结果);
功能 结果(结果) {
慰问.日志(结果);
}

上面的代码将当前视频图像的分类列表(以及“置信度”分数)记录到浏览器控制台。下面正在运行显示网络摄像头图像和结果的代码版本(您必须单击“允许网络摄像头”才能查看结果)。

模特认为你是什么样的人?氧气面罩?领结?巴松管?太阳镜?

对于ml5.js来说,模型无法识别一个人被认为是成功的。引发了讨论。为什么不能给我贴上“人”的标签?

试着在镜头前举起一个物体,比如你的手机或咖啡杯

喝咖啡杯的人

突然间它完美地工作了。机器学习不是魔法。模特只知道自己被训练了什么。在这种情况下MobileNet公司模型被训练在一组有点任意的对象上。令人惊讶的是,它善于识别不知名的狗品种和鸟类物种,却不了解“脸”或“人”

分类截图

我们希望,通过揭露模型的缺陷并在ml5.js中轻松访问,世界各地的创意程序员将受到启发,在进行创造性实验的同时,认识到任何模型的优缺点。预训过的模特MobileNet公司为初学者提供友好的起点。只需一两行代码,就可以运行各种模型。下面是一些与ml5.js一起提供的其他模型的交互式演示。

LSTM文本生成:此示例通过Cris Valenzuela移植到ml5.js的预先训练模型生成作者风格的文本。这里的模特是根据公共所有著作通过佐拉·尼尔·赫斯顿.

风格转换:此示例采用一个图像的样式并将其应用于另一个图像的内容。这个模型是由ITP校友和客座艺术家石怡宁移植到ml5.js中的,需要一个预先训练过的特定样式的模型。模特在这里接受训练1829年神奈川外海的巨浪-北草胜.

螺距检测:这个例子使用了一个预先训练过的模型,称为“CREPE”,由Hannah Davis移植到ml5.js,并在几个现有的音频数据集上进行了训练本文所述.

文字2vec:Word2Vec是一个将给定单词与数字列表相关联的模型。这允许对文本执行数学运算。这些数字是通过观察单词与文本语料库中其他单词的关系来生成的。下面的单词vectors来自a谷歌新闻文章的开源模式.

波塞内:PoseNet由当前的ITP学生danoved移植到ml5.js中,是一个执行“姿势估计”的模型,这是一种计算机视觉技术,用于确定图像中人体关键点的像素位置。使用t剑桥地标7场景数据集.

在记录上述示例时,我们的首要任务是明确和透明地说明模型的来源、用于训练模型的数据以及可能丢失的数据。

创造性数据集和负责任的数据实践

前面的例子突出了ml5.js版本0.1.0的核心特性和目标,这是第一个测试版。但还有很多事情要做。除了用于试验预先训练模型的教育和创意资源外,图书馆还旨在向学生和创造性编码人员介绍整个机器学习过程:从收集数据、清理数据、训练模型、测试模型到部署。我们怎样才能使这个完整的叙述对初学者可用和容易理解?

项目的两个方面暗示了未来的发展方向:库中易于访问的示例数据集,以及帮助分段数据和处理批处理以训练模型的函数。这项工作很大程度上是由Hannah Davis(ITP'13)推动的,她在家里花了一个学期的时间研究ml5.js和相关的机器学习研究,主要集中在数据集上。

在实际使用数据之前,很容易忘记处理数据的所有工作。当第一次介绍机器学习时,示例数据集可以作为初学者探索关键概念的起点。在我们第一次ml5会议上,汉娜介绍了玩具数据集包含在scikit learn中,这是一个Python的机器学习库。

scikit learn提供的小数据集列表

Hannah问:如果ml5.js还包含示例数据集,人们可以通过调用JavaScript函数访问这些数据集呢?此外,清晰的文档(受scikitlearn的“describe”函数的启发)可以描述数据集,包括它的来源、如何收集以及它包含的内容。

了解数据集还包括如何在模型中使用数据集。对于机器学习初学者来说,诸如训练、测试、验证和未知数据等数据集中的区别可能会使他们特别困惑。结合库的特性来帮助分割数据并在不同的批次中处理它,这将向人们介绍这个过程。虽然这不是ml5.js的第一个版本的一部分,但我们希望下一个版本中包含它。

最后,我们选择提供什么样的数据和我们如何提供同样重要。ml5的一个核心原则是对非传统类型的数据进行特征提取。经典鸢尾花数据集因为分类已经在无数的数据科学例子中找到了它的位置,甚至更加无处不在标注手写数字的MNIST数据库几乎在每一个介绍机器学习图像分类教程。非传统数据集可以鼓励人们创造性地思考数据以及如何在项目中使用自己的数据。一种方法是从创意艺术空间中选取样本数据集。从谷歌的一个有趣的变奏曲数据库中,可以画出有趣的变奏曲。

很多手绘对象

汉娜的第一个样本数据集为图书馆贡献的是一组略低于4000幅的风景图片。正如人们所料,这些景观以传统的方式分为七类:“田野、山地、城市、湖泊、森林、海洋、道路”。然而,汉娜还通过众包网站进行了一项实验,让人们用更主观的“情感”质量来标注图像,最终目标是训练一个模型来检测图像中的情绪。她关于数据集的博客文章,汉娜写道:

第二个用法是我的一个实验,用来探索一些我一直称之为“主观数据集”的数据集,即标签比“猫”或“狗”更主观的数据集。这与情绪分析有很大的重叠,这是我第一次尝试创建情感数据集。

除了数据集和它是如何创建的演练之外,Hannah还发布了一个制作自己的数据集ml5网站的教程,回答诸如“数据从何而来”等问题?“标签从哪里来?”?以及强调“负责任的数据收集”。

在收集数据时,重要的是要在收集过程的每个阶段进行批判性思考。你要问自己的一些问题包括:这是谁的数据?他们要你刮这个吗?是公开的吗?有没有办法请求许可和/或为数据付费?你能用适当的许可证收集数据吗?

您需要注意数据收集中的欠表达偏差(也称为采样偏差)。例如,如果你在收集有史以来最好的电影的数据集,你是否只问你身边的那些人?对于数据中存在明显差距的情况,重要的是看看是否有办法从不同的来源收集更多的数据。

反之则是收集了太多的数据。你的项目真的需要询问性别和年龄吗?收集宗教、种族或国籍是现在还是将来会很危险吗?你只收集绝对必要的东西吗?有什么更好的地方可以省略吗?

汉娜的作品启发了我们思考,我们提供的预先培训的模特缺少什么。对于那些对机器学习感到害怕或不属于自己的初学者来说,在数据中看到自己是很重要的。在ml5.js的第一轮开发中,我们使用三位作者培训了上述文本生成器示例:莎士比亚、海明威和尼采。这些作家都有一个共同点:他们都是已故的白人。认识到这一点,我们搜索古登堡计划,一个公共领域文本的数据库,并从包括女性和有色人种在内的作者中抽取了一个更具包容性的选择。现在是我们的模特儿了。

建立在预先训练的模型上

另一种处理自定义数据集的有效技术被称为“转移学习”。在这种情况下,不再使用数据集从头开始训练机器学习模型,而是使用预先训练的模型作为使用新数据进行训练的起点。谷歌创意实验室的研究人员和艺术家与TensorFlow.js团队合作开发了一个名为可教机器“这说明了这个过程。有了网络摄像头,人们就可以交互式地实时训练机器学习模型,对来自摄像机的输入进行分类。 

来自Google创意实验室的Nicole He演示了可教机器:这是一个让任何人都能更轻松地探索机器学习的实验,在浏览器中,不需要编码。

来自Google创意实验室的Nicole He演示了可教机器:这是一个让任何人都能更轻松地探索机器学习的实验,在浏览器中,不需要编码。

除了可教机器网站本身,谷歌还发布了可教机器样板“:创建自己的版本所需的最少JavaScript代码量。这激发了我们思考迁移学习的ml5.js版本。我们如何使过程简单,但暴露其细节,以减少“魔术”的感觉?为此,我们加入了一个“FeatureExtractor”

特征 = ml5型.特征提取器(“移动网络”);

如前所述,MobileNet公司被设计为给一个图像分配一个标签:“咖啡杯”、“乌龟”等等。然而,在幕后,在它真正这么做之前MobileNet公司模型运行一个称为“卷积”的数学过程(类似于photoshop过滤器中发生的情况),它将所有像素转换为一组简化的数字。具有40000像素的200×200图像将生成135个浮点数的列表。这些数字被认为是图像的“特征”。同时MobileNet公司可能将某一组特征与“咖啡杯”相关联转移学习过程允许我们为从新图像中提取的特征指定新的标签。

一旦有了提取器,下一步就是从中创建分类器:

常量 分级机 = 特征.分类();

我们可以用我们自己的标签告诉分类器图像。

分级机.添加图像(浮肿图像1, “海雀”);分级机.添加图像(浮肿图像1, “海雀”);
分级机.添加图像(浮肿图像2, “海雀”);分级机.添加图像(浮肿图像2, “海雀”);
分级机.添加图像(浮肿图像3, “海雀”);分级机.添加图像(浮肿图像3, “海雀”);
分级机.添加图像(雪豹图片1, “雪 豹子');分级机.添加图像(雪豹图片1, “雪 豹子');
分级机.添加图像(雪豹图片2, “雪 豹子');分级机.添加图像(雪豹图片2, “雪 豹子');

最后,我们可以根据我们添加的图像上的特征训练一个新的模型。

分级机.火车();

查看原始
列车.js
托管通过github

并对新的未知图像进行分类。

分级机.分类(一些图像, 结果);
功能 结果(标签) {
慰问.日志(标签);
}

本系统是一个自定义的图像识别系统。Alejandro Matamala在“PongML”中用这种方法创建了ITP的首批项目之一。在他的项目中,有人实时训练机器学习模型,识别并根据人的特定姿势进行游戏。

用摄像头玩乒乓球

下一步是什么?

对ml5图书馆的第一次承诺是在2017年10月4日。八个多月后,多亏了Google的支持,我们很高兴发布了ml5.js的第一个“beta”(0.1.0版)。

在屏幕上观看演示文稿的一群人。

虽然有一些研讨会与ml5在ITP公司,诗歌计算学派,和眼球现在,真正的工作已经开始了,艺术家、教育工作者和初学者在教育和实践中使用图书馆。什么不清楚?文档中缺少什么?太像魔法的东西在哪里?太复杂了?为初学者开发库的最佳方法是与初学者一起使用库

皮卡丘素描

我们希望这个版本只是一个开始;更多的教程、示例和模型将在今年夏天发布。我们对其创造性的可能性感到特别兴奋的是像对像的翻译(被称为pix2pix),伊宁是在移植过程中至ml5.js。伊宁也将在ITP夏令营用ml5.js beta教授第一个研讨会!今年秋天,Gene Kogan和Mimi Onouha将常驻ITP,继续帮助我们思考API选择和围绕图书馆开发以及相关数据集和文档的伦理问题。

未来居民的两张头像

是的,ITP课程“计算媒体概论”将在秋季学期包括一个新的为期一周的模块:机器学习. 加入我们的松弛通道,跟我们来推特,并为Github存储库参加讨论!