神经元:神经元模型是一个包含输入,输出与计算功能的模型。
前向传播和反向传播:它是神经网络的基本运行方式,前向传播用于计算输出,反向传播用于更新网络参数。
激活函数:激活函数决定神经元的输出。学习不同的激活函数以及它们的作用。
损失函数:损失函数用于衡量模型的预测与实际结果之间的差异。了解不同的损失函数和它们的适用场景。
1.2深度学习框架
以下是一些常见的深度学习框架:
PyTorch:由Facebook开发的开源框架,前沿算法多为PyTorch版本,如果是你高校学生or研究人员,建议学这个。相对于TensorFlow,Pytorch在易用性上更有优势,更加方便调试。
1.3经典模型
循环神经网络(RNN):用于序列数据建模和自然语言处理任务的常用模型,传统神经网络的结构比较简单,通常为:输入层–隐藏层–输出层。
生成对抗网络(GAN):用于生成新的数据样本的模型。是近年来深度学习领域的一个热点方向。GAN并不指代某一个具体的神经网络,而是指一类基于博弈思想而设计的神经网络。GAN由两个分别被称为生成器(Generator)和判别器(Discriminator)的神经网络组成。其中,生成器从某种噪声分布中随机采样作为输入,输出与训练集中真实样本非常相似的人工样本;判别器的输入则为真实样本或人工样本,其目的是将人工样本与真实样本尽可能地区分出来。生成器和判别器交替运行,相互博弈,各自的能力都得到升。理想情况下,经过足够次数的博弈之后,判别器无法判断给定样本的真实性,即对于所有样本都输出50%真,50%假的判断。此时,生成器输出的人工样本已经逼真到使判别器无法分辨真假,停止博弈。这样就可以得到一个具有“伪造”真实样本能力的生成器。
二、经典入门Demo实战
2.1深度学习原理
这里定义一个概念,输入和输出,输入就是已知的信息,输出就是由输入获得的认知的结果。我们将一个从已有的信息,通过计算、判断和推理得到结果的认知过程统称为“学习”。
如何让机器也可以进行学习呢?学术界为此提出了“神经网络”的概念。人脑中负责活动的基本单元是神经元,这些神经元互相连接成一个被称为神经网络的庞大结构。由此,学术界模仿人脑“神经网络“建立一个人工神经网络(ANN),我们通常也简称为神经网络。
将1+1=2用神经网络可以表示为如下结构。
我们将“1”、“+”、“1”与“2”同时作为输入不断训练神经网络(不断告诉机器1+1=2),在训练若干次后,神经网络将会学会“1+1=2”。同样的,我们将1+2=3放入神经网络中去,不断进行训练,若干次后神经网络也将学会1+2=3。如此循环往复,我们可以教会神经网络进行加法运算,进而可以让神经网络学会算术运算,我们把这个过程称为深度学习。
2.2一个手写数字的识别的实现过程Demo
下面我将通过一个手写数字的识别的案例来进一步讲解深度学习,带领大家体验一次完整的深度学习实现的全过程。
假设现在我们手上很多张手写的数字图片,需要通过深度学习让机器“认识”这些图片上的数字,然后告诉我们每一张图片上的数字是多少。
那么我们应该如何实现呢?总体的思路如下:
我们先拿出6万张图片给机器进行学习(需要告诉机器每一个图片上写的是哪一个数字)。
在学习后,再拿出1万张机器没“见过”的图片给它进行识别,让它告诉我们,图片上写的是哪一个数字。
重复上面的过程,直到机器可以认识手写的数字。
至此,完成便可实现手写数字识别这一效果。
程序执行步骤:
①学习6万张图片上的数字
②用1万张图片测试机器的学习效果(这1万张不参与①的训练)
③重复①、②
现在你需要做的是:了解每一个模块实现的功能,从整体上把握整份代码。
开发环境:
编译器:JupyterNotebook
深度学习框架:TensorFlow2.4.1
1.准备数据
导入数据
可视化
这里我们用第三方库matplotlib输出手写数字图片,看看我们的手写数字(数据集)是什么样子的。
调整图片格式
需要将图片调整为特定格式程序才可以进行学习
#调整数据到我们需要的格式train_images=train_images.reshape((60000,28,28,1))test_images=test_images.reshape((10000,28,28,1))#输出数据sahpetrain_images.shape,test_images.shape,train_labels.shape,test_labels.shape((60000,28,28,1),(10000,28,28,1),(60000,),(10000,))
(60000,28,28,1):表示为:60000张28*28的灰度图片,最后一个数字为1时,代表灰度图片;为3时代表彩色图片。
2.构建神经网络模型
我们将图片输入到网络,图片首先会将其数字化,紧接着通过卷积层提取图片上这个数字的特征,最后通过数字的特征判断这个数字是哪一个。结构图如下:
上面的结构图中,向我们展示了五层结构,那么每一层具体是用来做什么的呢?
输入层:用于将数据输入到神经网络
卷积层:使用卷积核提取图片特征,卷积核相当于一个小型的“特征提取器”
Flatten层:将多维的输入一维化,常用在卷积层到全连接层的过渡
全连接层:起到“特征提取器”的作用
输出层:输出结果
卷积核与全连接层从某些方面上讲都有提取特征的作用,但是所采用的方法是不同的。
这部分为深度学习的核心内容,就是构建模型,先不管这快,现在我们主要任务是跑通整个程序,从整体上了解一下深度学习是什么。
model=models.Sequential([#layers.Conv2D(32,(3,3),input_shape=(28,28,1)),#卷积层:提取图片特征layers.Flatten(),#Flatten层:将二维图片压缩为一维形式layers.Dense(100),#全连接层:将特征进行进一步压缩layers.Dense(10)#输出层:输出结果])#打印网络结构
3.编译模型
在这一步,我们需要设置模型的优化器,损失函数、评价函数:
优化器:帮助模型更好的训练
损失函数:用于估量预测值与真实值的不一致程度
评价函数:评价模型的质量
4.训练模型
将数据传入模型进行训练,传入的数据分为训练数据、验证数据两部分。训练数据(训练集)用于训练模型,验证数据(验证集)用于监测模型的效果。epochs表示模型的学习轮数(次数)。
"""train_images:训练数据的图片train_labels:训练图片对应的标签epochs:训练轮数validation_data:验证数据"""history=model.fit(train_images,train_labels,epochs=3,validation_data=(test_images,test_labels))
5.预测
#打印我们想要进行预测的图片plt.imshow(test_images[1])
输出测试集中第一张图片的预测数组
这组浮点数对应着0~9,最大的浮点数对应着的数字就是神经网络的预测结果。
importnumpyasnp#输出预测结果pre_num=np.argmax(pre[1])print("模型的预测结果为:",pre_num)模型的预测结果为:2
总结
我们通过算术学习、手写数字识别了解了什么是深度学习,也用TensorFlow2实现了手写数字识别,从整体上了解了一个深度学习程序是什么样子的,应该有哪些步骤