【深度学习】2024年深度学习入门指南

本文介绍了深度学习的基本概念、流程,包括数据预处理、模型设计(如使用Keras构建简单判别模型)、训练以及TensorFlow和Keras框架的比较。重点强调了数据的重要性、模型选择的标准,如性能、社区支持和易用性。
摘要由CSDN通过智能技术生成

深度学习(Deep Learning,DL)是机器学习(Machine Learning,ML)领域中的一个研究方向,作用是帮助机器学习项目更接近于人工智能(Artificial Intelligence)。

深度学习主要是学习样本数据的内在规律和表示层次,学习过程中获得的信息对诸如文字、图像和声音等数据的解释很有帮助。深度学习的最终目标是让机器能够像人一样具备分析能力,可以自动识别文字、图像和声音等数据。

深度学习是一个复杂的机器学习算法,目前在搜索技术、数据挖掘、机器学习、机器翻译、自然语言处理、多媒体学习、语音、推荐和个性化技术,以及其他相关领域都取得了令人瞩目的成果。深度学习解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。

图片

  1. 深度学习的基本步骤

1.1   第一步:数据的准备

要进行深度学习的第一步也是最重要的一步,就是数据的准备。数据的来源多种多样,既有不同类型的数据集,也有根据项目需求由项目组自行准备的数据集。本例中笔者准备一份酒店评论的数据集,形式如图 1.4 所示。

图片

这里由逗号将一个文本分成两部分,分别是情感分类和评价主体。其中标记为数字 “1”的是正面评论,标记为数字“0”的是负面评论。

1.2   第二步:数据的处理

我们遇到的第一个问题就是数据的处理。对于计算机来说,直接的文本文字是计算机所不能理解的,因此一个最简单的办法是将文字转化成数字符号进行替代,之后对每个数字生成一个独一无二的“指纹”,也就是“词嵌入(Word Embedding)”。在这里读者只需要将其理解成使用一个“指纹”来替代汉字字符。代码处理如下:

(1)创建 3 个“容器”,对切分出的字符进行存储。

labels = []       #用于存储情感分类,形如[1,1,1,0,0,0,1] vocab = set()     #set 类型,用以存放不重复的字符context = []      #存放文本列表

(2)读取字符和文本。

with open("ChnSentiCorp.txt",mode="r",encoding="UTF-8") as emotion_file: for line in emotion_file.readlines():  #读取  txt 文件line = line.strip().split(",")         #将每行数据以“,”进行分隔labels.append(int(line[0]))            #读取分类  label text = line[1]                         #获取每行的文本context.append(text)                   #存储文本内容for char in text:vocab.add(char)       #将字符依次读取到字库中,确保不产生重复

(3)读取字符并获得字符的长度。

voacb_list = list(sorted(vocab))      #将  set 类型的字库排序并转化成  list 格式print(len(voacb_list))                #打印字符的个数:3508

(4)将文本内容转换成数字符号,并对长度进行补全。

token_list = []                    #创建一个存储句子数字的列表for text in context:                  #依次读取存储的每个句子 #依次读取句子中的每个字并查询字符中的序号token = [voacb_list.index(char) for char in text]#以  80 个字符为长度对句子进行截取或者补全token = token[:80] + [0]*(80 - len(token))#存储在  token_list 中token_list.append(token)token_list = np.array(token_list)     #对存储的数据集进行格式化处理labels = np.array(labels)             #对存储的数据集进行格式化处理

1.3   第三步:模型的设计

对于深度学习而言,模型的设计是非常重要的内容,本例只是 用于演示,采用的是最为简单的一个判别模型,代码如下(仅供演示,详细内容在后续章节中介绍):

import tensorflow as tfinput_token = tf.keras.Input(shape=(80,))     #创建一个占位符,固定输入的格式 #创建  embedding 层embedding = tf.keras.layers.Embedding(input_dim=3508,output_dim=128) (input_token)#使用双向  GRU 对数据特征进行提取embedding = tf.keras.layers.Bidirectional(tf.keras.layers.GRU(128)) (embedding)#以全连接层作为分类器对数据进行分类output = tf.keras.layers.Dense(2,activation=tf.nn.softmax)(embedding) model = tf.keras.Model(input_token,output) #组合模型

1.4   第四步:模型的训练

下面一步是对模型的训练。这里需要定义模型的一些训练参数,如优化器、损失函数、准确率的衡量,以及训练的循环次数等。代码如下(这里不要求读者理解,能够运行即可):

model.compile(optimizer='adam',loss=tf.keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'])#定义优化器、损失函数以及准确率model.fit(token_list, labels,epochs=10,verbose=2) #输入训练数据和  label

完整的程序代码如程序  1-1 所示。 

【程序1-1】

import numpy as np labels = []context = [] vocab = set()with open("ChnSentiCorp.txt",mode="r",encoding="UTF-8") as emotion_file:    for line in emotion_file.readlines():   line = line.strip().split(",")    labels.append(int(line[0]))      text = line[1]    context.append(text)   for char in text:vocab.add(char) voacb_list = list(sorted(vocab))    #3508print(len(voacb_list)) token_list = []for text in context:   token = [voacb_list.index(char) for char in text]   token = token[:80] + [0]*(80 - len(token))   token_list.append(token)   token_list = np.array(token_list) labels = np.array(labels)import tensorflow as tfinput_token = tf.keras.Input(shape=(80,)) embedding =tf.keras.layers.Embedding(input_dim=3508,output_dim=128)(input_token) embedding =tf.keras.layers.Bidirectional(tf.keras.layers.GRU(128))(embedding) output = tf.keras.layers.Dense(2,activation=tf.nn.softmax)(embedding)model = tf.keras.Model(input_token,output) model.compile(optimizer='adam',loss=tf.keras.losses.sparse_categorical_crossentropy, metrics=['accuracy']) # 模型拟合,即训练model.fit(token_list, labels,epochs=10,verbose=2)

1.5   第五步:模型的结果和展示

最后一步是模型的结果展示,这里使用   epochs=10,即运行  10 轮对数据进行训练,结果如图。

图片

可以看到,经过 10 轮训练后,准确率达到了96%,这是一个不错的成绩。

2.深度学习的流程、应用场景和模型分类

2.1   深度学习的流程与应用场景

从前面的例子可以看到,深度学习的一般流程无外乎以下几步:

(1)数据预处理:不管什么任务,数据的处理都是解决问题的关键步骤。

(2)模型搭建:可以自己搭建自己的模型,也可以根据任务利用经典的模型进行细微调整。

(3)训练模型:有了模型、数据之后,可以把数据“喂”给模型,让模型自行学习,直至模型收敛。

(4)结果可视化:在训练过程中,对一些指标进行可视化(比如 loss 损失函数的变化曲线等),可以辅助对已学习模型的判断,也可以辅助模型的验证选择。

(5)测试(预测):基于训练好的模型对新的数据进行预测是模型训练的最终目标.深度学习的应用场景和领域很多(见图 1.6),目前主要是计算机视觉和自然语言处理,以及各种预测等。对于计算机视觉,可以用于图像分类、目标检测、视频中的目标检测等; 

对于自然语言处理,可以用于语音识别、语音合成、对话系统、机器翻译、文章摘要、情感分析等,还可以结合图像、视频和语音一起发挥价值。 还可以深入某一个行业领域。例如,深入医学行业领域,用于医学影像的识别;深入淘宝的穿衣领域,用于衣服搭配或衣服款型的识别;深入保险业、通信业的客服领域,用于对话机器人的智能问答系统;深入智能家居领域,用于人机的自然语言交互等。

图片

总之,适合采用深度学习的任务应具备这样一些特点:

(1)具备大量样本数据。深度学习是需要大量数据作为基础的,如果样本数据难以获取或者数量太少,一般就不适合采用深度学习技术来解决。

(2)样本数据对场景的覆盖度足够完善。深度学习模型的效果完全依赖样本数据表现,如果出现样本数据外的情况,模型的推广性会变差。

(3)结果对可解释性的要求不高。如果应用场景不仅要机器能够完成某项任务,还需对完成过程有明确的可解释性,那么这样的场景就不那么适合采用深度学习。

2.2  深度学习的模型分类

典型的深度学习模型有卷积神经网络(Convolutional Neural Network,CNN)、深度置信网络(Deep Believe Net,DBN)和堆栈自编码网络(Stacked AutoEncoder Network,SAEN)模型等。其主要的思想就是模拟人的神经元,每个神经元接收到信息,处理完毕后传递给与之相邻的所有神经元。

2.2.1 卷积神经网络模型

在无监督预训练出现之前,训练深度神经网络通常非常困难,其中一个特例 就是卷积神经网络。卷积神经网络受视觉系统的结构启发而产生。

最初卷积神经网络计算模型是根据人类视神经研究提出的,其基于视觉神经元之间的局部连接和分层组织图像转换,将有相同参数的神经元应用于前一层神经网络的不同位置,得到一种平移不变神经网络结构形式。

后来,Le Cun 等人在该思想的基础上用误差梯度设计并训练卷积神经网络,在一些模式识别任务上得到优越的性能。至今,基于卷积神经网络的模式识别系统是最好的实现系统之一,尤其是在物体的识别、检测和追踪任务上表现出非凡的性能。

2.2.2 深度置信网络模型

深度置信网络模型可以解释为贝叶斯概率生成模型,由多层随机隐变量组成,上面的两层具有无向对称连接,下面的层得到来自上一层自顶向下的有向连接,最底 层单元的状态为可见输入数据向量。

深度置信网络模型由多个结构单元堆栈组成,结构单元通常为 RBM ( Restllcted Boltzmann Machine,受限玻尔兹曼机)。堆栈中每个 RBM 单元的可视层神经元数量等于前一个 RBM 单元的隐藏层神经元数量。

根据深度学习机制 ,采用输入样例训练第一层RBM单元,并利用其输出训练第二层RBM 模型,将RBM模型通过堆栈增加层来改善模型性能。在无监督预训练过程中,DBN编码输入到顶层 RBM 后,解码顶层的状态到最底层的单元,实现输入的重构。RBM 作为 DBN的结构单元,与每一层 DBN 共享参数。

2.2.3 堆栈自编码网络模型

堆栈自编码网络的结构与 DBN 类似,由若干结构单元堆栈组成,不同之处在于其结构单元为自编码模型(auto-encoder)而不是 RBM。自编码模型是一个两层的神经网络:第一层称为编码层,第二层称为解码层。

图 1.7 向读者展示了更为细分的深度学习模型和训练分类。随着对深度学习的研究深入,不仅仅单纯从模型的构建来分类,还有训练方式、构建架构等更为细分的分类方法。

图片

3. 主流深度学习框架对比

工欲善其事,必先利其器。

读者选择深度学习时,首先会碰到一个非常重要的问题:选择哪个深度学习框架作为学习和使用的主力框架?图 1.8 是目前市场上能看到的一些深度学习框架。

图片

3.1   深度学习框架的选择

从笔者的经验来看,无论前端技术框架、后端技术框架,还是深度学习技术框架,在决定使用前,都需要考虑以下几个方面,也就是在选型上通用的依据。

3.1.1 性能方面

性能方面一部分主要由实现该框架的程序设计语言决定,还有一小部分由框架实现的架构决定。理论上说,运行最快的仍旧是 C 或 C++程序设计语言编写的程序,与CPU指令越接近,程序设计语言的效率就越高。

在真正的工程应用中,造成的差距多来自于样本的数量和网络设计等方面,差距往往是10 倍甚至 100倍。程序设计语言的效率与其相比几乎可以忽略不计。所以,程序设计语言的性能就不是最主要的参考标准了。

3.1.2 社区的活跃度

这些技术框架的社区活跃度是非常重要的参考因素。活跃的社区就意味着很多人在使用这个框架,会有更多人贡献代码、提交 bug、修复 bug,因此用它做项目的风险非常小,而初学者学起来比较容易(入门教程会比较多),也会少踩很多坑。

3.1.3 深度学习语言

深度学习框架几乎都支持  Python 的“驱动”,或者俗称为接口。也不排除少部分框架只支持原生接口,这就不太适合初学者去学习了。

本书采用的 Keras 在这些方面做得都非常不错:

(1)有非常活跃的社区。

(2)后端的 TensorFlow 由谷歌开发和维护,比较有保障。

(3)采用 Python 语言,性能虽然不够快,但是满足目前绝大多数工作要求,往往那种数量级效率的提升是无法通过变更一个框架实现的。

总的来讲,Keras 是现有深度学习框架中比较适合用来进行工程应用的框架。

3.2   Keras 与 TensorFlow

TensorFlow和Keras都是深度学习框架。相对于Keras 来说,TensorFlow 比较灵活,但是难以入门。TensorFlow 实质上就是一个微分器,而 Keras 其实是使用 TensorFlow与Keras 的接口(Keras 作为前端,TensorFlow 作为后端)构建的深度学习框架。Keras 对于初学者来说较为友善,帮助 文档丰富、社区活跃,并且比较易学。可以把 Keras看作TensorFlow 封装后的一个API。

在前面的程序1-1中,笔者使用了大量的 tf.keras.*。tf是TensorFlow 的缩写,也就是说在这个版本的TensorFlow中,Keras作为一封装在TensorFlow中的接口很容易被TensorFlow 调用,这种易用性可以帮助使用者更好地完成任务。

图片

总而言之,当前 Keras与TensorFlow 紧密结合在一起,各自发挥着自己的长处,准确、便捷地给使用者提供帮助。

以上就是本次分享的内容,感谢大家支持。您的关注、点赞、收藏是我创作的动力。

万水千山总是情,点个 👍 行不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值