软件工程师和数据科学家一起工作时,会擦出什么火花呢?

电子说

1.3w人已加入

描述

软件工程师和数据科学家一起工作时,会擦出什么火花呢?

作为Java / Kotlin开发人员,一位名叫Ben Danial的小哥为我们讲述了他与数据科学家合作的有趣经历。

在一年中,这位小哥从零开始学习机器学习,和数据科学家不断交流合作,一起码出了一个机器学习模型的原型,并成功把这个模型做上线。真是成就满满呢!

前情提要

大家好,我叫Ben Daniel,是一名安卓工程师。2017年末,我开始对机器学习领域产生兴趣。机器学习这个领域充满了有趣的挑战,因此也就需要大量的学习。今天,我就给大家讲述我和我司数据科学家一起攻克机器学习难题的经历。

我还记得,我曾试图解决我们的某个应用程序中出现的图像分类问题。我们需要根据一组规则区分有效和无效图像。于是我从深度学习领域中修改了dl4j这个例子,并试图用它来处理分类任务。虽然结果不够理想,但是我的心态还不错。毕竟第一次尝试嘛。

Dl4j例子链接:

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/AnimalsClassification.java

由于精度和最终模型的大小不符,我使用dl4j代码的方法是不可取的。面向移动设备,我们需要一个文件大小紧凑的模型,很遗憾,这个功能无法实现。

数据科学家来啦

正巧,这个时候,我们聘请了一位数据科学家,他带来了许多有趣的经验,也教会我们很多。我逐渐发现,大多数机器学习问题都可以通过Python解决,而且Python社区中已经有了对机器学习的巨大支持。虽然不太情愿,但我还是开始了Python的学习。

我从小型的机器学习课程开始学起。与此同时,我的其他团队成员也很感兴趣,并一起加入了学习的大军。新入职的数据科学家向我们介绍了Jupyter notebook和云机器学习引擎。我们通过使用花卉数据集示例尝试图像分类,并很快沉迷其中。

在团队中的每个人都接受了培训和模型的基础知识后,我们开始处理文章开始提到的遗留问题。作为一名团队成员,我主要专注于两项任务:图像分类问题和图像分割问题。之后,这两个问题都被我们用卷积神经网络(CNN)解决了。

准备训练数据真心难

这两项任务(图像分类问题和图像分割问题)都需要大量的训练数据。我有两个消息——好消息是我们的确有很多数据。坏消息是它们要么是未分类要么是未注释。我终于明白了机器学习专家们所说的,机器学习项目中大部分时间将用来准备训练数据而不是训练模型本身。

对于图像分类分类问题,我们需要将数十万个图像排列成不同的类。这是一项繁琐的工作。我不得不调用我的Java Swing技能,来构建使这项任务更容易的GUI,但总的来说,标记数据这个任务真的很单调,很无聊。

分割问题就要复杂一些了。我们很幸运地发现了一些擅长分割的模型,但不幸的是,这些模型太占内存了。我们还希望该模型能够在规格非常低的安卓设备上运行。这时,数据科学家建议我们使用庞大的模型来生成数据,用以构建我们自己的移动网络。

训练

我们最终切换到了AWS Deep Learning AMI。训练图像分割模型的过程完全由我们的数据科学家处理,我只需要站在他身边,做笔记嘻嘻:)。

(其实我不在记笔记,哈哈哈哈哈哈哈哈)

训练这个模型是一项计算密集型任务,需要足够GPU和RAM。我们便采用了GPU和RAM,因此很快就完成了模型训练。如果不是这样的话,我们可能要花费数月来训练这个模型。

我负责了图像分类模型的训练。不过,我并没有在云上训练,而是只在我的Macbook pro上训练。这是因为,我只是训练神经网络的最后一层,而不是我们为分割模型所做的全网络训练。

顺利完成!

两种模型经过严格的测试后,都成功进入了我们的产品线。在这一步,团队成员的任务是构建Java wrapper库。这样一来,我们就可以把模型繁复的细节隐藏起来。在使用时,我们只需输入图片,这个wrapper库就会输出一个概率 张量,也就是模型在单个图像上预测的结果数组。我也参与了这一过程,因为我之前的一些写码经验有用武之地。

人生处处是挑战

“挑战让生活变得有趣,克服挑战则让生活变得有意义”。

在这个项目中,我面临的最大挑战是尝试使用Bazel从源代码构建用于32位系统的Tensorflow Java库。整个过程实在是跌跌撞撞。

神经网络

我也遇到过其他挑战,比如,将Python解决方案转换为Java。由于Python已经内置了对数据科学任务的支持,因此Python中的代码感觉更加简洁。每次在尝试逐字翻译命令时,我都会抓耳挠腮。比如,缩放2D阵列并将其作为透明层添加到图像中这一步就异常艰难。不过我们最终把这事儿搞定了!

现在我们上线的模型表现很好,但是当它们产生错误的结果时,那些错误的结果是荒谬无比的。

它让我想起了我之前读过的一句话:

“...如果没有源源不断的新数据,模型质量会迅速降低。这是著名的概念漂移(concept shift),这意味着,随着时间的推移,静态机器学习模型提供的预测变得不那么准确,并且不太有用。在某些情况下,甚至可能在几天内发生。 - David Talby

因此,我们必须不断改进模型,并且永远得不到一个一劳永逸的模型。其实还挺有趣的。

因为我本人主要关注移动开发,所以我甚至不确定自己有资格被称为机器学习的新手。然而,通过与数据科学家的合作,我在今年成功上线了一个机器学习模型。回想起来,相当激动呢!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分