OpenCV计算机视觉实战(27)——深度学习与卷积神经网络
深度学习已经彻底改变了人工智能,在计算机视觉、自然语言处理和机器翻译等领域取得了显著进展。本节探讨了深度学习的多种架构方法,如卷积神经网络 (convolutional neural network, CNN),介绍了它们的数学基础、优势和应用。此外,本节介绍了深度学习中的训练和推理过程,重点介绍了用于高效和准确预测的技术,介绍了优化函数、激活函数和模型压缩技术在提高推理速度、减少计算需求和确保鲁
OpenCV计算机视觉实战(27)——深度学习与卷积神经网络
0. 前言
深度学习已经彻底改变了人工智能,在计算机视觉、自然语言处理和机器翻译等领域取得了显著进展。本节探讨了深度学习的多种架构方法,如卷积神经网络 (convolutional neural network, CNN),介绍了它们的数学基础、优势和应用。此外,本节介绍了深度学习中的训练和推理过程,重点介绍了用于高效和准确预测的技术,介绍了优化函数、激活函数和模型压缩技术在提高推理速度、减少计算需求和确保鲁棒性方面的重要性。
1. 深度学习简史
深度学习和感知器已有数十年历史:
- 感知器(
1950年代至1960年代):感知器的概念由Frank Rosenblatt在1950年代后期引入,模拟神经网络以模仿人类认知。感知器是一个单层神经网络,旨在执行二元分类任务。Rosenblatt开发了感知器学习算法,也被称为感知器规则,通过调整感知器的权重和偏置以从训练样本中学习 - 感知器缺陷(
1960年代):1969年,Marvin Minsky和Seymour Papert指出了单层感知器的局限性。他们证明了感知器无法学习某些逻辑函数,例如需要更复杂决策边界的XOR函数,从而引发了神经网络和感知器研究的寒冬 - 反向传播和多层感知器(
1970年代至1980年代):在1970年代,反向传播算法被提出,可以训练具有多个隐藏层的多层感知器 (multilayer perceptron,MLP)。MLP可以学习非线性决策边界,并克服了单层感知器的局限性,引发了对神经网络新的研究风潮 - 神经网络寒冬(
1990年代至21世纪初):尽管反向传播和MLP取得了进展,但在此期间,神经网络仍面临着挑战。深度网络的训练复杂性、有限的计算资源以及其他机器学习算法的出现(如支持向量机 (support vector machine,SVM)),导致了对神经网络的研究陷入停滞,这一时期被称为神经网络的寒冬 - 深度学习的复兴(
2000年代中期以后):深度学习在2000年代中期得到复兴,主要得益于大规模数据集的可用性、更强大的计算资源(例如GPU)以及优化算法的进步。研究人员开发了多种新颖架构,例如用于图像识别的卷积神经网络 (convolutional neural network,CNN)和用于序列数据处理的循环神经网络 (recurrent neural network,RNN),在计算机视觉、自然语言处理和语音识别等领域取得了突破性进展 - 深度学习爆发(
2010年代以后):2010年代深度学习研究和应用的爆炸式增长,架构设计快速进步(例如深度残差网络、生成对抗网络)、框架和库发展完善(例如TensorFlow、PyTorch),在包括医疗保健、金融、自动驾驶等各个领域应用广泛
感知器为更高级的神经网络架构奠定了基础,为深度学习技术的发展奠定了基础。
1.1 感知器
感知器 (perceptron) 是受生物神经元结构和功能启发的人工神经网络的基本构建块,是用于二元分类任务的简单数学模型,可以确定输入属于哪一个类别。感知器是一个数学函数,接受多个输入,对每个输入应用权重,将它们求和,然后通过激活函数传递求和结果产生输出。激活函数帮助感知器引入非线性,使其能够学习复杂的决策边界。
假设,一个感知器具有 n n n 个输入,每个输入都与一个权重相关联,用 w w w 表示,以及一个偏置项,用 b b b 表示,偏置项是一个额外的输入,使感知器能够独立于输入值调整决策边界。权重和偏置是感知器在训练过程中调整的可学习参数,给定输入向量 x = [ x 1 , x 2 , . . . , x n ] x = [x_1, x_2, ..., x_n] x=[x1,x2,...,xn],输入的加权和计算如下:
z = ∑ i = 1 n w i x i + b z = \sum_{i=1}^{n} w_ix_i + b z=i=1∑nwixi+b
激活函数通常是一个非线性函数(例如 step 函数或 Sigmoid 函数),将加权和 z z z 作为输入,产生感知器的输出,用 y y y 表示。在 step 函数情况下,输出是二元的:
y = { 1 if z ≥ 0 0 otherwise y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{otherwise} \end{cases} y={10if z≥0otherwise
在 Sigmoid 函数的情况下,输出是 0 到 1 之间的连续值:
y = 1 1 + e − z y = \frac{1}{1 + e^{-z}} y=1+e−z1
在训练过程中,感知器调整其权重和偏置以最小化其预测输出与真实输出之间的误差。这个过程通常使用梯度下降和反向传播算法来完成,其中误差通过网络反向传播以更新参数。
感知器是更复杂的神经网络架构的基础,例如 MLP 将多个感知器层堆叠在一起,以便学习更复杂任务的非线性决策边界。接下来,创建一个用于执行数据分类的感知器:
from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Generate a random binary classification dataset
X, y = make_classification(n_samples=100, n_features=20, n_informative=10, n_redundant=10)
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create a perceptron classifier
perceptron = Perceptron()
# Train the perceptron on the training data
perceptron.fit(X_train, y_train)
# Make predictions on the test data
y_pred = perceptron.predict(X_test)
# Calculate the accuracy of the perceptron
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
1.2 浅层学习网络
浅层学习(传统机器学习或浅层神经网络),指的是架构中只有少量或没有隐藏层的算法。这些算法通常涉及线性模型,例如逻辑回归、支持向量机或决策树。从数学角度来看,浅层学习算法旨在找到一个线性或非线性函数,将输入特征(表示为 x x x )映射到输出标签或预测(表示为y)。其目标是学习一组参数(权重和偏置),以最小化目标函数,例如平方误差和。
例如,在逻辑回归中,模型学习最小化逻辑损失函数的权重 w w w,损失函数定义为给定预测概率的情况下观察到的标签的负对数似然。通常使用梯度下降等技术实现优化,计算损失函数相对于参数的梯度,并用于迭代更新权重。
1.3 深度学习网络
深度学习是指利用具有多个隐藏层的深度神经网络来学习数据中的复杂表示和分层模式的算法。深度学习模型由相互连接的多层人工神经元组成,逐步转换输入数据以生成预测。
从数学上讲,深度学习涉及组合多个函数以形成复杂的计算图。神经网络的每一层对输入应用线性变换(矩阵乘法),并通过非线性激活函数(例如 sigmoid、ReLU )传递结果,引入非线性,使网络能够学习输入和输出之间的复杂非线性关系。
深度学习中的训练过程通常通过反向传播最小化损失函数,利用微积分的链式法则计算损失函数相对于模型参数的梯度,从而实现对每一层的权重和偏置的高效优化。常用的更新参数的技术包括随机梯度下降 (stochastic gradient descent, SGD) 及其变体。
深度学习的一个关键优势是其自动学习数据的分层表示,从而在不同抽象级别提取有意义的特征。这种分层表示使得深度学习模型在图像识别、自然语言处理和语音识别等任务中表现出色,因为这些任务的底层数据具有复杂的结构。
浅层学习算法依赖于较简单的模型,具有较少或没有隐藏层,而深度学习算法则利用具有多个隐藏层的深度神经网络。浅层学习的数学基础是使用线性或非线性模型优化较简单的目标函数,而深度学习组合多层非线性变换来学习复杂的表示。
2. 权重、偏置和激活函数
我们已经了解了权重、偏置和激活函数等术语,接下来,我们继续了解它们背后的数学原理。
2.1 权重
在神经网络中,权重(通常用 w w w 表示)是与神经元之间连接相关的参数。每个神经元之间的连接都有一个关联的权重,确定了一个神经元对另一个神经元输入的影响。从数学上讲,输入的加权和是通过将每个输入与其相应的权重相乘并将它们求和来计算的。
假设一个神经元有 n n n 个输入。输入表示为向量 x = [ x 1 , x 2 , . . . , x n ] x = [x_1,x_2,...,x_n] x=[x1,x2,...,xn],权重表示为向量 w = [ w 1 , w 2 , . . . , w n ] w = [w_1,w_2,...,w_n] w=[w1,w2,...,wn]。输入的加权和 z z z 计算过程如下:
z = w 1 x 1 + w 2 x 2 + . . . + w n x n z=w_1x_1 +w_2x_2+...+w_nx_n z=w1x1+w2x2+...+wnxn
神经网络中的权重是可学习的参数,在训练过程中进行调整。优化算法,如梯度下降,优化这些权重以最小化网络预测和真实值之间的误差。
2.2 偏置
偏置(通常用 b b b表示)是与神经网络中每个神经元相关联的附加参数。偏置提供了额外的自由度,并允许网络独立于输入值调整决策边界。从数学上讲,偏置在概念上类似于权重。
在具有偏置项的神经元中,输入的加权和z通过添加偏置项进行调整:
z = w 1 x 1 + w 2 x 2 + . . . + w n x n + b z=w_1x_1 +w_2x_2+...+w_nx_n+b z=w1x1+w2x2+...+wnxn+b
偏置允许神经网络学习偏移值并捕获不能仅通过输入特征表示的信息。与权重一样,偏置也是在训练过程中优化的可学习参数。
2.3 激活函数
激活函数在神经网络中引入了非线性,基于接收到的输入确定一个神经元是否应该被激活。激活函数帮助神经网络学习和表示数据中的复杂、非线性关系。有多种不同类型的激活函数,两种常用的激活函数包括:
step函数:step函数是一个简单的二元激活函数,根据一个阈值输出0或1,常用于感知器和早期神经网络,数学表达式如下:
y = { 1 if z ≥ 0 0 otherwise y = \begin{cases} 1 & \text{if } z \geq 0 \\ 0 & \text{otherwise} \end{cases} y={10if z≥0otherwiseSigmoid函数:输出是0到1之间的连续值:
y = 1 1 + e − z y = \frac{1}{1 + e^{-z}} y=1+e−z1
激活函数充当神经元的阈值机制,确定神经元是否应该基于输入的加权和被激活,令神经网络引入了非线性,使其能够学习和表示数据中的复杂关系。
权重确定神经网络中输入的影响,偏置提供了一个额外的自由度来调整决策边界,激活函数引入了非线性到神经元的输出中,使神经网络能够学习数据中的复杂模式和关系。
2.4 优化过程
损失函数也称目标函数,是一种数学度量,量化了机器学习模型在给定任务上的表现。损失函数的目的是通过提供模型性能的度量来引导学习过程,允许调整模型参数以最小化定义的目标。
选择选择函数取决于特定任务和问题的性质,例如,最小化预测值与真实值之间的误差(在回归任务中),最大化观察到真实标签的可能性(在分类任务中)或最小化各种损失的组合(在多目标优化中)。
在数学上,将损失函数表示为 J J J,模型的预测输出 y ^ ŷ y^ 和真实输出 y y y 作为输入,损失函数计算一个标量值,表示模型的性能,目标是找到使该函数最小化的模型参数组合。
优化过程通常使用迭代算法,例如梯度下降,更新模型参数,以减少损失函数值。损失函数相对于模型参数的梯度方向表示最快下降的方向,据此可以调整参数。但,损失函数也存在一些局限性:
- 局部最小值:优化过程可能很复杂,存在多个局部最小值,优化算法可能陷入局部最小值而无法找到全局最小值
- 梯度过小:在某些情况下,损失函数可能出现平坦区域,梯度变得非常小,显著减慢学习过程,因为参数更新变得十分缓慢
- 计算复杂性:根据损失函数的复杂性和数据集的大小,优化过程可能需要大量的计算资源和时间,具有数百万参数的深度学习模型需要大量的计算资源
- 超参数敏感性:超参数的选择,如学习率或正则化强度,可能会显著影响优化过程。选择适当的超参数通常需要大量实验和调整
- 过拟合:模型的目标是对未见过的数据进行良好的泛化。过度优化训练数据可能导致过拟合,即模型在新数据上表现不佳。
解决上述问题通常需要算法设计和正则化技术,以避免陷入不良或过拟合训练数据。研究人员不断开发新的优化算法和技术,以提高训练深度学习模型的效率和有效性。
接下来,实现一个多层感知器用于数据分类:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# Load the tips dataset from seaborn
tips_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv')
# Preprocess the data
X = tips_df[['total_bill', 'size']]
y = tips_df['tip']
# Standardize the input features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# Create an MLP regressor
mlp = MLPRegressor(hidden_layer_sizes=(10,), activation='relu', solver='adam', random_state=42)
# Train the MLP on the training data
mlp.fit(X_train, y_train)
# Make predictions on the test data
y_pred = mlp.predict(X_test)
# Calculate the root mean squared error (RMSE) of the MLP
rmse = mean_squared_error(y_test, y_pred, squared=False)
print("RMSE:", rmse)
在 tips 数据集上执行回归任务:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# Load the tips dataset from seaborn
tips_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv')
# Preprocess the data
X = tips_df[['total_bill', 'size']]
y = tips_df['tip']
# Standardize the input features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# Create an MLP regressor
mlp = MLPRegressor(hidden_layer_sizes=(10,), activation='relu', solver='adam', random_state=42)
# Train the MLP on the training data
mlp.fit(X_train, y_train)
# Make predictions on the test data
y_pred = mlp.predict(X_test)
# Calculate the root mean squared error (RMSE) of the MLP
rmse = mean_squared_error(y_test, y_pred, squared=False)
print("RMSE:", rmse)
3. 卷积神经网络
卷积神经网络 (Convolutional Neural Network, CNN) 是用于分析视觉数据的深度神经网络,能够有效捕获和处理数据中的空间关系,主要通过卷积层实现。
3.1 卷积层
卷积神经网络的基本构建块是卷积层,在输入数据上应用一组可学习的滤波器,也称卷积核,每个滤波器都是一个小的权重矩阵。
假设输入表示为 X X X,一个大小为 f × f f × f f×f 的滤波器与输入图中对应的局部感受野进行卷积(元素逐个相乘并求和),输出是一个特征图(也称激活图) Y Y Y,它表示输入中某些模式或特征的存在。卷积操作可以表示为:
Y ( i , j ) = f ( X ∗ W ( i , j ) + b ( i , j ) ) Y(i, j) = f(X * W(i, j) + b(i, j)) Y(i,j)=f(X∗W(i,j)+b(i,j))
其中, Y ( i , j ) Y(i, j) Y(i,j) 表示输出特征图中位置 ( i , j ) (i, j) (i,j) 的元素。 X X X 是输入特征图, W ( i , j ) W(i, j) W(i,j) 是位于 ( i , j ) (i, j) (i,j) 处的滤波器权重, b ( i , j ) b(i, j) b(i,j) 是与滤波器相关联的偏置项。
激活函数:在卷积操作后,通常会对输出特征图逐个元素应用激活函数,以引入非线性。CNN 中常用的激活函数包括 ReLU 及其变体:
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
激活函数帮助 CNN 模型捕捉非线性关系,并通过将负值置零来引入稀疏性。
池化层:在 CNN 中,池化层通常用于降低特征图的空间维度,从而减少计算复杂性并提取更高级的特征。最大池化是一种常用的池化操作,选择局部邻域内的最大值:
Y ( i , j ) = max ( X ( i × s : ( i + 1 ) × s , j × s : ( j + 1 ) × s ) ) Y(i, j) = \max(X(i \times s : (i+1) \times s, j \times s : (j+1) \times s)) Y(i,j)=max(X(i×s:(i+1)×s,j×s:(j+1)×s))
其中, Y ( i , j ) Y(i, j) Y(i,j) 表示下采样后的特征图中位置 ( i , j ) (i, j) (i,j) 的元素,而 X ( i × s : ( i + 1 ) × s , j × s : ( j + 1 ) × s ) X(i \times s : (i+1) \times s, j \times s : (j+1) \times s) X(i×s:(i+1)×s,j×s:(j+1)×s) 则是输入特征图中大小为 s × s s × s s×s 的局部邻域。
全连接层:在经过卷积和池化层之后,特征图通常会被展平成一个向量,并传递到一个或多个全连接层。全连接层将每一层的神经元连接到下一层的每一个神经元,允许模型学习特征的复杂组合。
通过多个卷积层、池化层和全连接层的组合,CNN 能够学习输入数据的层次化表示,捕获浅层的低级特征和深层的高级抽象。CNN 的训练使用反向传播和梯度下降优化技术,以调整整个网络中的权重和偏置。
3.2 全连接网络 vs 卷积神经网络
CNN 使用卷积层对输入数据执行局部感受野操作,然后应用激活函数和池化层,以提取特征并对空间维度进行下采样,全连接层用于学习高级表示。CNN 在分析视觉数据方面表现出色,能够有效地捕获数据内的空间关系。
CNN与全连接网络之间的主要区别在于它们的架构设计和对数据执行的操作:
| CNN | 全连接网络 | |
|---|---|---|
| 卷积层 | 卷积层将可学习的滤波器应用于输入数据的小局部区域,通过执行卷积(元素逐个相乘和求和)捕获空间模式。卷积层的输出是一个特征图,表示输入中特定模式的存在 | 没有专门的层用于空间操作,层中的每个神经元都连接到下一层中的每个神经元,而不考虑输入的空间结构 |
| 权重共享 | 这是 CNN 的一个显着特点。在卷积层中,同一组滤波器应用于整个输入,而不考虑位置。这种权重共享允许网络有效地学习特征的空间层次结构,并显著减少模型中的参数数量 |
不存在权重共享。在一个层中,每个神经元都有自己独特的一组权重,将其连接到下一层中的每个神经元。缺乏权重共享导致参数数量比 CNN 更高,使全连接网络在处理高维输入(如图像)时更加计算密集且容易过拟合 |
| 池化层 | 在 CNN 中普遍使用,用于降低特征图的空间维度,并提取更高级别的特征。最大池化是一种广泛使用的池化操作,选择局部邻域中的最大值 |
全连接网络不包括池化层。它们通常在全分辨率特征图上操作,而不进行下采样 |
接下来,用 Python 实现基于卷积神经网络的深度学习模型:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# Load the digits dataset from scikit-learn
digits = load_digits()
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42)
# Preprocessing - Scale the input features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Create a pipeline for feature extraction and classification
pipeline = Pipeline([
('classifier', SVC()) # You can replace SVC with any other scikit-learn classifier
])
# Train the model on the training data
pipeline.fit(X_train_scaled, y_train)
# Make predictions on the test data
y_pred = pipeline.predict(X_test_scaled)
# Calculate the accuracy of the model
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
使用 scikit-learn 中的 load_digits 函数加载手写数字数据集,该数据集包含手写数字的图像。使用 train_test_split 将数据集分割为训练集和测试集,分配 20% 的数据用于测试。
接下来,使用 StandardScaler 对输入特征进行缩放预处理数据,使用 pipeline 创建一个管道,将多个步骤链接在一起,使用管道的fit方法在训练数据上训练模型。训练完成后,使用管道的 predict 方法对测试数据进行预测,并将预测结果存储在 y_pred 中。
最后,使用 scikit-learn 的 accuracy_score 函数将预测标签 (y_pred) 与真实标签 (y_test) 进行比较,计算模型的准确率。这种使用 scikit-learn 的方法是基于简单特征的方法,而不是真正的基于 CNN 的方法。对于更复杂的图像分类任务,建议使用专门的深度学习库,如 TensorFlow 或 PyTorch,这些库提供了专门用于卷积神经网络的工具和架构。
4 深度学习流程
训练和推理是深度学习中的两个基本过程。虽然它们有某些相似之处,但也有着不同的特点。接下来,我们详细探讨每个过程,以及它们的相似之处、不同之处和常用的技巧。
4.1 训练过程
训练过程使用带标签的数据训练深度学习模型,以学习数据内部的模式和关系,通常包括以下步骤:
- 前向传播:在前向传播期间,将输入数据通过模型,生成输出或预测,模型的参数用于转换输入数据并生成输出
- 损失计算:损失函数用于量化模型预测与真实标签之间的差异,是衡量模型在训练数据上表现的好坏的一种指标,目标是在训练过程中最小化损失函数值
- 反向传播:反向传播使用微积分的链式法则计算损失相对于模型参数的梯度,梯度沿模型向后传播,梯度指示了为最小化损失所需的参数更新的方向和大小
- 参数更新:使用优化算法(如梯度下降或其变体)更新模型的参数,更新是通过将梯度与学习率相乘来确定的,学习率控制了在参数空间中所采取的步长大小
- 迭代:重复多次迭代以上过程,以调整模型的参数并提高其性能,模型多次迭代训练数据,逐渐学习数据内部表示。
4.2 训练技巧
在训练深度学习模型时,我们希望提高模型的性能,并增强其泛化能力。训练技巧旨在克服过拟合、梯度消失/爆炸、收敛速度慢和优化不足等问题,通过应用这些技巧,深度学习模型可以实现更好的性能、更快的收敛、更强的泛化能力和更高的效率。对于解决训练深度学习模型中的常见挑战,并确保它们在实际应用中的有效性至关重要:
- 激活函数:选择合适的激活函数可以影响模型学习复杂关系的能力
- 正则化:诸如
L1或L2正则化的技术通过向损失函数添加惩罚项来防止过拟合 Dropout:在训练过程中随机丢弃神经元有助于正则化模型,防止模型的过拟合- 批归一化:在每个小批数据中对输入数据进行归一化有助于稳定和加速训练
- 动态学习率:在训练过程中调整学习率可以找到模型收敛和避免过度调整之间的平衡
4.3 推理过程
推理过程在经过训练的模型上对未见或测试数据进行预测或生成输出,通常包括以下步骤:
- 前向传播:类似于训练过程,将输入数据通过模型,并生成预测或输出
- 输出生成:基于前向传播生成模型的预测或输出,具体的输出取决于任务,例如分类的类别概率或回归的连续值
4.2 推理技巧
深度学习模型的推理技巧用于优化其性能,提高效率,并解决在部署或使用模型过程中出现的特定问题。这些技巧提高了模型的预测准确性,减少计算需求,提高速度,并确保模型稳健性:
Dropout:在推理过程中,通常会关闭或修改dropout保留所有神经元,以获得更稳定的预测- 集成方法:结合多个模型的预测,如使用模型平均,可以提高性能
- 量化:减少模型参数的精度可以减少内存需求并增加推理速度
- 剪枝:移除模型中不必要的连接或参数,以减小模型大小并提高推理效率
- 知识蒸馏:从更大、更复杂的模型(教师)向较小的模型(学生)传递知识,以提高其性能。
深度学习中的训练和推理涉及前向传播和输出生成等相似步骤,但在反向传播、损失计算和参数更新方面有所不同。在每个过程中可以采用不同技术和窍门来提高性能、优化模型参数,并有效管理计算资源。
小结
本节探讨了深度学习的架构方法和基本技术,涵盖了卷积神经网络 (convolutional neural network, CNN) 的架构方法,讨论了用于模型优化的训练技术和用于高效预测的推理策略。
系列链接
OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法
OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(8)——图像滤波详解
OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(11)——边缘检测详解
OpenCV计算机视觉实战(12)——图像金字塔与特征缩放
OpenCV计算机视觉实战(13)——轮廓检测详解
OpenCV计算机视觉实战(14)——直方图均衡化
OpenCV计算机视觉实战(15)——霍夫变换详解
OpenCV计算机视觉实战(16)——图像分割技术
OpenCV计算机视觉实战(17)——特征点检测详解
OpenCV计算机视觉实战(18)——视频处理详解
OpenCV计算机视觉实战(19)——特征描述符详解
OpenCV计算机视觉实战(20)——光流法运动分析
OpenCV计算机视觉实战(21)——模板匹配详解
OpenCV计算机视觉实战(22)——图像拼接详解
OpenCV计算机视觉实战(23)——目标检测详解
OpenCV计算机视觉实战(24)——目标追踪算法
OpenCV计算机视觉实战(25)——立体视觉详解
OpenCV计算机视觉实战(26)——OpenCV与机器学习
更多推荐

所有评论(0)