卷积神经网络理论基础总结

部署运行你感兴趣的模型镜像

卷积神经网络理论基础总结

下面是一个关于卷积神经网络(Convolutional Neural Networks, CNNs)的基础理论教程。CNN 是一种专门用于处理具有类似网格结构的数据的神经网络,最常见的是应用于图像识别和计算机视觉任务。

什么是卷积神经网络?

卷积神经网络是一种前馈神经网络,它包含一个或多个卷积层以及通常在顶部的全连接层(类似于传统的多层感知机)。CNN 的主要优点在于它们能够自动且适应性地学习空间层次结构的特征抽取器。

卷积神经网络的关键组件

  1. 卷积层 (Convolutional Layer)

    • 卷积核/滤波器 (Kernel/Filter): 这是一个小矩阵,通过与输入数据(如图像)进行卷积操作来提取特征。
    • 卷积操作 (Convolution Operation): 卷积核沿着输入数据滑动,并计算每个位置上的点积。这可以捕捉到局部特征。
    • 步长 (Stride): 滑动时每次移动的像素数。
    • 填充 (Padding): 在输入数据边缘添加额外的零值以保持输出尺寸不变或控制输出尺寸。
  2. 激活函数 (Activation Function)

    • 常见的激活函数有 ReLU (Rectified Linear Unit),它可以引入非线性因素,使得模型能够学习更复杂的模式。
  3. 池化层 (Pooling Layer)

    • 通常使用最大池化 (Max Pooling) 或平均池化 (Average Pooling) 来减少数据的空间维度,同时保留重要的信息。
    • 池化有助于降低计算复杂度并提高模型对输入变换的鲁棒性。
  4. 全连接层 (Fully Connected Layer)

    • 位于网络的最后几层,负责将学到的“分布式特征表示”映射到样本标记空间。
  5. 损失函数 (Loss Function)

    • 用来衡量模型预测结果与实际标签之间的差距,常见的有交叉熵损失 (Cross-Entropy Loss) 和均方误差 (Mean Squared Error)。
  6. 优化算法 (Optimization Algorithm)

    • 用于更新网络权重以最小化损失函数。常用的有梯度下降法 (Gradient Descent)、随机梯度下降 (Stochastic Gradient Descent, SGD)、Adam 等。

工作原理

1. 输入层:接收原始图像数据作为输入。

卷积神经网络(CNN)的输入层是整个网络的第一层,它接收原始数据并将其传递给后续的隐藏层。对于图像处理任务来说,输入层通常会直接接受图像数据作为输入。下面将详细介绍 CNN 输入层的工作原理。

输入层的数据表示

在 CNN 中,当处理二维图像时,输入层的数据通常是一个三维数组。这个三维数组由三个维度组成:高度(Height)、宽度(Width)和通道数(Channels)。例如,一个彩色图像可以表示为 (H, W, C),其中 H 和 W 分别代表图像的高度和宽度,而 C 通常是 3,对应于红、绿、蓝三个颜色通道(RGB 图像)。对于灰度图像,则只有一个通道,即 (H, W, 1)。

批量处理

实际应用中,为了提高计算效率,我们通常不是一次只处理一张图片,而是以批次(Batch)的形式处理多张图片。因此,输入层的数据结构通常是四维的,形式为 (N, H, W, C),其中 N 是批大小(Batch Size),也就是一批次中包含的图像数量。

数据预处理

在将图像送入 CNN 之前,通常需要进行一些预处理步骤:

  • 归一化:将像素值从 [0, 255] 范围缩放到 [0, 1] 或 [-1, 1],这有助于加快训练过程。
  • 标准化:减去均值并除以标准差,使得数据分布更接近标准正态分布。
  • 数据增强:通过旋转、翻转、裁剪等操作增加训练集的多样性,从而提高模型的泛化能力。
输入层的作用

输入层的主要作用是将原始数据格式转换成适合神经网络处理的形式,并且可能包括一些简单的预处理步骤。然而,在现代深度学习框架中,如 TensorFlow 和 PyTorch,输入层的概念相对抽象,它实际上就是数据进入模型的地方,而不一定是一个明确定义的层。

示例

假设你正在使用一个 RGB 图像,其尺寸为 64x64 像素,那么输入层的数据格式将是 (N, 64, 64, 3)。如果你选择批量大小为 32,那么每次前向传播时输入层就会接收一个形状为 (32, 64, 64, 3) 的张量。

# 使用 TensorFlow/Keras 定义模型
import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential()
# 添加输入层,这里指定输入形状
model.add(layers.Input(shape=(64, 64, 3)))

# 然后添加卷积层等其他层
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# ... 其他层 ...

# 打印模型概要
model.summary()

在这个例子中,layers.Input(shape=(64, 64, 3)) 指定了输入层的数据形状。尽管在 Keras 中 Input 层看起来像是一个单独的层,但它实际上是用于定义模型输入的占位符,真正的第一层通常是第一个卷积层或其他类型的层。

输入层功能

输入层在 CNN 中扮演着重要角色,它是数据进入网络的第一个接触点。通过适当的预处理和正确的数据格式,可以确保数据能够有效地被后续的卷积层和其他层处理,从而帮助模型更好地学习和提取有用的特征。

2. 卷积层:应用一组卷积核对输入数据进行卷积运算,生成一系列特征图。

卷积神经网络(CNN)中的卷积层是其核心组成部分,用于自动从输入数据中提取特征。卷积层通过使用一系列可学习的滤波器(也称为卷积核或权重矩阵)来扫描输入图像或特征图,并生成新的特征图。下面详细解释卷积层的工作原理:

卷积操作

卷积操作是指将一个较小的滤波器在输入数据上滑动,并计算每个位置上的点积。这个过程可以捕捉到局部的模式和结构。具体来说,假设我们有一个大小为 (H \times W) 的输入图像和一个大小为 (k \times k) 的滤波器(其中 (k < H, k < W)),那么卷积操作可以按以下步骤进行:

  1. 初始化:选择一个初始位置,通常是从图像的左上角开始。
  2. 点积计算:将滤波器覆盖在当前的位置上,计算滤波器与该区域内的像素值之间的点积。
  3. 移动滤波器:根据设定的步长(Stride),将滤波器向右或向下移动一定的距离。
  4. 重复:重复步骤 2 和 3,直到滤波器遍历整个输入图像。
滤波器/卷积核
  • 滤波器尺寸:滤波器通常是正方形的,常见的尺寸有 (3 \times 3), (5 \times 5), (7 \times 7) 等。
  • 滤波器数量:在一个卷积层中,可以同时使用多个滤波器,每个滤波器会生成一个新的特征图。
  • 参数共享:同一个滤波器在整个输入图像上共享相同的权重,这意味着无论滤波器位于图像的哪个位置,它都使用相同的参数。这减少了模型的参数数量,并提高了泛化能力。
步长(Stride)

步长决定了滤波器每次移动的距离。步长为 1 时,滤波器逐像素移动;步长大于 1 时,滤波器跳过一些像素移动。较大的步长可以减少输出特征图的尺寸,从而降低计算成本,但可能会丢失一些细节信息。

填充(Padding)

填充是在输入图像的边缘添加额外的零值(或其他值)。这样做的目的是为了控制输出特征图的尺寸。主要有两种类型的填充:

  • Valid Padding:不使用填充,即原始图像边缘没有添加额外的零值。
  • Same Padding:添加足够的零值,使得输出特征图的尺寸与输入图像相同。通常,对于 (k \times k) 的滤波器,需要在每一边填充 (\frac{k-1}{2}) 个零值。
输出特征图

经过卷积操作后,每个滤波器都会生成一个新的二维数组,称为特征图。如果使用了 (N) 个滤波器,那么就会得到 (N) 个特征图。这些特征图捕获了输入图像的不同方面或特征。

示例

考虑一个简单的例子,输入是一个 (5 \times 5) 的灰度图像,使用一个 (3 \times 3) 的滤波器,步长为 1,且没有填充(Valid Padding)。

Input Image (5x5):
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Filter (3x3):
-1 0 1
-2 0 2
-1 0 1

卷积操作如下:

  1. 将滤波器放在左上角:

    1* -1 + 2* 0 + 3* 1 + 6* -2 + 7* 0 + 8* 2 + 11* -1 + 12* 0 + 13* 1 = 0
    
  2. 移动滤波器到下一个位置,继续计算…

最终,你会得到一个 (3 \times 3) 的输出特征图。

激活函数

在实际应用中,卷积操作后的结果通常会通过激活函数(如 ReLU)进行非线性变换,以引入非线性因素,使模型能够学习更复杂的特征表示。

卷积层功能

卷积层通过使用滤波器对输入数据进行卷积操作,可以有效地提取出输入数据中的局部特征。这种局部连接和参数共享的机制使得 CNN 在处理图像等具有空间层次结构的数据时非常有效。通过调整滤波器的数量、尺寸、步长和填充,可以灵活地设计适合特定任务的卷积层。

3. 激活层:对特征图应用激活函数,增加非线性。

卷积神经网络(CNN)中的激活层用于引入非线性,这样整个网络可以学习和表示更加复杂的模式。在没有激活函数的情况下,即使是一个深层的神经网络,它的表现也会类似于一个简单的线性模型。激活函数通过将非线性的变换应用到每个神经元的输出上,使得神经网络能够逼近任何非线性函数。

激活函数的作用
  • 引入非线性:让神经网络能够学习和表达输入与输出之间复杂的映射关系。
  • 增强模型表达能力:帮助模型捕捉数据中的复杂结构。
  • 提高模型的学习效率:某些激活函数有助于加速训练过程,并且能够改善梯度消失或爆炸的问题。
常见的激活函数
Sigmoid 函数

Sigmoid 函数将实数映射到 (0,1) 之间,它曾广泛应用于早期的神经网络中。但由于其容易导致梯度消失以及计算代价较高等问题,在现代深度学习中已较少使用。

σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}}σ(x)=1+ex1

Tanh 函数

Tanh 函数是 Sigmoid 函数的一种变体,它将实数映射到 (-1,1) 之间。同样存在梯度消失的问题。

tanh⁡(x)=ex−e−xex+e−x\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}tanh(x)=ex+exexex

ReLU (Rectified Linear Unit)

ReLU 是目前最流行的激活函数之一,因为它简单有效,计算速度快。ReLU 将所有负值置为零,正值保持不变。

f(x)=max⁡(0,x)f(x) = \max(0, x)f(x)=max(0,x)

ReLU 的优点包括:

  • 计算简单高效。
  • 在正区间内导数恒为 1,有助于缓解梯度消失问题。

但是,ReLU 也有缺点,比如当输入为负时,神经元可能“死亡”,即不再对任何数据有响应。

Leaky ReLU

Leaky ReLU 是 ReLU 的改进版,它允许一个小的斜率 ( \alpha ) 给所有的负值,从而解决了死神经元的问题。

f(x)={xif x>0αxif x≤0f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}f(x)={xαxif x>0if x0

其中 ( \alpha ) 是一个小常数,例如 0.01。

ELU (Exponential Linear Units)

ELU 具有类似 Leaky ReLU 的特性,但在负值区域使用了指数形式,这有助于使平均激活更接近于零,进而加快学习速度。

KaTeX parse error: Undefined control sequence: \endcases at position 85: …{if } x \leq 0 \̲e̲n̲d̲c̲a̲s̲e̲s̲

其中 ( \alpha ) 通常设置为 1。

Softmax

Softmax 函数通常用在多分类任务的最后一层,它将一组数值转换成概率分布。Softmax 确保了输出的概率之和为 1。

softmax(z)i=ezi∑j=1Kezj\text{softmax}(z)_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}softmax(z)i=j=1Kezjezi

其中 ( z ) 是向量,( K ) 是类别的数量。

激活层功能

激活层通常是紧接在卷积层之后。卷积层输出的特征图经过激活函数处理后,会得到一个新的特征图,这个新的特征图具有更强的表达能力,因为它们包含了非线性的信息。在前向传播过程中,每个像素位置的值都会被激活函数转换;而在反向传播过程中,激活函数的导数会被用来更新卷积核的权重。

通过选择合适的激活函数,可以优化神经网络的性能,使其更好地拟合训练数据并泛化到未见过的数据上。

4. 池化层:对特征图进行下采样,减少参数数量并防止过拟合。

池化层(Pooling Layer)是卷积神经网络(CNN)中的一个重要组成部分,它主要用于降低特征图的空间维度(即高度和宽度),从而减少参数数量和计算量。此外,池化层还能够引入一定程度的平移不变性,使得模型对输入的小幅位移更加鲁棒。下面是池化层的工作原理详解:

池化层的作用
  1. 降维:通过减少特征图的空间尺寸来减小模型的复杂度。
  2. 保持不变性:使模型对于输入图像的小范围平移不敏感,增强模型的鲁棒性。
  3. 防止过拟合:减少了模型需要学习的参数数量,有助于防止过拟合。
常见的池化类型
最大池化(Max Pooling)

最大池化是在每个局部区域中选择最大的值作为输出。这种操作可以保留最显著的特征,同时丢弃一些细节信息。

例如,一个 (2 \times 2) 的最大池化操作如下:

Input: 
1  2
3  4

Output: 
4

在这个例子中,输入是一个 (2 \times 2) 的区域,输出是该区域的最大值 4。

平均池化(Average Pooling)

平均池化是在每个局部区域中计算所有元素的平均值作为输出。这种操作可以平滑特征图,但可能会丢失一些重要的特征信息。

例如,一个 (2 \times 2) 的平均池化操作如下:

Input: 
1  2
3  4

Output: 
(1+2+3+4) / 4 = 2.5

在这个例子中,输入是一个 (2 \times 2) 的区域,输出是该区域的平均值 2.5。

池化层的参数
  • 池化窗口大小(Kernel Size):定义了池化操作覆盖的局部区域的大小。常见的大小有 (2 \times 2), (3 \times 3) 等。
  • 步长(Stride):定义了池化窗口每次移动的距离。通常步长等于池化窗口的大小,这样可以确保没有重叠。
  • 填充(Padding):在输入特征图的边缘添加额外的零值以保持输出尺寸不变或控制输出尺寸。不过,在池化层中通常不使用填充。
池化层的计算过程

假设我们有一个 (4 \times 4) 的输入特征图,并且使用 (2 \times 2) 的最大池化窗口,步长为 2。

Input Feature Map (4x4):
1  2  3  4
5  6  7  8
9 10 11 12
13 14 15 16

进行 (2 \times 2) 的最大池化操作后,结果如下:

Output Feature Map (2x2):
6  8
14 16

具体步骤如下:

  1. 将 (2 \times 2) 的池化窗口放在左上角:

    1  2
    5  6
    

    取最大值 6。

  2. 将池化窗口向右移动一个步长(2个像素):

    3  4
    7  8
    

    取最大值 8。

  3. 将池化窗口向下移动一个步长(2个像素):

    9 10
    13 14
    

    取最大值 14。

  4. 将池化窗口再向右移动一个步长(2个像素):

    11 12
    15 16
    

    取最大值 16。

最终得到一个 (2 \times 2) 的输出特征图。

池化层功能

池化层通过在局部区域内应用特定的操作(如最大池化或平均池化),有效地降低了特征图的空间维度。这不仅减少了后续层的计算负担,还增强了模型对输入图像平移的鲁棒性。池化层的选择和配置可以根据具体任务的需求进行调整,以达到最佳的效果。

5. 重复步骤2-4:根据需要构建多层卷积和池化组合。
6. 全连接层:将前面层的输出展平成一维向量,然后通过全连接层进行分类或回归。

卷积神经网络(CNN)中的全连接层(Fully Connected Layer,也称为密集层 Dense Layer)通常位于网络的最后几层,用于将学到的特征映射到最终的输出。全连接层的工作原理与传统的多层感知机(MLP)非常相似,每个输入节点都与前一层的所有节点完全连接。

全连接层的作用
  1. 分类:在图像分类任务中,全连接层通常位于整个网络的末端,负责将卷积层和池化层提取的高级特征转换为具体的类别概率。
  2. 回归:在回归任务中,全连接层可以用来预测连续值,例如物体检测中的边界框坐标。
  3. 特征整合:全连接层能够将从不同卷积层提取的局部特征整合成全局特征表示。
工作原理
输入
  • 在全连接层之前,通常会有一个或多个卷积层和池化层。这些层提取了图像的不同层次的特征,并形成了一个或多个特征图。
  • 为了将这些特征图输入到全连接层,需要先将它们展平(Flatten)。即将所有特征图的像素值按顺序排列成一个一维向量。
权重和偏置
  • 每个输入节点都会与全连接层中的每个节点通过一个权重 ( w ) 连接。假设输入向量有 ( n ) 个元素,全连接层有 ( m ) 个节点,则会有 ( n \times m ) 个权重。
  • 每个全连接层的节点还有一个偏置项 ( b ),它是一个常数,用于调整激活函数的阈值。
线性组合
  • 对于全连接层中的每一个节点,其输出是所有输入节点与其对应的权重相乘后的总和,再加上偏置项:
    zj=∑i=1nwijxi+bjz_j = \sum_{i=1}^{n} w_{ij} x_i + b_jzj=i=1nwijxi+bj
    其中,( z_j ) 是第 ( j ) 个节点的线性组合结果,( w_{ij} ) 是从第 ( i ) 个输入节点到第 ( j ) 个全连接层节点的权重,( x_i ) 是第 ( i ) 个输入节点的值,( b_j ) 是第 ( j ) 个节点的偏置项。
激活函数
  • 线性组合的结果 ( z_j ) 通常会通过一个激活函数来引入非线性。常用的激活函数包括 ReLU、Sigmoid 和 Tanh 等。
    aj=f(zj)a_j = f(z_j)aj=f(zj)
    其中,( f ) 是激活函数,( a_j ) 是第 ( j ) 个节点的激活值。
输出
  • 经过激活函数处理后,全连接层的输出可以作为下一个全连接层的输入,或者如果是最后一层,则直接作为模型的最终输出。对于分类任务,最后一层通常是 Softmax 层,用于输出每个类别的概率分布。
示例

假设我们有一个 CNN 模型,经过一系列卷积层和池化层后,得到一个 (4 \times 4 \times 64) 的特征图。我们将这个特征图展平成一个一维向量,大小为 (4 \times 4 \times 64 = 1024)。

接下来,我们添加一个全连接层,该层有 128 个节点。那么这个全连接层将有 (1024 \times 128) 个权重和 128 个偏置项。

import tensorflow as tf
from tensorflow.keras import layers, models

# 假设前面的卷积层和池化层已经定义好了
model = models.Sequential()
model.add(layers.Flatten(input_shape=(4, 4, 64)))  # 将 (4, 4, 64) 的特征图展平
model.add(layers.Dense(128, activation='relu'))     # 添加一个 128 节点的全连接层
model.add(layers.Dense(num_classes, activation='softmax'))  # 最终的分类层

# 打印模型概要
model.summary()

在这个例子中,layers.Flatten 层将三维特征图展平成一维向量,然后 layers.Dense 层定义了一个全连接层。如果这是一个分类任务,最后一层使用 Softmax 激活函数来输出各个类别的概率。

全连接层功能

全连接层通过将前一层的输出节点与当前层的所有节点完全连接,实现了从局部特征到全局特征的转换。它是 CNN 中进行最终分类或回归的关键部分。通过适当配置全连接层的节点数量和激活函数,可以有效地将卷积层提取的特征转化为有用的输出。

7. 输出层:产生最终的预测结果,如类别概率分布。

卷积神经网络(CNN)中的输出层通常是全连接层,它负责将前面所有层提取的特征转换成最终的任务输出。输出层的具体结构和激活函数取决于任务的类型,例如分类、回归或分割等。下面是不同类型任务中输出层的工作原理:

分类任务
二分类
  • 输出层:通常是一个单一节点的全连接层。
  • 激活函数:Sigmoid 函数,将输出压缩到 (0, 1) 之间,表示样本属于正类的概率。
  • 损失函数:二元交叉熵(Binary Cross-Entropy)。
import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential()
# 假设前面的层已经定义好了
model.add(layers.Dense(1, activation='sigmoid'))  # 输出层
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
多分类
  • 输出层:一个具有与类别数量相等的节点数的全连接层。
  • 激活函数:Softmax 函数,将输出转换为概率分布,每个节点的值表示样本属于对应类别的概率。
  • 损失函数:多类交叉熵(Categorical Cross-Entropy)。
import tensorflow as tf
from tensorflow.keras import layers, models

num_classes = 10  # 假设有 10 个类别
model = models.Sequential()
# 假设前面的层已经定义好了
model.add(layers.Dense(num_classes, activation='softmax'))  # 输出层
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
回归任务
  • 输出层:一个或多个节点的全连接层,具体取决于需要预测的连续值的数量。
  • 激活函数:线性激活函数(即没有激活函数),直接输出实数值。
  • 损失函数:均方误差(Mean Squared Error, MSE)或其他适合的回归损失函数。
import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential()
# 假设前面的层已经定义好了
model.add(layers.Dense(1))  # 输出层,单个节点
model.compile(optimizer='adam', loss='mean_squared_error')
对象检测任务

在对象检测任务中,输出层可能包括多个部分:

  • 边界框坐标:用于表示检测到的对象的位置。
  • 类别概率:表示检测到的对象属于各个类别的概率。
  • 置信度分数:表示检测到的对象的置信度。

以 YOLO 为例,输出层可能包含多个节点,每个节点代表一个网格单元格中某个锚点的边界框信息和类别概率。

import tensorflow as tf
from tensorflow.keras import layers, models

grid_size = 7  # 假设网格大小为 7x7
num_anchors = 2  # 每个网格单元格有两个锚点
num_classes = 20  # 假设有 20 个类别

# 每个锚点有 5 个参数 (tx, ty, tw, th, to) 和 num_classes 个类别概率
output_dim = grid_size * grid_size * (num_anchors * (5 + num_classes))

model = models.Sequential()
# 假设前面的层已经定义好了
model.add(layers.Dense(output_dim))  # 输出层
model.compile(optimizer='adam', loss='mse')  # 使用均方误差作为损失函数
语义分割任务

在语义分割任务中,输出层通常是一个像素级别的分类器,其输出维度与输入图像的尺寸相同,每个像素对应一个类别。

import tensorflow as tf
from tensorflow.keras import layers, models

input_shape = (256, 256, 3)  # 输入图像尺寸
num_classes = 21  # 假设有 21 个类别

model = models.Sequential()
# 假设前面的层已经定义好了
model.add(layers.Conv2D(num_classes, (1, 1), activation='softmax'))  # 输出层
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
输出层功能

输出层的工作原理依赖于具体的任务类型。对于分类任务,输出层使用 Sigmoid 或 Softmax 激活函数,并且损失函数通常是交叉熵。对于回归任务,输出层通常是线性的,并且损失函数是均方误差。在对象检测和语义分割等复杂任务中,输出层的设计会更加复杂,需要同时考虑多个输出维度。

通过合理设计输出层及其相关组件,可以确保 CNN 能够有效地解决各种不同类型的机器学习任务。

训练过程

  • 前向传播:从输入层开始,经过各个层直到输出层,得到预测结果。
  • 反向传播:基于损失函数计算误差,然后从输出层向输入层逐层计算梯度,并更新权重。
  • 迭代训练:重复前向传播和反向传播的过程,直至满足停止条件(如达到预定的迭代次数或损失不再显著下降)。

应用示例

  • 图像分类:识别图片中的物体属于哪个类别。
  • 目标检测:不仅识别图片中的物体,还能确定它们的位置。
  • 语义分割:为图像中的每一个像素分配一个类别标签。
  • 风格迁移:将一张图片的内容样式转换成另一张图片的风格。

这个基础教程提供了卷积神经网络的核心概念。要深入理解并实际运用 CNN,建议动手实践一些项目,比如使用 TensorFlow 或 PyTorch 实现简单的图像分类任务。此外,阅读相关文献和教程也是加深理解和技能的重要途径。

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanxbl957

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值