深度学习框架搭建

深度学习(Deep Learing)是机器学习的一个分支领域:它是从数据中学习表示的一种新方法,强调从连续的层中进行学习,这些层对应于越来越有意义的表示。

其实深度学习就是机器学习的一个分支,需要解释一下的是,这里的”深度“并不意味着获取更深层次的理解,而是指一系列连续的表示层。数据模型中包含多少层,这被称为模型的深度。深度学习通常包含数十个甚至上百个连续的表示层,这些表示层全都是从训练数据中自动学习的。与此相反,机器学习方法的重点往往是仅仅学习一两层的数据表示,因此有时机器学习也被称为浅层学习。

而深度学习的基础就是机器学习,所以,在开始学习之前,我们有必要再回去复习一下之前机器学习所提到的一些知识点(自行复习

为什么深度学习会兴起?

其实早在1989年,深度学习就已经为人们所知,但为什么深度学习的兴起却是在近20年呢?

主要可以归结于一下三点

硬件

数据集和基准

算法上的改进

因为硬件的改进,使得数据的收集越发地简便,与之相对应的,数据集的体量也呈现一种指数型的增长。而在不同的数据量下,机器学习和深度学习的性能会体现出如下图的状态,不难看出,数据量越大,深度学习训练出来的神经网络性能远优于机器学习

当然在数据量比较小的时候,手动设计组件的能力比较强时,机器学习的算法可能比深度学习的算法性能更优。在机器学习中,我们必须竭尽全力让初始输入数据更适合用这些方法处理,所以必须手动为数据设计好的表示层。这叫作特征工程。与此相反,深度学习完全将这个步骤自动化,利用深度学习,你可以一次性学习所有特征,而无须自己手动设计。这极大地简化了机器学习工作流程,通常将复杂的多阶段流程替换为一个简单的、端到端的深度学习模型。

不仅是数据的体量变大,算法的创新也是促进深度学习发展的一大因素

举个例子,在之前的机器学习的推文中,我们有提到过sigmoid函数(蓝色),这个是逻辑回归的联系函数

而深度学习的算法创新就是在于把sigmoid函数转换到ReLU函数(红色)。从绿色箭头所指的地方不难看出,在这两个点,sigmoid函数的梯度都接近于0,也就导致了算法的学习效率非常的慢,因为使用梯度下降法时,梯度接近于0,会导致参数变化的非常缓慢。而通过改变激活函数,也就是红色箭头所指的区域,它对所有为正值的输入,输出都是1,因此梯度不会逐渐趋向于0,所以在右边箭头所指的区域,我们只需要把sigmoid函数转化为ReLU函数,就能够使得梯度下降算法运行的更加快。

ReLU 激活函数

又称修正线性单元,从趋近于零开始,然后变成一条直线。这个函数被称作 ReLU 激活函数,它的全称是 Rectified Linear Unit。rectify(修正)可以理解成𝑚𝑎𝑥(0, 𝑥),这也是你得到一个这种形状的函数的原因

修正是指取不小于0的值

作为一个神经网络,这可能是最简单的神经网络。我们把房屋的面积作为神经网络的输入(我们称之为𝑥),通过一个节点(一个小圆圈),最终输出了价格(我们用𝑦表示)。其实这个小圆圈就是一个单独的神经元,接着你的网络实现了上图所画出的这个函数的功能。

最简单的神经网络

对于ReLU函数不理解的同学可以不用太担心,在后续的推文我们会继续聊到它

神经网络

接下来,让我们对神经网络有一个初步的认识

我们把单神经网络看做成为一个反射弧,拿反射弧的概念来类比一下,你输入的数据 𝑥,就是传入神经接收的冲动,而节点,就是神经中枢,最终的输出𝑦,就是传出神经传出的冲动。

那么当我们想要完成一个复杂的动作,势必要由多个反射弧参与,类似的,当我们想要组建一个更大功能更强的神经网络,我们需要把多个单神经元叠加到一起,从而搭建出一个更加大的神经网络。

虽然这个比喻并不是很准确,但是这可以尽快地帮我们进入到角色

让我们来看一个例子,当我们想要预测一个房屋的价格,我们可能需要考虑到很多东西,比如房子的大小,房间数量,街区富裕程度等。那么由房子的大小和房间的数量,我们可以想到是由一个家庭人口数量来起着较大的影响因素。那么其他的因素 𝑥 也可以这样子类比出是由某一因素而起着重要的原因

在图上每一个画的小圆圈都可以是ReLU的一部分,也就是指修正线性单元,或者其它稍微非线性的函数。基在这个情景里,家庭人口、步行化程度以及学校的质量都能帮助你预测房屋的价格。以此为例,𝑥 是所有的这四个输入,𝑦 是你尝试预测的价格,把这些单个的神经元叠加在一起,我们就有了一个稍微大一点的神经网络。这显示了神经网络的神奇之处,当你实现它之后,你所需要做的只是把影响价格的因素𝑥输入进去,就可以得到输出𝑦。所有的中间过程都会由它自己完成

当我们已知下图中输入的𝑥,那么这个神经网络的任务就是输出预测价格𝑦。当然,我们会注意到图中有一些圈圈,在神经网络中,每一个圈都代表着一个隐藏层,每一个隐藏层的输入都来自于输入的4个𝑥值。但值得一提的是,我们不会决定每一个隐藏层(节点)的意义,一切都是由神经网络自己来决定形成的,所有的节点都是由这4个输入计算得到的。

这就是一个基础的神经网络。你可能发现你自己的神经网络在监督学习的环境下是如此的有效和强大,也就是说你只要尝试输入一个𝑥,即可把它映射成𝑦,就好像我们在刚才房价预测的例子中看到的效果。这也是神经网络所擅长的(神经网络非常擅长计算从𝑥到𝑦的精准映射函数)。

其实整个神经网络的计算过程中,每一层对最终结果的信息会变得越来越丰富。你可以将深度网络看作多级信息蒸馏操作:信息穿过连续的过滤器,其纯度越来越高(即对任务的帮助越来越大)。

这就是深度学习的技术定义:学习数据表示的多级方法

用神经网络进行监督学习

监督学习

定义:给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标[也叫标注(annotation)]

首先让我们对监督学习有一个简单的了解,监督学习指的就是我们给学习算法一个数据集,这个数据集由“正确答案”组成。然后算法根据这些给定好的正确答案,去计算出更多的正确答案,让我们来看图理解一下

红色的代表我已知的每克矿物质所对应的价格,为了计算出更多的“正确价格”,我们拟合出了一个二次函数来预测(蓝色),这样子就可以计算出更多质量矿物质所可能对应的价格了。

回归和分类问题

这是监督学习最常见的两个问题了

回归指的是,通过一系列连续的值来进行预测

而分类指的是,通过一系列离散的值来进行预测

用图像来帮助理解一下,像上面所提到的关于矿物质价格的预测一样,我们根据房子的大小来预测房子的价格,大小是一个连续的值,从500-1000之间可以无限细分,每一个细分的值都可以预测出一个对应的价格

回归

而分类问题是通过一系列离散的值来进行预测,就比如我们判断肿瘤,一般肿瘤会分成1—4期,那么我们规定,1—2期肿瘤为良性,3—4期肿瘤为恶性,根据肿瘤的大小作为分类依据,那么每一个大小(size),都只对应着是/否为恶性肿瘤,那么这里输出的值就是离散值了,像下图,对应着就是一个分类问题

分类

虽然监督学习主要包括分类和回归,但还有更多的奇特变体,像序列生成、语法树预测、目标检测、图像分割等等

这样子的话,我们对监督学习就有了一个初步的了解

结构化数据和非结构化数据

结构化数据是基于数据库的数据,就比我们所收集的一个生存资料,里面会包含着有病人的年龄,生存时间,性别等等。在数据库里面的每一个特征都是被很好地定义了的

而非结构化数据是指比如音频,原始音频或者医学影像资料或文本中的内容(病历)。这里的特征可能是图像中的像素值或文本中的单个单词

从历史上来看,计算机是很难理解非结构话数据的,但是人进化得非常善于理解音频信号和图像之类非结构数据

而深度学习和神经网络却帮助计算机很好地解决了这个问题,也正因为如此,影像组学的发展才会如此迅速,帮助我们解决了很多很复杂繁琐的问题。

神经网络的应用

Input(𝑥)output(𝑦)应用

房子的一些特征价格房地产

广告,user info推荐广告在线广告

图像像素计算机视觉

音频文本语音识别

英文中文机器翻译

图像,雷达信息车辆位置无人驾驶

我们可以看出,我们需要正确地选择𝑥和𝑦,才能够解决特定的问题,而在不同的领域中,所使用到的神经网络是不同的。

像我们之前提到的关于房子价格的预测的问题和在线广告的推荐,我们更多的是使用标准的神经网络

在图像方面的应用,我们通常使用的是卷积神经网络(CNN)

像序列数据,如一段音频,因为在时间的维度上,他是存在着一个先后顺序的,我们通常使用的是递归神经网络(RNN)

而像语言,是逐个逐个出现的,因此我们会用到更加复杂的RNNs

神经网络

初步实战

一开始我们需要搭建tensorflow和keras库,具体可以参考windows下安装Keras2.1.4和下载安装tensorflow(对于版本2.0)

1.windows下安装Keras2.1.4

https://blog.csdn.net/fy_1852003327/article/details/105716094?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161448751616780262582885%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161448751616780262582885&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-105716094.first_rank_v2_pc_rank_v29&utm_term=%E5%AE%89%E8%A3%85keras

2.下载安装tensorflow(对于版本2.0)

https://www.jianshu.com/p/0960392af676

接下来让我们运行代码

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()   #train_images 和 train_labels 组成了训练集(training set)

#在测试集(test set,即 test_images 和 test_labels)上对模型进行测试

#我们先来看一下训练数据

train_images.shape

len(train_labels)

train_labels

#再来看看测试集的数据

test_images.shape

len(test_labels)

test_labels

做完上述的铺垫之后,继续我们接下来的工作流程

#首先,将训练数据(train_images 和 train_labels)输入神经网络;

#其次,网络学习将图像和标签关联在一起;

#最后,网络对 test_images 生成预测,而我们将验证这些预测与 test_labels 中的标签是否匹配。

#进行网络架构

from keras import models

from keras import layers

network = models.Sequential()

network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))

network.add(layers.Dense(10, activation='softmax'))

#这个网络包含 2 个 Dense 层,它们是密集连接(也叫全连接)的神经层。第二层(也是最后一层)是一个 10 路 softmax 层,它将返回一个由 10 个概率值(总和为 1)组成的数组。每个概率值表示当前数字图像属于 10 个数字类别中某一个的概率

做完这一步后,出现了报错,如果您是安装上述教程一样来安装tensorflow和keras的话,因为版本的局限性,可能会出现下面这样子的报错

module'tensorflow'has no attribute'get_default_graph

如果想要查看当前keras版本,可以通过

impor tkeras

print(keras.__version__)

报错的解决方法

1.解决报错的方法

https://www.freesion.com/article/2012205875/

2.查询tensorflow对应keras版本

https://docs.floydhub.com/guides/environments/

3.如果没找到对应版本,解决办法

https://blog.csdn.net/weixin_41963310/article/details/108338428

当然可能在这个网址中,并没有找到对应tensorflow的keras版本,那么这时候你就需要把tensorflow进行降级,具体的可以看这个教程,也可以跟着我接下来的步骤走

pip uninstall tensorflow pip uninstall tensorflow-gpu

#注意这时候电脑询问y/n时,输入y

pip install tensorflow==2.2-i https://pypi.douban.com/simple --user

pip install tensorflow-gpu==2.2-i https://pypi.douban.com/simple

我在pip install tensorflow==2.2 -i https://pypi.douban.com/simple --user时遇到了下图出现的warning,发现是这个C:\Users\ASUS\AppData\Roaming\Python\Python38\Scripts并没有被加到路径中去,为了避免以后出现报错,我们需要把这个加到系统路径中,这一过程自行百度即可

解决完之后,我们继续接下来的步骤

在架构完之后,我们还需要选择编译(compile)步骤的三个参数。

损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进。

优化器(optimizer):基于训练数据和损失函数来更新网络的机制。

在训练和测试过程中需要监控的指标(metric):本例只关心精度,即正确分类的图像所占的比例。

后续的推文会深入地去讲上面这3个东西

#编译步骤

network.compile(optimizer='rmsprop',

loss='categorical_crossentropy',

metrics=['accuracy'])

数据预处理

#在训练开始之前,我们需要把数据变换为网络要求的形状,并缩放到所有值都在 [0, 1] 区间

train_images = train_images.reshape((60000,28*28))

train_images = train_images.astype('float32') /255

#之前训练图像保存在一个 uint8 类型的数组中,其形状为(60000, 28, 28),取值区间为 [0, 255]。我们需要将其变换为一个 float32 数组,其形状为 (60000, 28 * 28),取值范围为 0~1

test_images = test_images.reshape((10000,28*28))

test_images = test_images.astype('float32') /255

#与上面的步骤类似

准备标签

#我们还需要对标签进行分类编码,这个具体会在后续的推文中讲解

fromkeras.utilsimportto_categorical

train_labels = to_categorical(train_labels)

test_labels = to_categorical(test_labels)

现在我们准备开始训练网络,在 Keras 中这一步是通过调用网络的 fit 方法来完成的——我们在训练数据上拟合(fit)模型。

network.fit(train_images, train_labels, epochs=5, batch_size=128)

#训练的结果中显示了两个数字:一个是网络在训练数据上的损失(loss),另一个是网络在训练数据上的精度(acc)

#在最后的结果中我们可以看出,训练的精度达到了98.94%

#来检查一下模型在测试集上的性能。

test_loss, test_acc = network.evaluate(test_images, test_labels)

print('test_acc:', test_acc)

#非常奇怪的是,测试集精度为 97.8%,比训练集精度低不少。

#训练精度和测试精度之间出现这种差距的原因是是过拟合(overfit)造成的。过拟合是指机器学习模型在新数据上的性能往往比在训练数据上要差,这个也会在后续的推文中给大家具体讲讲

以上就是今天的实战例子。你刚刚看到了如何构建和训练一个神经网络,用不到 20 行的Python 代码对手写数字进行分类

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容