如何构建深度神经网络,提升训练速度和效率,并更好地解决实际问题 Practical Advice for building deep neural networks
作者:禅与计算机程序设计艺术
1.简介
1997年,Yann LeCun教授发表了论文“Backpropagation applied to handwritten zip code recognition”,成功地证明了深层神经网络在图像识别、文本分类、机器翻译等领域中的有效性。此后,深度学习的火爆开始席卷全球,越来越多的学者开始研究深层神经网络的构造方法和优化算法,如AlexNet、VGG、GoogleNet、ResNet等等。而随着科技的发展,人们对深度学习的认识也不断加深,越来越多的企业、组织机构开始尝试部署大型的深度学习系统,形成了深度学习应用落地的现状。相信随着深度学习模型越来越复杂、数据量越来越大,越来越多的人会和我们一起,一同探索深度学习的奥秘,探讨如何构建深度神经网络,提升训练速度和效率,并更好地解决实际问题。本书将以实践出真知的方式,为大家提供一些有用的建议和建议,希望能够帮助读者理解和掌握深度学习的工作原理。
2.核心概念和术语
深度学习(deep learning)是一个新兴的机器学习方法,它利用了人脑的层次结构并结合了多个隐藏层的神经网络结构,可以自动学习特征并且泛化到新的输入上。它由和他所在的麻省理工学院的等人于2012年提出,并于近几年的发展取得了巨大的进步。深度学习的关键就是特征提取和分类器设计。深度学习有以下几个主要的概念和术语:
模型(Model)
深度学习模型包括前向传播(forward propagation),反向传播(back-propagation),损失函数(loss function),优化算法(optimization algorithm),以及评估指标(evaluation metrics)。
1) 前向传播 Forward Propagation
深度学习的模型通过前向传播计算输出结果,这就是为什么它被称为深度学习,因为每一层都是一个计算单元,即层与层之间通过传递数据进行通信。因此,在深度学习中,输入样本首先经过一个或多个隐藏层,这些隐藏层的激活值会作为下一层的输入,再经过输出层得到最终的输出。如下图所示:
在上图中,我们看到输入层接收原始输入样本x,隐藏层h1、h2、…、hn接收从第一层到当前层的输入,输出层o接收隐藏层的输出,所有节点用圆圈表示。
通过正向传播过程,各个节点完成下面的操作:
- 接受输入信号,并将其处理为内部状态;
- 对内部状态进行处理,并产生输出信号;
- 将输出信号反馈给下一层;
每一层的运算都受到上一层的影响,因此,深度学习模型具有层次化的特点。
2) 反向传播 Backward Propagation
反向传播是深度学习的核心,它用于更新权重参数。它根据梯度下降法(Gradient Descent)迭代更新权重参数,使得误差最小。具体来说,反向传播算法计算模型在每一层上的误差梯度,然后将这些梯度反向传播到上一层,最后更新每一层的权重参数。
下面给出反向传播的过程:
当模型收到误差信号时,它就开始反向传播,计算每个权重的参数更新值,使得模型的输出误差最小。具体的方法是:
- 根据误差信号,反向传播算法计算各个节点的误差梯度;
- 遍历网络,计算每个权重参数的更新值;
- 更新权重参数;
反向传播算法重复这个过程,直至误差最小或达到最大迭代次数。
3) 损失函数 Loss Function
损失函数是衡量模型预测值的偏差程度的一种方法。在深度学习中,我们通常采用的是平方误差损失函数,即预测值与真实值之间的均方差。
损失函数的计算公式如下:
L = ( 1 / N ) ∗ ∑ i = 1 N ( y i − t i ) 2 L = (1/N)*∑_{i=1}^{N}(y_i−t_i)^2 L=(1/N)∗i=1∑N(yi−ti)2
N是样本数量,yi是第i个样本的标签,ti是预测值。
上式描述的是整个数据集上的均方差,通常称为训练误差(training error)。但是,在实际情况中,我们只关心某个特定数据点的预测错误,称为测试误差(testing error)。为了更好地衡量测试误差,需要考虑模型在该数据点上的损失值。损失值等于模型输出的概率和标签之间的交叉熵损失(cross-entropy loss)。交叉熵损失用来衡量模型对离散的概率分布的拟合程度。交叉熵损失计算公式如下:
J ( Θ ) = − ( 1 / m ) ∗ ( ∑ i = 1 m [ y i l o g ( h θ ( x ( i ) ) ) + ( 1 − y i ) l o g ( 1 − h θ ( x ( i ) ) ) ) ] J(Θ)=-(1/m)*(\sum^m_{i=1}[y^ilog(hθ(x^(i)))+(1-y^i)log(1-hθ(x^(i))))] J(Θ)=−(1/m)∗(i=1∑m[yilog(hθ(x(i)))+(1−yi)log(1−hθ(x(i))))]
m是样本数量,Θ是模型的参数,yi和hθ(x(i))分别是第i个样本的标签和模型的输出概率。
如果我们想让损失函数尽可能小,那么最优的模型参数应该使得模型在训练集上的损失值最小,也就是说,我们想要找到一个使得输出概率和标签相同且概率最高的模型。
4) 优化算法 Optimization Algorithm
梯度下降(gradient descent)是优化算法,它用于更新模型参数,使得损失函数最小。深度学习的优化算法有很多种,包括随机梯度下降(SGD),动量法(Momentum)、Adagrad、Adam等。
SGD算法的一般过程是:
初始化模型参数θ;
以 mini-batch 的形式(又称作批次)抽取训练集的一个子集 b a t c h = x ( 1 ) , x ( 2 ) , … , x ( m ) batch={x^(1), x^(2), …, x^(m)} batch=x(1),x(2),…,x(m)
在 batch 上进行前向传播和反向传播,计算损失值;
使用计算得到的梯度 δθ 来更新θ的值,θ:=θ−ηδθ,其中 η 是学习速率(learning rate),δθ 是模型参数θ关于损失函数L的梯度,即 ∂L/∂θ。
Adam算法的主要特点是自适应调整学习速率,即通过估计梯度的一阶矩和二阶矩来计算学习速率。具体的做法是在每一步迭代中动态调整学习速率,而不是像普通的梯度下降法那样固定学习速率。它的步骤如下:
- 初始化一阶矩记忆变量 v:=0 和 二阶矩记忆变量 s:=0;
- 抽取 mini-batch={x^(1), x^(2), …, x^(m)};
- 在 mini-batch 上进行前向传播和反向传romise,计算损失值 L;
- 用公式 ∇L = 1/m + λ*θ 来计算模型参数θ关于损失函数L的梯度;
- 用公式 v : = β 1 ∗ v + 1 ∗ ( δ θ ) v:=β1*v+1*(δθ) v:=β1∗v+1∗(δθ),β1 为超参数,δθ 是模型参数θ关于损失函数L的梯度;
- 用公式 s : = β 2 ∗ s + 1 ∗ ( δ θ ) 2 s:=β2*s+1*(δθ)^2 s:=β2∗s+1∗(δθ)2,β2 为超参数,δθ 是模型参数θ关于损失函数L的梯度;
- 用公式 ω : = v / ( s q r t ( s ) + ε ) ω:=v/(sqrt(s)+ε) ω:=v/(sqrt(s)+ε) 来计算新的学习速率;
- 使用新的学习速率 ω 来更新模型参数θ。
5) 评估指标 Evaluation Metrics
深度学习模型的训练过程往往是十分耗时的,所以需要评估模型的训练效果。常用的评估指标有准确率(accuracy),精确率(precision),召回率(recall),F1分数等。
准确率是分类正确的样本数除以总的样本数。它反映了一个分类器的鲁棒性,常用作二类分类的性能指标。
精确率(Precision)是指在所有的正例样本中,分类器找出的真阳性样本数比例。它的值越接近1,说明分类器越能够找出所有的真阳性样本。
召回率(Recall)是指在所有的正例样本中,分类器找出的真阳性样本的比例。它的值越接近1,说明分类器越能够正确地发现所有正例样本。
F1分数(F1 score)是精确率和召回率的调和平均数,它可以用来综合考虑两个指标。它的值在0~1之间,当值为1的时候,说明精确率和召回率都很高。
深度学习模型常用的评估指标还有ROC曲线(Receiver Operating Characteristic Curve,读音为:“读音为 ‘R’ and ‘och’ 之 ‘e’”),它可以帮助分析模型的预测能力和健壮性。ROC曲线横坐标是假阳性率(False Positive Rate,简称 FPR),纵坐标是真阳性率(True Positive Rate,简称 TPR),阈值表示模型的判别临界值,ROC曲线下的面积表示模型的AUC(Area Under the ROC Curve,ROC曲线的下半部分面积)。AUC的取值范围是0~1,值越大,说明模型的性能越好。
数据集(Dataset)
深度学习模型的数据集一般由输入样本和相应的输出标签组成。输入样本是模型的输入,它可以是图片、文本、声音、视频或者其他形式的静态或动态数据。输出标签是模型期望输出的分类结果,它可以是具体的类别、属性、目标等。对于分类任务,输出标签可以是离散的类别,也可以是连续的概率值。
损失函数和优化算法的选择
深度学习模型的选择要综合考虑三个因素:样本量、表达能力、硬件限制。模型的样本量越大,训练时间越长,模型的表达能力就越强,但同时也越容易过拟合;硬件资源有限时,只能采用轻量级模型。
损失函数和优化算法也需要合理选择,常用的损失函数包括平方误差损失函数(squared error loss)、交叉熵损失函数(cross-entropy loss)、带权重的交叉熵损失函数(weighted cross-entropy loss)等。常用的优化算法包括随机梯度下降算法(Stochastic Gradient Descent,SGD)、动量法(Momentum)、Adagrad、Adam等。
常见的机器学习任务
深度学习模型的训练过程涉及许多不同的任务,这里列举一下常见的机器学习任务,供读者参考:
- 分类(Classification):区分输入样本的类别。常见的模型有逻辑回归(Logistic Regression),支持向量机(Support Vector Machine,SVM),K近邻(KNN),朴素贝叶斯(Naive Bayes)等。
- 回归(Regression):根据输入样本的特征预测输出值。常见的模型有线性回归(Linear Regression),决策树回归(Decision Tree Regressor),神经网络回归(Neural Network Regressor)等。
- 聚类(Clustering):将输入样本划分到一组相似的组中。常见的模型有层次聚类(Hierarchical Clustering),k-means聚类(K-Means Clustering)等。
- 异常检测(Anomaly Detection):检测异常输入样本。常见的模型有基于密度的异常检测(Density-based Anomaly Detection)、基于聚类的异常检测(Clustering-based Anomaly Detection)等。
- 生成模型(Generative Model):生成模型能够根据训练数据生成新的样本。常见的模型有变分自动编码器(Variational Autoencoder)、GAN(Generative Adversarial Networks)等。
- 推荐系统(Recommender System):推荐系统能够根据用户的历史记录推荐相关的产品。常见的模型有协同过滤(Collaborative Filtering)、矩阵分解(Matrix Factorization)、基于内容的推荐系统(Content-based Recommendation Systems)等。
3. 核心算法原理与具体操作步骤
3.1 单层感知机(Perceptron)
1) 概念
单层感知机(Perceptron)是1958年Rosenblatt提出的,它是神经元的简单模型,只有输入层和输出层,没有中间的隐含层。其原理是,如果输入向量x在某个超平面w的方向上投影距离小于某个阈值,则输出1,否则输出0。
2) 操作步骤
- 1)导入训练数据集X和对应的标记向量y;
- 2)初始化权重向量w,设置超参数α;
- 3)选取超参数λ,构造损失函数 J ( w , b ) = 1 / 2 ∗ ∑ ∣ w x + b − y ∣ 2 + λ ∣ ∣ w ∣ ∣ 2 J(w,b)=1/2*∑|wx+b-y|^2+λ||w||^2 J(w,b)=1/2∗∑∣wx+b−y∣2+λ∣∣w∣∣2;
- 4)定义梯度下降算法:repeat{
w : = w − α ∗ [ ∑ ( w x + b − y ) ( x ) ] w:=w−α*[∑(wx+b-y)(x)] w:=w−α∗[∑(wx+b−y)(x)]
b : = b − α ∗ [ ∑ ( w x + b − y ) ] b:=b−α*[∑(wx+b-y)] b:=b−α∗[∑(wx+b−y)] } until convergence;
从损失函数的定义可以看出,该模型对误差项采用L2范数惩罚项。α是学习速率,它控制模型的训练效率。
有了训练数据的输入、输出、权重和学习速率之后,就可以运行梯度下降算法来求得最佳的参数。梯度下降算法每次迭代时,都会计算输入向量与输出的差值,并更新权重向量和阈值b,使得损失函数的导数尽可能小。
感知机模型在训练时只能处理线性可分的问题,如果输入空间不是线性可分的,需要增加更多的隐藏层。
3.2 多层感知机(Multilayer Perceptron)
1) 概念
多层感知机(Multilayer Perceptron,MLP)是1986年Werbos和Taylor提出的,它是神经网络的一种,它有多层神经元层,输入层、隐藏层、输出层。其中,输入层负责输入特征的处理,隐藏层负责非线性转换,输出层负责输出预测。MLP通过层次化的神经网络结构,能够有效地学习输入数据的非线性关系。
2) 操作步骤
- 1)导入训练数据集X和对应的标记向量y;
- 2)初始化权重矩阵W,设置超参数α;
- 3)选取超参数λ,构造损失函数 J ( W , b ) = 1 / 2 ∗ ∑ ∣ W x + b − y ∣ 2 + λ ∑ ∑ W i j 2 J(W,b)=1/2*∑|Wx+b-y|^2+λ∑∑Wij^2 J(W,b)=1/2∗∑∣Wx+b−y∣2+λ∑∑Wij2;
- 4)定义梯度下降算法:repeat{
W : = W − α ∗ [ ∑ [ ∑ ( ∇ L ( z j ) ∇ J ( W ) ) + λ W ] ] W:=W−α*[∑[∑(∇L(zⱼ)∇J(W))+λW]] W:=W−α∗[∑[∑(∇L(zj)∇J(W))+λW]]
b : = b − α ∗ [ ∑ [ ∑ ( ∇ L ( z j ) ∇ J ( b ) ) ] ] b:=b−α*[∑[∑(∇L(zⱼ)∇J(b))]] b:=b−α∗[∑[∑(∇L(zj)∇J(b))]] } until convergence;
从损失函数的定义可以看出,该模型对权重矩阵W采用L2范数惩罚项,而且对两个矩阵之间也采用L2范数惩罚项,目的是为了防止过拟合。
由于MLP有多层神经元层,所以在计算导数时需要把所有层的梯度计算出来。梯度下降算法每次迭代时,都会计算隐藏层和输出层神经元的梯度,并更新权重矩阵和阈值向量b,使得损失函数的导数尽可能小。
MLP模型可以处理非线性关系,并且能学习输入数据的复杂非线性关系。
3.3 BP算法
1) 概念
BP算法(Backpropagation,BP)是1970年Rumelhart、Hinton和Williams提出的,是一种最常用的训练深度神经网络的算法,它通过反向传播来更新权重参数,属于无监督学习。
2) 操作步骤
- 1)导入训练数据集X和对应的标记向量y;
- 2)初始化权重矩阵W,设置超参数α;
- 3)选取超参数λ,构造损失函数 J ( W , b ) = 1 / 2 ∗ ∑ ∣ W x + b − y ∣ 2 + λ ∑ ∑ W i j 2 J(W,b)=1/2*∑|Wx+b-y|^2+λ∑∑Wij^2 J(W,b)=1/2∗∑∣Wx+b−y∣2+λ∑∑Wij2;
- 4)定义BP算法:repeat{
y = σ ( W x + b ) y=σ(Wx+b) y=σ(Wx+b)
∇ J = ( y − y ′ ) ∗ σ ′ ( W x + b ) ∇J=(y-y')*σ'(Wx+b) ∇J=(y−y′)∗σ′(Wx+b)
d W = ∑ [ ( y − y ′ ) ∗ x ′ ] dW=∑[(y-y')*x'] dW=∑[(y−y′)∗x′]
d b = ∑ [ y − y ′ ] db=∑[y-y'] db=∑[y−y′]
W : = W − α ∗ d W W:=W−α*dW W:=W−α∗dW
b : = b − α ∗ d b b:=b−α*db b:=b−α∗db } until convergence;
由于BP算法使用了反向传播,所以它可以自动计算梯度,不需要人工去计算梯度。
在BP算法中,先计算输出层神经元的输出y,然后通过激活函数σ()来计算神经元的输出值。计算输出层神经元的梯度∇J,并计算输出层和隐藏层的权重矩阵W和偏置向量b的梯度。
最后更新权重矩阵W和偏置向量b,通过梯度下降算法来逐渐减小损失函数J的大小。
BP算法虽然很常用,但它对训练样本的要求比较苛刻,不能处理缺失值和异常值。
3.4 CNN
1) 概念
CNN(Convolutional Neural Network,卷积神经网络)是2012年AlexNet、ZFNet、GoogLeNet、VGG、ResNet、DenseNet等一系列深度学习模型的基础。CNN的特点是局部连接和共享权重,它能够学习到数据的局部特征信息,并能够学习到图像中复杂的模式。
2) 操作步骤
- 1)导入训练数据集X,设置超参数;
- 2)构造卷积层,它具有多个卷积核,每个卷积核是一个小的过滤器,可以滑动来识别输入图片的不同特征;
- 3)使用池化层来减少特征的维度,来有效地降低计算量;
- 4)添加Dropout层来避免过拟合;
- 5)使用全连接层来学习数据的全局特征;
- 6)定义损失函数和优化算法;
- 7)训练模型;
- 8)预测结果;
CNN通过多层卷积、池化、全连接层等操作来实现图像识别任务,提升模型的学习能力。通过丰富的网络架构和训练策略,它能够有效地学习到图像的全局和局部特征,并且在一定程度上能够防止过拟合。
3.5 RNN
1) 概念
RNN(Recurrent Neural Network,递归神经网络)是1988年Schmidhuber提出的,它是深度学习模型的一种,它能够处理序列数据,例如文本、时间序列数据。RNN能够捕捉时间序列数据的长期依赖关系。
2) 操作步骤
- 1)导入训练数据集X,设置超参数;
- 2)构造循环神经网络层,它含有一个循环单元,并且每个单元有多个神经元,可以存储前一时刻的信息;
- 3)添加Dropout层来避免过拟合;
- 4)使用全连接层来学习数据的全局特征;
- 5)定义损失函数和优化算法;
- 6)训练模型;
- 7)预测结果;
RNN通过循环神经网络层实现对序列数据的建模,它的网络架构非常灵活,它可以在不同的位置学习到前后的相关信息,并且能够有效地处理长期依赖关系。
3.6 LSTM
1) 概念
LSTM(Long Short-Term Memory,长短期记忆神经网络)是Hochreiter、Schmidhuber、Chung等人于2000年提出的,它是RNN的一种改进版本,它的特点是能保留之前的信息,这样可以提高模型的记忆能力。
2) 操作步骤
- 1)导入训练数据集X,设置超参数;
- 2)构造LSTM层,它有多个门控单元,用来控制输入、遗忘、输出和记忆单元;
- 3)添加Dropout层来避免过拟合;
- 4)使用全连接层来学习数据的全局特征;
- 5)定义损失函数和优化算法;
- 6)训练模型;
- 7)预测结果;
LSTM通过引入门控单元,让网络能够记忆之前的信息,可以有效地处理长期依赖关系。
3.7 Attention
1) 概念
Attention是Deepmind提出的,它能够帮助神经网络学习到全局信息,并关注到图像的重要区域,从而提高准确率。
2) 操作步骤
- 1)导入训练数据集X,设置超参数;
- 2)构造注意力层,它有三个子层,Query、Key和Value,它们都是一层神经网络,通过计算这三层之间的注意力权重,帮助模型学习到全局信息;
- 3)添加Dropout层来避免过拟合;
- 4)使用全连接层来学习数据的全局特征;
- 5)定义损失函数和优化算法;
- 6)训练模型;
- 7)预测结果;
Attention通过对不同位置的特征进行注意力权重的分配,能够帮助模型学习到全局信息,并关注到图像的重要区域,从而提高准确率。
4. 具体代码实例和解释说明
本章节以多层感知机(MLP)的代码实例,讲解如何使用Tensorflow框架来搭建深度神经网络,并实现图片分类任务。
4.1 安装TensorFlow
TensorFlow是一个开源的机器学习平台,可以快速开发、训练和部署深度学习模型。首先,我们需要安装TensorFlow。你可以通过pip命令安装最新版本的TensorFlow:
!pip install tensorflow
或下载TensorFlow的安装包,根据你的操作系统进行安装,安装完成后,你可以检查TensorFlow的版本号:
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
如果安装成功,你应该会看到输出类似下面的内容:
TensorFlow version: 2.0.0
4.2 加载数据
接下来,我们需要载入图片数据集。这里我使用的是MNIST手写数字数据集。如果你没有下载过这个数据集,你可以通过以下代码来下载:
!wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
!wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
!wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
!wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
然后,我们可以使用TensorFlow提供的数据读取API来加载数据。这里我只载入了训练集和测试集中的前1000张图片,你可以修改这行代码来载入更多的图片。
from tensorflow.keras.datasets import mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train[:1000].reshape(-1, 28 * 28).astype('float32') / 255.0
Y_train = Y_train[:1000].astype('int64')
X_test = X_test[:1000].reshape(-1, 28 * 28).astype('float32') / 255.0
Y_test = Y_test[:1000].astype('int64')
上面这段代码载入MNIST数据集,并将其转化为浮点数格式且归一化,然后只取训练集和测试集中的前1000张图片。
4.3 创建模型
创建模型最简单的方法是使用Sequential类,它是一个线性堆栈,可以把各个层串联起来。我们可以把MLP模型的结构添加到这个类里,这样就创建了一个完整的模型。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
model = Sequential([
Dense(512, activation='relu', input_shape=(28 * 28,)),
Dropout(0.2),
Dense(512, activation='relu'),
Dropout(0.2),
Dense(10, activation='softmax')
])
以上代码创建一个MLP模型,它有3层,分别是:
- 第一个全连接层,有512个神经元,激活函数是ReLU;
- 第二个全连接层,有512个神经元,激活函数是ReLU;
- 第三个全连接层,有10个神经元,激活函数是Softmax。
输入层的shape是(None, 28 * 28)。Dropout层用来防止过拟合,Dropout率设置为0.2。输出层使用softmax,因为这是多分类问题。
4.4 编译模型
接下来,我们需要编译模型。编译模型的目的是配置模型的损失函数、优化器、和指标列表。这里我们选择categorical crossentropy作为损失函数,adam优化器,以及 accuracy 作为指标。
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
编译完成后,模型就准备好了。
4.5 训练模型
训练模型最简单的办法是调用fit()方法。这里我们设置训练轮数和批量大小,并调用训练集。
history = model.fit(X_train, Y_train, epochs=10, batch_size=32, validation_split=0.2)
fit()方法返回一个history对象,它包含训练过程中所有指标的变化,包括损失函数、准确率等。我们可以通过history对象的成员函数plot()来绘制训练过程中的指标变化图。
plt.figure()
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
上面这段代码绘制了模型在训练集和验证集上的准确率变化。
4.6 测试模型
最后,我们测试模型的性能,在测试集上计算准确率。
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test Accuracy:', test_acc)
打印出来的准确率应该在0.9左右,表示模型在测试集上的表现较好。
5. 未来发展趋势与挑战
深度学习已经成为机器学习领域的一个热点。它的各种模型都在不断革命,并且越来越深。各家公司正在逐渐研发更加复杂的深度学习模型,比如更深层的网络、更深的网络结构、更宽的网络、多尺度、条件随机场、生成模型等。
除了模型的深度、宽度、多尺度之外,还有一些难题也在紧锣密鼓地等待解决。比如对抗样本的生成、隐私保护、增强学习、深度强化学习、图神经网络等。另外,计算机算力的发展也促进了深度学习的进步。在未来,深度学习的发展将会逐渐进入真正意义上的主流,成为人工智能领域的主流技术。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
