打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
人工智能&机器学习怎么学,深度学习和卷积神经网络--交互er不能不懂的人工智能硬知识

Google允许你通过描述搜索自己的照片,甚至是未标记的照片!这是如何运作的?本文我们将学习如何使用深度学习识别图像对象的程序换句话说,我们将解释Google相册根据图片中的内容搜索你的照片的本质原理:

本文适用于对机器学习感兴趣但不知道从哪里开始的人。同学们可以通过本文中的概述,快速了解ML的重要概念。目前人工智能已经成为UXD交互板块教学中重要的组成部分,我们结合人工智能技术完成了大量设计课程的教学。

点击了解UXD人工智能线下教学
正在了解人工智能,进行机器训练的同学们@UXD上海实验室

自由Q&A时间+人工智能实践练习@UXD上海实验室

01
深度学习识别对象

你可能以前看过这本著名的xkcd漫画,一个3岁的孩子能认出一张鸟的照片。50多年来,优秀的计算机科学家始终在研究,如何使计算机识别物体。在过去的几年中,我们终于找到了一种使用深度卷积神经网络进行物体识别的好方法。这听起来像是William Gibson科幻小说中的一堆虚构词,但这些想法现在是完全可以实现的。
02
由浅入深

神经网络是如何通过连接无数神经元来解决复杂问题的。我们创建了一个小型神经网络,根据房屋的数量,房屋的大小以及房屋的所在区域来估算房屋的价格:

我们知道机器学习的思想是可以将相同的通用算法与不同的数据重用以解决不同的问题。因此,让我们修改该神经网络以识别手写文本。但是为了使工作更加简单,我们将只尝试识别一个字母-数字“ 8”。

机器学习仅在拥有数据(最好是大量数据)时才起作用。因此,我们需要大量手写的“ 8”来开始,研究人员为此创建了MNIST手写数字数据集。MNIST提供60,000张手写数字图像,每个图像为18x18图像。这是数据集中的一些“ 8”:

来自MNIST数据集中的8

但是现在我们想用我们的神经网络处理图像,如何将图像而不只是数字输入神经网络?其实方法和数字输入是一致的,神经网络将数字作为输入,对于计算机,图像实际上只是一个像素网格,代表每个像素的暗度:

要将图像输入我们的神经网络,我们只需将324个数字的数组视为18x18像素图像即可:

我们将扩大神经网络以拥有324个输入节点:


通过上述处理后,我们的神经网络现在也有两个输出(而不是一个)。第一个输出将预测图像为“ 8”的可能性,第二个输出将预测图像不是“ 8”的可能性。通过要识别的每种对象提供单独的输出,我们可以使用神经网络将对象分类。

我们的神经网络输入的数据量可以非常大,任何现代计算机都可以处理具有数百个节点的神经网络。剩下的就是用“ 8”和不是“ 8”的图像训练神经网络,以便学会区分它们。当我们输入“ 8”时,我们将告诉它图像出现的可能性。“ 8”是100%,而不是“ 8”的概率是0%,反之亦然。下面这是我们的一些训练数据:

训练数据

我们可以在一台现代笔记本电脑上在几分钟内训练这种神经网络。完成后,我们将拥有一个神经网络,可以非常准确地识别“ 8”的图片。


03
进阶学习

真正简单地将像素输入神经网络,可以建立图像识别!在初步学习中,我们的“ 8”识别器在简单的图像上确实能很好地工作,其中字母正好位于图像的中间:


当字母不在图像中居中时,我们的“ 8”识别器完全无法工作。仅有一点点位置变化就毁了一切:


这是因为我们的网络仅学习了完美居中的“ 8”模式。完全不知道偏心的“ 8”是什么。它仅仅知道中间是「8」的图片规律。

在现实世界中这不是很有用,现实世界中的问题从来都不是那么简单。因此,我们需要弄清楚在“ 8”不完全居中的情况下如何使神经网络工作。

蛮力理念#1:用滑动窗口搜索

科学家创建了一个非常好的程序,用于找到以图像为中心的“ 8”。把图片分成一个个小部分并挨个识别,直到找到“ 8”。


这种方法称为滑动窗口,这是强力解决方案。在某些有限的情况下,它可以很好地工作,但是效率很低。你必须一遍又一遍地检查同一张图片,以查找不同大小的对象。

蛮力理念2:更多数据和深度神经网络

当我们训练我们的网络时,我们只显示出完美居中的“ 8”字。如果我们用更多数据训练图像,包括图像周围所有不同位置和大小的“ 8”?

我们甚至不需要收集新的培训数据。我们只需要编写一个脚本来生成新的图像,图像中所有不同位置的位置都带有“ 8”:


我们通过创建已有图像的不同版本来创建综合训练数据,这是非常有用的技术!使用此技术,我们可以轻松创建无休止的培训数据。数据越多,神经网络就越难解决问题,但是我们可以通过扩大网络规模并由此学习更复杂的模式来弥补这一问题。

为了扩大网络,我们逐层堆叠节点:


我们称其为“深度神经网络”,因为它比传统的神经网络具有更多的层次。

这个想法自1960年代后期开始出现,但是直到最近,训练如此庞大的神经网络还是太慢。一旦我们弄清楚了如何使用3d图形卡(被设计用来真正快速地进行矩阵乘法)代替普通的计算机处理器,使用大型神经网络的工作便变得可行。


但是,即使我们可以使神经网络真正变大并使用3d图形卡对其进行快速训练,但这仍然无法使我们得到解决方案。我们需要更聪明地将图像处理到神经网络中。

训练网络来识别图片顶部的“ 8”与训练网络来识别图片底部的“ 8”是没有意义的,它们是两个完全不同的对象一样。应该有某种方法可以使神经网络足够智能,以至于无需任何额外的训练就可以知道图片中任何地方的“ 8”都是同一件事。


04
卷积性方案

作为人类,你能够直观的知道图片具有层次结构或概念结构。


作为人类,当你观察这张图片的时候,你会立即认识到这张图片中的层次结构:

  • 地面被草和混凝土覆盖

  • 有一个孩子

  • 孩子坐在有弹性的马上

  • 有弹性的马在草地上


最重要的是,我们识别出了孩子,无论这个孩子所处的环境怎样。当他出现在不同的环境时,我们人类不需要重新学习孩子这个概念。

但是神经网络无法做到这一点。它认为图像的不同部分中的“ 8”是完全不同的东西。它不能理解物体出现在图片的不同位置还是同一个物体这个概念。这意味着它必须在每个可能的位置重新学习每个对象的标识。

我们需要让我们的神经网络理解翻译不变性-无论“ 8”在图片中的何处显示,它都是“ 8”。我们将使用称为卷积的过程进行此操作。卷积的灵感是由计算机科学和生物学共同探索的

卷积如何工作?

与其将整个图像作为一个数字网格输入到我们的神经网络中,我们将做一些更聪明的事情,以利用无论对象在图片中出现在何处都是同一个物体的想法。

操作方法如下:

步骤1:将图片分成重叠的图片图块

与上面的滑动窗口搜索类似,让我们在整个原始图像上传递一个滑动窗口,并将每个结果保存为单独的微小图片拼贴:


通过这样做,我们将原始图像转换为77个大小相等的小图像图块。

步骤2:将每个图块输入一个小型神经网络

之前,我们将单个图像输入到神经网络中以查看其是否为“ 8”。我们将在这里做完全相同的事情,但我们将对每个单独的图块执行此操作:


重复此77次,每次判断一张图片。
但是有一个很大的转折,对于同一原始图像中的每个单个图块,我们将保持相同的神经网络权重。换句话说,我们将同等对待每个图像图块,如果有异常的事物出现在任何给定的图块中,我们会将其标记为异常。

步骤3:将每个图块的结果保存到新数组中

我们不想失去对原始图块排列的跟踪。因此,我们将处理每个图块的结果保存为与原始图像具有相同排列方式的网格。看起来像这样:


换句话说,我们从一个大图像开始,然后以一个稍小的数组结束,该数组记录了我们原始图像中最重要的部分。

步骤4:缩减像素采样

步骤3的结果是一个数组,该数组映射出原始图像中最重要的部分,但是该数组仍然很大:


为了减小数组的大小,我们使用称为Max pooling的算法对其进行缩减像素采样。我们查看阵列的每个2x2正方形,并保持最大数量:

这里的想法是,如果我们在构成每个2x2网格正方形的四个输入图块中的任何一个中找到异常的东西,我们将保留这个位置。这样可以减小数组的大小,同时保留最重要的位置。

步骤5:做出预测

到目前为止,我们已经将巨大的图像缩小为相当小的阵列。该数组只是一堆数字,因此我们可以使用该小数组作为另一个神经网络的输入。这个最终的神经网络将决定图像是否匹配。为了将其与卷积步骤区分开,我们将其称为“完全连接”网络。

因此,从头到尾,我们的整个五步就像管道一样连接起来,如下所示:


添加更多步骤

我们的图像处理流程包括一系列步骤:卷积,最大池化,最后是一个完全连接的网络。解决现实世界中的问题时,这些步骤可以根据需要组合和堆叠多次!你可以具有两个,三个甚至十个卷积层。你可以在任何希望减小数据大小的地方加入最大池。

基本思想是从大图像开始,逐步将其精简,直到最终获得单个结果。卷积步骤越多,网络就能学会识别的功能就越复杂。

例如在识别鸟类的程序中,第一个卷积步骤可能会学会识别尖锐的边缘,第二个卷积步骤可能会使用其锐利的边缘知识来识别喙,第三个步骤可能会利用其对喙的知识识别整个鸟类,等等。下图是一个更现实的深度卷积网络:


在这种情况下,他们开始制作224 x 224像素的图像,两次进行卷积和最大池化,再进行3次卷积,再应用最大池化,然后得到两个完全连接的层。最终结果是图像被分类为1000个类别之一!

构建正确的网络

那么,你如何知道需要结合哪些步骤才能使图像分类器正常工作?老实说,你必须通过大量的实验和测试来回答这个问题。在找到要解决的问题的最佳结构和参数之前,你可能必须训练大量网络。机器学习涉及很多反复试验!


06
构建鸟类分类案例

我们可以用以上讲解的知识来编写一个可以确定图片是否为鸟的程序。

与往常一样,我们需要一些数据才能开始,免费的CIFAR10数据集包含6,000张鸟类图片和52,000张非鸟类物品图片。但是要获取更多数据,我们还将添加加州理工学院UCSD Birds-200–2011数据集,其中还包含12,000张鸟类图片。

以下是我们综合数据集中的鸟图片:
以下是52,000张非鸟类图片:

这个数据集可以很好地满足我们的目的,但对于实际应用而言,72,000张低分辨率图像仍然很小。如果要获得Google级别的性能,则需要数百万个大图像。在机器学习中,拥有更多数据几乎总是比拥有更好算法更重要。现在,你知道了Google为什么如此乐意为你提供无限的照片存储空间,因为他们想要你的数据!

要构建分类器,我们将使用TFLearn。TFlearn是Google TensorFlow深度学习库的内容,它提供了简化的API,它使构建卷积神经网络就像编写几行代码来定义我们的网络层一样容易。

这是定义和训练网络的代码:

# -*- coding: utf-8 -*-
"""

基于这个 tflearn 样例代码:
https://github.com/tflearn/tflearn/blob/master/examples/images/convnet_cifar10.py
"""
from __future__ import division, print_function,
absolute_import

# 导入 tflearn 和一些辅助文件
import tflearn
from tflearn.data_utils import shuffle
from tflearn.layers.core import input_data,
dropout, fully_connected
from tflearn.layers.conv import conv_2d,
max_pool_2d
from tflearn.layers.estimator import regression
from tflearn.data_preprocessing import
ImagePreprocessing
from tflearn.data_augmentation import
ImageAugmentation
import pickle

# 加载数据集
X, Y, X_test, Y_test =
pickle.load(open("full_dataset.pkl", "rb"))

# 打乱数据
X, Y = shuffle(X, Y)
# 确定数据是规范的
img_prep = ImagePreprocessing()
img_prep.add_featurewise_zero_center()
img_prep.add_featurewise_stdnorm()

# 翻转、旋转和模糊效果数据集中的图片,
# 来创造一些合成训练数据.
img_aug = ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_rotation(max_angle=25.)
img_aug.add_random_blur(sigma_max=3.)

# 定义我们的网络架构:
# 输入内容是一张 32x32 大小, 3 个颜色通道(红、绿、蓝)的图片
network = input_data(shape=[None, 32, 32, 3],
data_preprocessing=img_prep,
data_augmentation=img_aug)
# 第一步: 卷积
network = conv_2d(network, 32, 3,
activation='relu')

# 第二步: 最大池化
network = max_pool_2d(network, 2)
# 第三步: 再卷积
network = conv_2d(network, 64, 3,
activation='relu')

# 第四步: 再再卷积
network = conv_2d(network, 64, 3,
activation='relu')

# 第五步: 再最大池化
network = max_pool_2d(network, 2)
# 第六步: 拥有 512 个节点的全连接神经网络
network = fully_connected(network, 512,
activation='relu')

# 第七步: Dropout - 在训练过程中随机丢掉一些数据来防止过拟合
network = dropout(network, 0.5)
# 第八步: 拥有两个输出 (0=不是鸟, 1=是鸟) 的全连接神经网络,yong l做出最终预测
network = fully_connected(network, 2,
activation='softmax')

# 告诉 tflearn 我们想如何训练神经网络
network = regression(network, optimizer='adam',
loss='categorical_crossentropy',
learning_rate=0.001)
# 把网络打包为一个模型对象
model = tflearn.DNN(network,
tensorboard_verbose=0, checkpoint_path='bird-classifier.tfl.ckpt')
# 开始训练!我们将进行 100 次训练, 并实时监视它.
model.fit(X, Y, n_epoch=100, shuffle=True,
validation_set=(X_test, Y_test),
show_metric=True, batch_size=96,
snapshot_epoch=True,
run_id='bird-classifier')
# 当训练结束时保存模型
model.save("bird-classifier.tfl")
print("Network trained and saved as bird-classifier.tfl!")

如果你的显卡足够好,显存足够大(比如说 Nvidia GeForce GTX980 Ti),一个小时以内就能完成训练,随着训练的进行,准确度也会增加。在第一遍训练之后,它的准确率是75.4%。10 次训练之后,准确率就上升到了 91.7%。当训练了大约 50 次的时候,它的准确率达到了 95.5%。继续训练并没有增加它的准确度,所以我停止了。最终获得的程序就可以识别图像中的鸟类!

07
对网络进行测试

现在我们有了训练有素的神经网络,我们就可以使用它!这是一个简单的脚本,可以接收单个图像文件并预测它是否是鸟。但是要真正了解我们的网络有多有效,我们需要使用大量图像对其进行测试。我创建的数据集保留了15,000张图像用于验证。当我通过网络运行这些15,000张图像时,它预测了95%的正确答案。


95%的准确度如何?我们的网络声称准确率为95%。但是细节决定成败,那可能意味着各种各样的事情。


例如,如果我们的训练图像中有5%是鸟类而其他95%不是鸟类该怎么办?每次都猜出“不是鸟”的程序的准确率是95%!但这也是100%无用的。我们需要更仔细地观察这些数字,而不仅仅是整体准确性。要判断一个分类系统真的有多好,我们需要知道它是怎样出错误的,而不是仅仅关注它错了多少次。

我们不要将我们的预测视为“正确”和“错误”,而是将其分为四个单独的类别-

首先,以下是我们的网络正确识别为鸟类的一些鸟类。让我们将这些称为“True Positives”:
我们的网络可以成功识别许多不同种类的鸟类!

其次,以下是我们的网络正确识别为“不是鸟”的图像。这些被称为“True Negatives”:

我们不会认错马和卡车。

第三,这里有一些被认为是鸟但完全不是鸟的图像。这些被称为“False Positive”:

许多飞机被误认为鸟!也情有可原。

后,这是一些我们没有正确识别为鸟类的鸟类图像。这些被称为”False Negatives“:

这些鸟骗了我们!愚蠢的鸵鸟!他们甚至算作鸟吗?
使用我们的15,000张图像的验证集,这是我们预测落入每个类别的次数:

我们为什么要这样细分结果?因为并非所有错误都是平等产生的。

想象一下,如果我们正在编写一个程序来从MRI图像中检测癌症。如果要检测到癌症,我们宁愿有假阳性而不是假阴性。假阴性的情况可能更糟-当程序告诉某人他们肯定没有患上癌症但实际上却患上了癌症。我们不只是查看整体准确性,还计算准确性和召回率指标。精确度和召回率指标使我们更清楚地了解了自己的表现:


这告诉我们97%的时间我们猜对了“鸟”,我们是对的!但这也告诉我们,在数据集中我们仅发现了90%的实际鸟类。换句话说,我们可能不会找到每一只鸟,但是当我们找到一只鸟时,我们就可以肯定它是鸟了!

本文通过上述知识点讲解,主要带同学们了解深度卷积网络的基础知识,学会这个知识后,你就可以尝试使用tflearn附带的一些示例来尝试使用不同的神经网络体系结构。它甚至带有内置的数据集,因此你甚至不必查找自己的图像。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
part3 机器学习原来这么有趣!第三章:图像识别【鸟or飞机】?深度学习与卷积神经网络
笔记整理:机器学习必知的7个核心要点 | 图文 案例
揭秘“图像识别”的工作原理
让计算机拥有一双眼睛,人工智能科学家已经努力了半个世纪
从卷积到变换:探讨ViT模型的进步
利用Python和Tensorflow构建卷积神经网络的9个步骤
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服