机器学习之机器如何学习

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

通过Julia的语法、函数、编译器使机器学习技术变得更加简单。

1、机器学习如何工作

通过机器学习研究人员可以构造算法使计算机自身能够在大量的数据中找到数学模式而这是人类不可能做到的。想想看: 如果我问你你怎么知道一张照片中的动物是猫还是狗你会怎么说你可能会看看动物的胡须、脸形和耳朵。但是你要如何从数学模式上判断这个动物是否有胡须呢你能写出一个数学公式获取图像的像素值并将其转换为动物物种的分类器吗

当然不能因为人类几乎不可能这样做我们以前尝试过。事实上有一个叫作特征工程feature engineering的研究领域但对于稍微复杂的任务它完成得从来都不理想。

这就是机器学习存在的原因它可以使计算机为我们找到这些数学公式。

就像人类从经验中学习一样机器学习算法也是如此。你可以在一个数据集上“训练”一个机器学习算法它将尝试“建模”该数据集并理解从输入到输出映射的数据集中的复杂性和模式。但是训练人类和训练机器有一个关键区别: 人类可以从少数几个样本中学习但是机器却需要从成百上千甚至数百万个样本中学习。

如果你要向那些从来没见过吹雪机和割草机的人口头描述它们的区别他们一定能很好地区分它们。但是如果你希望计算机将图像分为这两类那么你至少需要提供数百个视觉样本才能得到可接受的结果。

此外训练这些算法需要很强大的计算能力而Julia恰好比较擅长这件事。

2、使用Flux的样式传递

Julia提供了一个叫作Flux的包它可以帮助你解决许多问题Flux包的一部分被称为Metalhead project它可以使你在计算机上使用预先训练过的机器学习算法而不必自己训练它们。让我们来看一个例子。

首先请打开REPL并添加以下软件包:

① Flux
② Metalhead
③ Images
④ PyCall

以下是使用的命令:

using Pkg
Pkg.add("Flux")
Pkg.add("Metalhead")
Pkg.add("Images")
Pkg.add("PyCall")

现在,打开一个新的Julia文件并输入以下代码:

Code Listing 9.1, ImageClassifier.jl
using Metalhead: VGG19, preprocess, load, labels
using Flux: onecold

model =VGG19()
class_labels =labels(model)

print("Enter the name of your file: ")
user_image =preprocess(load(readline()))
model_prediction =model(user_image)
top_class =onecold(model_prediction)\[1\]
class_name =labels\[top_class\]

println("I think this image contains: $(class_name)")

从数学和机器学习的角度来看这是比较简单的工作但因为你对此还比较陌生所以我不会深入讲解模型本身的工作原理。然而Julia代码非常简单你应该可以理解此文件中的大部分代码。这就是Julia和Flux的优雅之处你不需要编写非常复杂的代码以使用机器学习模型。

现在你可以拍一些照片可以是你的宠物、电脑、电视或你自己或者你可以从网上下载一张照片将它们放在与你刚刚编写的Julia代码文件相同的目录中然后运行该代码。

当你第一次运行该代码时它将会从网上下载名为VGG19的机器学习模型VGG19表示Oxford Visual Geometry Group’s 19-layer model。根据你的网络环境这可能需要几分钟的时间。

然而无论你运行了多少次代码它都会继续初始化模型。一旦模型加载后你将看到一个请求图像文件的提示。输入文件的名称和扩展名然后按Enter键。几秒后代码应该会输出它在图像中看到的内容。例如假设有一张如图1所示的称为cat.jpg的图像。

■ 图1 测试图像分类器程序的猫图像

这是我与程序之间的交互:

Enter the name of your file: cat.jpg
I think this image contains: Egyptian cat

结果非常接近应用程序在图像中看到一只Egyptian cat。这真的很棒但这并不是什么新鲜事这种技术已经存在很多年了如果你使用Apple Photos或Google Photos你的图像会被自动分类。事实上这些平台甚至可以自动进行面部识别使你的生活更便捷。

那么如何用机器学习生成一些艺术作品呢我们将使用一种称为梯度上升gradient ascent的技术生成DeepDream艺术作品。你可能还记得几年前的DeepDream当时Google的研究人员可视化了“神经网络的激活”。我知道这听起来很复杂在大多数语言中即使是实现算法的一个简单版本也需要相当多的代码。

但在Julia中这几乎是微不足道的。下面让我们实现一个可以获取图像并对其添加“艺术风格”的应用程序。打开一个新文件输入以下代码:

Code Listing 9.2 DeepDream.jl
using Metalhead: VGG19preprocessload
using Flux: @epochs
using Statistics PyCall Flux.Tracker
using Images: RGB
np= pyimport("numpy")
Image = pyimport("PIL.Image")
function deprocess and pillow(img)([0.4850.4560.406] [0.2290.2240.225])队=rgb = cat(collect(map(x-> (img[::x1].* [x]) .+ 从[x]1:3))..., dims= 3)rgb = np.uint8(np.interp(np.clip(rgb ./ 255-11),以 (-11)(0255)))
returnImage.fromarray(rgb).transpose(Image.FLIP LEFT RIGHT).Crotate(90)
end
model = VGG19().layers[1:11]
loss(x) = mean(model(x))
dloss(x) = Tracker.gradient(lossx)[1]function calc gradient(x)g = Tracker.data(dloss(x))
return g * (mean(1.5 ./ abs.(g)) + 1e- 7)
end
print("Enter the name of your file: ")img = preprocess(load(readline()))
epochs 20 global img += calc gradient(img)deprocess and pillow(img).show()

在本例中我不会深入讲解这段代码的工作原理关键是让你看到使用Julia能够做些什么。

更多需要了解的内容:
从本质上说这不是训练一个神经网络的权重而是通过一个损失函数loss function找到对权重的梯度我们通过使用一个可以使卷积神经网络中某层滤波器的均值最大化的函数找到了相对于输入的梯度。

现在如果你再次运行该应用程序它将加载该模型并请求你输入一个文件。这次我输入了一张自己的图像见图2。

■ 图2 输入DeepDream.jl的图片

我得到了如图3所示的输出。

■ 图3 DeepDream.jl生成的第一张艺术作品

哇这是一张很棒的艺术作品。如果你将代码

model =VGG19().layers[1:11]

改为

model =VGG19().layers[1:end-10]

你应该会得到一张令人毛骨悚然的艺术作品见图4

■ 图4 DeepDream.jl生成的第二张艺术作品

好吧这也太奇怪了。让我们将代码更改为

model =VGG19().layers[1:7]

现在你应该会看到图5中的图像。

■ 图5 DeepDream.jl生成的第三张艺术作品

很好关于这种艺术作品还有一些需要讲解的地方: 它不是计算机在画布上的基本图像上随机画出来的事实上该系统是在世界上最大的图像数据集上进行训练的它包含超过1000个类别的100多万张图像。所以如果你仔细观察你可能会发现动物或其他类似于图像中描绘的物体的一些特征。例如在生成的第二张图像中你可能会在我的眼睛和嘴巴周围看到一些类似狗或其他动物的特征这是因为在生成本艺术作品之前这个系统的数据集中有很多动物。

你刚刚实现的一切都是由机器学习技术支持的并且通过Julia的语法、函数和编译器使其变得非常简单。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习