极简Julia语言 │ 机器如何学习

极简Julia语言 │ 机器如何学习
文章图片
通过Julia的语法、函数、编译器使机器学习技术变得更加简单 。
1
机器学习如何工作
通过机器学习 , 研究人员可以构造算法 , 使计算机自身能够在大量的数据中找到数学模式 , 而这是人类不可能做到的 。 想想看:如果我问你 , 你怎么知道一张照片中的动物是猫还是狗 , 你会怎么说?你可能会看看动物的胡须、脸形和耳朵 。 但是 , 你要如何从数学模式上判断这个动物是否有胡须呢?你能写出一个数学公式获取图像的像素值 , 并将其转换为动物物种的分类器吗?
当然不能 , 因为人类几乎不可能这样做 , 我们以前尝试过 。 事实上 , 有一个叫作特征工程(featureengineering)的研究领域 , 但对于稍微复杂的任务 , 它完成得从来都不理想 。
这就是机器学习存在的原因 , 它可以使计算机为我们找到这些数学公式 。
就像人类从经验中学习一样 , 机器学习算法也是如此 。 你可以在一个数据集上“训练”一个机器学习算法 , 它将尝试“建模”该数据集 , 并理解从输入到输出映射的数据集中的复杂性和模式 。 但是 , 训练人类和训练机器有一个关键区别:人类可以从少数几个样本中学习 , 但是机器却需要从成百上千 , 甚至数百万个样本中学习 。
如果你要向那些从来没见过吹雪机和割草机的人口头描述它们的区别 , 他们一定能很好地区分它们 。 但是 , 如果你希望计算机将图像分为这两类 , 那么你至少需要提供数百个视觉样本 , 才能得到可接受的结果 。
此外 , 训练这些算法需要很强大的计算能力 , 而Julia恰好比较擅长这件事 。
2
使用Flux的样式传递
Julia提供了一个叫作Flux的包 , 它可以帮助你解决许多问题!Flux包的一部分被称为Metalheadproject , 它可以使你在计算机上使用预先训练过的机器学习算法 , 而不必自己训练它们 。 让我们来看一个例子 。
首先 , 请打开REPL并添加以下软件包:
①Flux
②Metalhead
③Images
④PyCall
以下是使用的命令:
usingPkg
Pkg.add("Flux")
Pkg.add("Metalhead")
Pkg.add("Images")
Pkg.add("PyCall")
现在,打开一个新的Julia文件 , 并输入以下代码:
CodeListing9.1,ImageClassifier.jl
usingMetalhead:VGG19,preprocess,load,labels
usingFlux:onecold
model=VGG19
class_labels=labels(model)
print("Enterthenameofyourfile:")
user_image=preprocess(load(readline))
model_prediction=model(user_image)
top_class=onecold(model_prediction)[1]
class_name=labels[top_class]
println("Ithinkthisimagecontains:$(class_name)")
从数学和机器学习的角度来看 , 这是比较简单的工作 , 但因为你对此还比较陌生 , 所以我不会深入讲解模型本身的工作原理 。 然而 , Julia代码非常简单 , 你应该可以理解此文件中的大部分代码 。 这就是Julia和Flux的优雅之处 , 你不需要编写非常复杂的代码以使用机器学习模型 。
现在你可以拍一些照片 , 可以是你的宠物、电脑、电视或你自己 , 或者你可以从网上下载一张照片 , 将它们放在与你刚刚编写的Julia代码文件相同的目录中 , 然后运行该代码 。
当你第一次运行该代码时 , 它将会从网上下载名为VGG19的机器学习模型(VGG19表示OxfordVisualGeometryGroup’s19-layermodel) 。 根据你的网络环境 , 这可能需要几分钟的时间 。
然而 , 无论你运行了多少次代码 , 它都会继续初始化模型 。 一旦模型加载后 , 你将看到一个请求图像文件的提示 。 输入文件的名称和扩展名 , 然后按Enter键 。 几秒后 , 代码应该会输出它在图像中看到的内容 。 例如 , 假设有一张如图9.2所示的称为cat.jpg的图像 。