Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
a3058fcb
A
apachecn-dl-zh
项目概览
D_ACMER
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a3058fcb
编写于
1月 03, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-01-03 22:53:28
上级
73bc35af
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
37 addition
and
40 deletion
+37
-40
new/adv-dl-tf2-keras/10.md
new/adv-dl-tf2-keras/10.md
+13
-14
new/adv-dl-tf2-keras/11.md
new/adv-dl-tf2-keras/11.md
+12
-13
new/adv-dl-tf2-keras/12.md
new/adv-dl-tf2-keras/12.md
+3
-3
new/adv-dl-tf2-keras/13.md
new/adv-dl-tf2-keras/13.md
+8
-9
new/master-cv-tf-2x/9.md
new/master-cv-tf-2x/9.md
+1
-1
未找到文件。
new/adv-dl-tf2-keras/10.md
浏览文件 @
a3058fcb
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
总之,本章的目的是介绍:
总之,本章的目的是介绍:
*
策略梯度定理
*
策略梯度定理
*
四种策略梯度方法:
**REINFORCE**
,
**
REINFORCE 和基线**
,
**Actor-Critic**
和
**Advantage Actor-Critic
(A2C)**
*
四种策略梯度方法:
**REINFORCE**
,
**
带基线的 REINFORCE**
,
**演员评论家**
和
**优势演员评论家
(A2C)**
*
在连续动作空间环境中如何在
`tf.keras`
中实施策略梯度方法的指南
*
在连续动作空间环境中如何在
`tf.keras`
中实施策略梯度方法的指南
让我们从定理开始。
让我们从定理开始。
...
@@ -94,7 +94,7 @@
...
@@ -94,7 +94,7 @@
通过使用折现梯度和学习率执行梯度上升来更新参数。 作为蒙特卡洛算法,REINFORCE 要求代理在处理渐变更新之前先完成一集。 同样由于其蒙特卡洛性质,REINFORCE 的梯度更新具有高方差的特征。
通过使用折现梯度和学习率执行梯度上升来更新参数。 作为蒙特卡洛算法,REINFORCE 要求代理在处理渐变更新之前先完成一集。 同样由于其蒙特卡洛性质,REINFORCE 的梯度更新具有高方差的特征。
**算法 10.2.1
增强
**
**算法 10.2.1
REINFORCE
**
*要求*
:可区分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
*要求*
:可区分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
...
@@ -104,7 +104,7 @@
...
@@ -104,7 +104,7 @@
1.
重复。
1.
重复。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成剧集!
[](
img/B14853_10_059.png
)
。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成剧集!
[](
img/B14853_10_059.png
)
。
3.
步骤的
**步骤![](img/B14853_10_061.png) **
执行
**。**
3.
对于步骤
`t = 0, ..., T - 1`
,执行:
4.
计算返回值!
[](
img/B14853_10_062.png
)
。
4.
计算返回值!
[](
img/B14853_10_062.png
)
。
5.
计算折扣的性能梯度!
[](
img/B14853_10_063.png
)
。
5.
计算折扣的性能梯度!
[](
img/B14853_10_063.png
)
。
...
@@ -219,7 +219,7 @@ REINFORCE 算法可以通过从收益![](img/B14853_10_066.png)中减去基线
...
@@ -219,7 +219,7 @@ REINFORCE 算法可以通过从收益![](img/B14853_10_066.png)中减去基线
“算法 10.3.1”用基线方法
[
1]总结了 REINFORCE。 这与 REINFORCE 相似,只不过将返回值替换为![
](
img/B14853_10_076.png
)
。 区别在于我们现在正在训练两个神经网络。
“算法 10.3.1”用基线方法
[
1]总结了 REINFORCE。 这与 REINFORCE 相似,只不过将返回值替换为![
](
img/B14853_10_076.png
)
。 区别在于我们现在正在训练两个神经网络。
**基线为**
的算法 10.3.1
REINFORCE
算法 10.3.1 带基线的
REINFORCE
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
...
@@ -231,7 +231,7 @@ REINFORCE 算法可以通过从收益![](img/B14853_10_066.png)中减去基线
...
@@ -231,7 +231,7 @@ REINFORCE 算法可以通过从收益![](img/B14853_10_066.png)中减去基线
1.
重复。
1.
重复。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成剧集!
[](
img/B14853_10_059.png
)
。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成剧集!
[](
img/B14853_10_059.png
)
。
3.
步骤的
**步骤![](img/B14853_10_061.png) **
执行
**。**
3.
对于步骤
`t = 0, ..., T - 1`
,执行:
4.
计算返回值!
[](
img/B14853_10_062.png
)
。
4.
计算返回值!
[](
img/B14853_10_062.png
)
。
5.
减去基线!
[](
img/B14853_10_090.png
)
。
5.
减去基线!
[](
img/B14853_10_090.png
)
。
6.
计算折现值梯度!
[](
img/B14853_10_091.png
)
。
6.
计算折现值梯度!
[](
img/B14853_10_091.png
)
。
...
@@ -332,7 +332,7 @@ class REINFORCEBaselineAgent(REINFORCEAgent):
...
@@ -332,7 +332,7 @@ class REINFORCEBaselineAgent(REINFORCEAgent):
“算法 10.4.1”总结了 Actor-Critic 方法[1]。 除了评估用于培训政策和价值网络的国家价值评估外,还可以在线进行培训。 在每个步骤中,两个网络都经过培训。 这与 REINFORCE 和带有基线的 REINFORCE 不同,在基线之前,代理完成了一个情节。 首先,在当前状态的值估计期间向价值网络查询两次,其次,为下一个状态的值查询。 这两个值都用于梯度计算中。
“算法 10.4.1”总结了 Actor-Critic 方法[1]。 除了评估用于培训政策和价值网络的国家价值评估外,还可以在线进行培训。 在每个步骤中,两个网络都经过培训。 这与 REINFORCE 和带有基线的 REINFORCE 不同,在基线之前,代理完成了一个情节。 首先,在当前状态的值估计期间向价值网络查询两次,其次,为下一个状态的值查询。 这两个值都用于梯度计算中。
**算法 10.4.1
关键角色
**
**算法 10.4.1
演员评论家
**
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_108.png
)
。
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_108.png
)
。
...
@@ -343,7 +343,7 @@ class REINFORCEBaselineAgent(REINFORCEAgent):
...
@@ -343,7 +343,7 @@ class REINFORCEBaselineAgent(REINFORCEAgent):
*要求*
:!
[](
img/B14853_10_082.png
)
,初始策略网络参数(例如,!
[](
img/B14853_10_058.png
)
)。 !
[](
img/B14853_10_084.png
)
,初始值网络参数(例如!
[](
img/B14853_10_085.png
)
)。
*要求*
:!
[](
img/B14853_10_082.png
)
,初始策略网络参数(例如,!
[](
img/B14853_10_058.png
)
)。 !
[](
img/B14853_10_084.png
)
,初始值网络参数(例如!
[](
img/B14853_10_085.png
)
)。
1.
重复。
1.
重复。
2.
步骤的
**步骤![](img/B14853_10_061.png) **
执行
**。**
2.
对于步骤
`t = 0, ..., T - 1`
,执行:
3.
对动作!
[](
img/B14853_10_118.png
)
进行采样。
3.
对动作!
[](
img/B14853_10_118.png
)
进行采样。
4.
执行动作并观察奖励!
[](
img/B14853_10_100.png
)
和下一个状态!
[](
img/B14853_10_120.png
)
。
4.
执行动作并观察奖励!
[](
img/B14853_10_100.png
)
和下一个状态!
[](
img/B14853_10_120.png
)
。
5.
评估状态值估计!
[](
img/B14853_10_121.png
)
。
5.
评估状态值估计!
[](
img/B14853_10_121.png
)
。
...
@@ -430,9 +430,9 @@ class ActorCriticAgent(PolicyAgent):
...
@@ -430,9 +430,9 @@ class ActorCriticAgent(PolicyAgent):
最终的策略梯度方法是 A2C。
最终的策略梯度方法是 A2C。
# 5.优势演员
批评
(A2C)方法
# 5.优势演员
评论家
(A2C)方法
在上一节的
Actor-Critic
方法中,目标是使的值函数正确评估状态值。 还有其他用于培训价值网络的技术。 一种明显的方法是在值函数优化中使用
**均方误差**
(
**MSE**
),类似于 Q 学习中的算法。 新值梯度等于返回值
`R[t]`
与状态值之间的 MSE 偏导数:
在上一节的
演员评论家
方法中,目标是使的值函数正确评估状态值。 还有其他用于培训价值网络的技术。 一种明显的方法是在值函数优化中使用
**均方误差**
(
**MSE**
),类似于 Q 学习中的算法。 新值梯度等于返回值
`R[t]`
与状态值之间的 MSE 偏导数:
![](
img/B14853_10_127.png
)
(
Equation
10.5.1)
![](
img/B14853_10_127.png
)
(
Equation
10.5.1)
...
@@ -442,7 +442,7 @@ class ActorCriticAgent(PolicyAgent):
...
@@ -442,7 +442,7 @@ class ActorCriticAgent(PolicyAgent):
A2C 的相应网络类似于“图 10.4.1”,因为我们仅更改了梯度计算方法。 为了鼓励训练过程中的探员探索,A3C 算法
[
3]建议将策略函数的加权熵值的梯度添加到到梯度函数![
](
img/B14853_10_131.png
)
中。 回想一下,熵是对信息或事件不确定性的度量。
A2C 的相应网络类似于“图 10.4.1”,因为我们仅更改了梯度计算方法。 为了鼓励训练过程中的探员探索,A3C 算法
[
3]建议将策略函数的加权熵值的梯度添加到到梯度函数![
](
img/B14853_10_131.png
)
中。 回想一下,熵是对信息或事件不确定性的度量。
**算法 10.5.1 优势
Actor-Critic
(A2C)**
**算法 10.5.1 优势
演员评论家
(A2C)**
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
*要求*
:可微分的参数化目标策略网络!
[](
img/B14853_10_029.png
)
。
...
@@ -455,7 +455,7 @@ A2C 的相应网络类似于“图 10.4.1”,因为我们仅更改了梯度计
...
@@ -455,7 +455,7 @@ A2C 的相应网络类似于“图 10.4.1”,因为我们仅更改了梯度计
1.
重复。
1.
重复。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成情节(!
[](
img/B14853_10_142.png
)
)。
2.
通过跟随!
[](
img/B14853_10_029.png
)
来生成情节(!
[](
img/B14853_10_142.png
)
)。
3.
!
[](
img/B14853_10_144.png
)
3.
!
[](
img/B14853_10_144.png
)
4.
步骤的
**步骤![](img/B14853_10_145.png) **
执行
**。**
4.
对于步骤
`t = 0, ..., T - 1`
,执行:
5.
计算返回值!
[](
img/B14853_10_146.png
)
。
5.
计算返回值!
[](
img/B14853_10_146.png
)
。
6.
计算值梯度!
[](
img/B14853_10_147.png
)
。
6.
计算值梯度!
[](
img/B14853_10_147.png
)
。
7.
累积梯度!
[](
img/B14853_10_092.png
)
。
7.
累积梯度!
[](
img/B14853_10_092.png
)
。
...
@@ -986,8 +986,7 @@ self.value_model = Model(inputs, value, name='value')
...
@@ -986,8 +986,7 @@ self.value_model = Model(inputs, value, name='value')
return
-
K
.
mean
(
y_pred
*
y_true
,
axis
=-
1
)
return
-
K
.
mean
(
y_pred
*
y_true
,
axis
=-
1
)
```
```
<colgroup><col>
<col>
<col></colgroup>
|
**算法**
|
`logp_loss`
的
`y_true`
|
`value_loss`
的
`y_true`
|
|
**算法**
| logp_loss 的
**y_true**
|
**y_true of value_loss**
|
| 10.2.1 加强 | !
[](
img/B14853_10_167.png
)
| 不适用 |
| 10.2.1 加强 | !
[](
img/B14853_10_167.png
)
| 不适用 |
| 10.3.1 使用基线加强 | !
[](
img/B14853_10_168.png
)
| !
[](
img/B14853_10_170.png
)
|
| 10.3.1 使用基线加强 | !
[](
img/B14853_10_168.png
)
| !
[](
img/B14853_10_170.png
)
|
| 10.4.1 演员批评 | !
[](
img/B14853_10_169.png
)
| !
[](
img/B14853_10_171.png
)
|
| 10.4.1 演员批评 | !
[](
img/B14853_10_169.png
)
| !
[](
img/B14853_10_171.png
)
|
...
@@ -997,7 +996,7 @@ self.value_model = Model(inputs, value, name='value')
...
@@ -997,7 +996,7 @@ self.value_model = Model(inputs, value, name='value')
“表 10.6.2”中显示了用于计算“表 10.6.1”中的
`y_true`
的代码实现:
“表 10.6.2”中显示了用于计算“表 10.6.1”中的
`y_true`
的代码实现:
|
**算法**
|
**y_true 公式**
|
**y_true in Keras**
|
|
**算法**
|
`y_true`
公式 | Keras 中的
`y_true`
|
| 10.2.1 加强 | !
[](
img/B14853_10_174.png
)
|
`reward * discount_factor`
|
| 10.2.1 加强 | !
[](
img/B14853_10_174.png
)
|
`reward * discount_factor`
|
| 10.3.1 加强基线 | !
[](
img/B14853_10_175.png
)
|
`(reward - self.value(state)[0]) * discount_factor`
|
| 10.3.1 加强基线 | !
[](
img/B14853_10_175.png
)
|
`(reward - self.value(state)[0]) * discount_factor`
|
| 10.4.1 演员批评 | !
[](
img/B14853_10_176.png
)
|
`(reward - self.value(state)[0] + gamma * next_value) * discount_factor`
|
| 10.4.1 演员批评 | !
[](
img/B14853_10_176.png
)
|
`(reward - self.value(state)[0] + gamma * next_value) * discount_factor`
|
...
...
new/adv-dl-tf2-keras/11.md
浏览文件 @
a3058fcb
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
在物体检测中,目标是在图像中定位和识别物体。“图 11.1.1”显示了目标
**汽水罐**
的目标物检测。 本地化意味着必须估计对象的边界框。 使用左上角像素坐标和右下角像素坐标是用于描述边界框的通用约定。 在“图 11.1.1”中,左上角像素具有坐标
`(x_min, y_min)`
,而右下角像素的坐标为
`(x_max, y_max)`
。像素坐标系的原点
`(0, 0)`
位于整个图像的左上角像素。
在物体检测中,目标是在图像中定位和识别物体。“图 11.1.1”显示了目标
**汽水罐**
的目标物检测。 本地化意味着必须估计对象的边界框。 使用左上角像素坐标和右下角像素坐标是用于描述边界框的通用约定。 在“图 11.1.1”中,左上角像素具有坐标
`(x_min, y_min)`
,而右下角像素的坐标为
`(x_max, y_max)`
。像素坐标系的原点
`(0, 0)`
位于整个图像的左上角像素。
在执行定位时,检测还必须识别对象。 识别是计算机视觉中的经典识别或分类任务。 至少,对象检测必须确定边界框是属于已知对象还是背景。 可以训练对象检测网络以仅检测一个特定对象,例如
*中的**苏打罐*
“图 11.1.1”
。 其他所有内容均视为背景,因此无需显示其边界框。 同一对象的多个实例,例如两个或多个
**汽水罐**
,也可以通过同一网络检测到,如图“图 11.1.2”所示。
在执行定位时,检测还必须识别对象。 识别是计算机视觉中的经典识别或分类任务。 至少,对象检测必须确定边界框是属于已知对象还是背景。 可以训练对象检测网络以仅检测一个特定对象,例如
“图 11.1.1”中的
**汽水罐**
。 其他所有内容均视为背景,因此无需显示其边界框。 同一对象的多个实例,例如两个或多个
**汽水罐**
,也可以通过同一网络检测到,如图“图 11.1.2”所示。
![](
img/B14853_11_01.png
)
![](
img/B14853_11_01.png
)
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
图 11.1.3 如果仅在检测汽水罐方面训练了对象检测,它将忽略图像中的其他两个对象。
图 11.1.3 如果仅在检测汽水罐方面训练了对象检测,它将忽略图像中的其他两个对象。
但是,如果重新训练了网络以检测三个对象:1)
**
苏打水罐**
,2)
`J`
**uice 罐**
和 3)
[
HTG7 瓶装水
会同时定位和识别,如图“图 11.1.4”所示。
但是,如果重新训练了网络以检测三个对象:1)
**
汽水罐**
,2)
**果汁罐**
和 3)
**水瓶**
会同时定位和识别,如图“图 11.1.4”所示。
![](
img/B14853_11_04.png
)
![](
img/B14853_11_04.png
)
...
@@ -64,7 +64,7 @@
...
@@ -64,7 +64,7 @@
例如,如图“图 11.2.1”所示,将普通图像尺寸 640 x 480 分为 2 x 1 个区域,从而产生两个锚框。 与 2 x 2 的大小不同,2 x 1 的划分创建了近似方形的锚框。 在第一个锚点框中,新的偏移量是
`(x_min, y_min)`
和!
[](
img/B14853_11_001.png
)
,它们比 没有锚框的像素误差值。 第二个锚框的偏移量也较小。
例如,如图“图 11.2.1”所示,将普通图像尺寸 640 x 480 分为 2 x 1 个区域,从而产生两个锚框。 与 2 x 2 的大小不同,2 x 1 的划分创建了近似方形的锚框。 在第一个锚点框中,新的偏移量是
`(x_min, y_min)`
和!
[](
img/B14853_11_001.png
)
,它们比 没有锚框的像素误差值。 第二个锚框的偏移量也较小。
在“图 11.2.2”中,图像被进一步分割。 这次,锚框为 3 x2。第二个锚框偏移为!
[](
img/B14853_11_002.png
)
和!
[](
img/B14853_11_003.png
)
,这是迄今为止最小的。 但是,如果将图像进一步分为 5 x 4,则偏移量开始再次增加。 主要思想是,在创建各种尺寸的区域的过程中,将出现最接近地面真值边界框的最佳锚框大小。 使用多尺度锚框有效地检测不同大小的对象将巩固
**多尺度对象检测**
算法的概念。
在“图 11.2.2”中,图像被进一步分割。 这次,锚框为 3 x2。第二个锚框偏移为!
[](
img/B14853_11_002.png
)
和!
[](
img/B14853_11_003.png
)
,这是迄今为止最小的。 但是,如果将图像进一步分为 5 x 4,则偏移量开始再次增加。 主要思想是,在创建各种尺寸的区域的过程中,将出现最接近地面真值边界框的最佳锚框大小。 使用多尺度锚框有效地检测不同大小的对象将巩固
**多尺度对象检测**
算法的概念。
找到一个最佳的锚框并不是零成本。 尤其是,有些外部锚框的偏移量比使用整个图像还要差。 在这种情况下,SSD 建议这些锚定框不应对整个优化过程有所帮助,而应予以抑制。 在以下各节中,将更详细地讨论排除非最佳锚框的算法。
找到一个最佳的锚框并不是零成本。 尤其是,有些外部锚框的偏移量比使用整个图像还要差。 在这种情况下,SSD 建议这些锚定框不应对整个优化过程有所帮助,而应予以抑制。 在以下各节中,将更详细地讨论排除非最佳锚框的算法。
...
@@ -84,7 +84,7 @@
...
@@ -84,7 +84,7 @@
40 x 30 格的锚框,每个框的尺寸为!
[](
img/B14853_11_009.png
)
40 x 30 格的锚框,每个框的尺寸为!
[](
img/B14853_11_009.png
)
对于具有 40 x 30 网格的锚框的 640 x 480 图像,最小的锚框覆盖输入图像的 16 x 16 像素斑块,也称为
**接收
场
**
。 到目前为止,包围盒的总数为 1608。对于所有尺寸,最小的
**缩放因子**
可以总结为:
对于具有 40 x 30 网格的锚框的 640 x 480 图像,最小的锚框覆盖输入图像的 16 x 16 像素斑块,也称为
**接收
域
**
。 到目前为止,包围盒的总数为 1608。对于所有尺寸,最小的
**缩放因子**
可以总结为:
![](
img/B14853_11_010.png
)
(
Equation
11.2.1)
![](
img/B14853_11_010.png
)
(
Equation
11.2.1)
...
@@ -278,7 +278,7 @@ def centroid2minmax(boxes):
...
@@ -278,7 +278,7 @@ def centroid2minmax(boxes):
从“图 11.2.3”看来,给定一个对象边界框,有许多可以分配给对象的地面真相锚定框。 实际上,仅出于“图 11.2.3”中的说明,已经有 3 个锚定框。 如果考虑每个区域的所有锚框,则仅针对!
[](
img/B14853_11_021.png
)
就有 6 x 6 = 36 个地面真实框。 使用所有 9,648 个锚点框显然过多。 所有锚定框中只有一个应与地面真值边界框相关联。 所有其他锚点框都是背景锚点框。 选择哪个对象应被视为图像中对象的地面真相锚定框的标准是什么?
从“图 11.2.3”看来,给定一个对象边界框,有许多可以分配给对象的地面真相锚定框。 实际上,仅出于“图 11.2.3”中的说明,已经有 3 个锚定框。 如果考虑每个区域的所有锚框,则仅针对!
[](
img/B14853_11_021.png
)
就有 6 x 6 = 36 个地面真实框。 使用所有 9,648 个锚点框显然过多。 所有锚定框中只有一个应与地面真值边界框相关联。 所有其他锚点框都是背景锚点框。 选择哪个对象应被视为图像中对象的地面真相锚定框的标准是什么?
选择锚框的基础称为
**
联合上方的交叉点
**
(
**IoU**
)。 IoU 也称为
*Jaccard 指数*
。 在“图 11.3.1”中说明了 IoU。 给定 2 个区域,对象边界框
`B[0]`
和锚定框
`A[1]`
,IoU 等于 重叠除以合并区域的面积:
选择锚框的基础称为
**
交并比
**
(
**IoU**
)。 IoU 也称为
*Jaccard 指数*
。 在“图 11.3.1”中说明了 IoU。 给定 2 个区域,对象边界框
`B[0]`
和锚定框
`A[1]`
,IoU 等于 重叠除以合并区域的面积:
![](
img/B14853_11_022.png
)
(
Equation
11.3.1)
![](
img/B14853_11_022.png
)
(
Equation
11.3.1)
...
@@ -292,7 +292,7 @@ def centroid2minmax(boxes):
...
@@ -292,7 +292,7 @@ def centroid2minmax(boxes):
请注意,对于每个对象,只有一个基于“公式 11.3.2”的地面真值锚定框。 此外,必须在所有比例因子和尺寸(长宽比和附加尺寸)中对所有锚框进行最大化。 在“图 11.3.1”中,在 9,648 个锚框中仅显示了一个比例因子大小。
请注意,对于每个对象,只有一个基于“公式 11.3.2”的地面真值锚定框。 此外,必须在所有比例因子和尺寸(长宽比和附加尺寸)中对所有锚框进行最大化。 在“图 11.3.1”中,在 9,648 个锚框中仅显示了一个比例因子大小。
为了说明“公式 11.3.2”,假设考虑了“图 11.3.1”中纵横比为 1 的锚框。 对于每个锚框,估计的 IoU 均显示在“表 11.3.1”中。 由于边界框
`B[0]`
的最大 IoU 为 0.32,因此带有锚框
`A[1]`
,
`A[1]`
被分配为地面真值边界框
`B[0]`
。
`A[1]`
也被称为
**
阳性锚盒
**
。
为了说明“公式 11.3.2”,假设考虑了“图 11.3.1”中纵横比为 1 的锚框。 对于每个锚框,估计的 IoU 均显示在“表 11.3.1”中。 由于边界框
`B[0]`
的最大 IoU 为 0.32,因此带有锚框
`A[1]`
,
`A[1]`
被分配为地面真值边界框
`B[0]`
。
`A[1]`
也被称为
**
正锚框
**
。
正锚定框的类别和偏移量是相对于其地面真值边界框确定的。 正锚定框的类别与其地面真值边界框相同。 同时,可以将正锚框偏移量计算为等于地面真实边界框坐标减去其自身的边界框坐标。
正锚定框的类别和偏移量是相对于其地面真值边界框确定的。 正锚定框的类别与其地面真值边界框相同。 同时,可以将正锚框偏移量计算为等于地面真实边界框坐标减去其自身的边界框坐标。
...
@@ -498,7 +498,7 @@ def minmax2centroid(boxes):
...
@@ -498,7 +498,7 @@ def minmax2centroid(boxes):
gt_class
[
0
]
=
[
1.0
,
0.0
,
0.0
,
0.0
]
gt_class
[
0
]
=
[
1.0
,
0.0
,
0.0
,
0.0
]
```
```
如果锚定框 1 是正锚定框,并且其地面真值边界框包含带有标签 2 的
**
苏打
罐**
,则:
如果锚定框 1 是正锚定框,并且其地面真值边界框包含带有标签 2 的
**
汽水
罐**
,则:
```
py
```
py
gt_class
[
1
]
=
[
0.0
,
0.0
,
1.0
,
0.0
]
gt_class
[
1
]
=
[
0.0
,
0.0
,
1.0
,
0.0
]
...
@@ -1282,7 +1282,7 @@ from skimage.io import imread
...
@@ -1282,7 +1282,7 @@ from skimage.io import imread
# 10.示例数据集
# 10.示例数据集
使用便宜的 USB 相机(A4TECH PK-635G)收集了一个由 1,000 640 X 480 RGB 训练图像和 50 640 X 480 RGB 测试图像组成的小型数据集。 使用
**VGG 图像
注释器**
(
**VIA**
)[5]标记数据集图像,以检测三个对象:1)
**汽水罐**
,2)
**果汁罐**
和 3)
**瓶装水
**
。“图 11.10.1”显示了标记过程的示例 UI。
使用便宜的 USB 相机(A4TECH PK-635G)收集了一个由 1,000 640 X 480 RGB 训练图像和 50 640 X 480 RGB 测试图像组成的小型数据集。 使用
**VGG 图像
标注器**
(
**VIA**
)[5]标记数据集图像,以检测三个对象:1)
**汽水罐**
,2)
**果汁罐**
和 3)
**水瓶
**
。“图 11.10.1”显示了标记过程的示例 UI。
可以在
`GitHub`
存储库的
`utils/video_capture.py`
中找到用于收集图像的实用程序脚本。 该脚本每 5 秒自动捕获一次图像,因此可以加快数据收集过程。
可以在
`GitHub`
存储库的
`utils/video_capture.py`
中找到用于收集图像的实用程序脚本。 该脚本每 5 秒自动捕获一次图像,因此可以加快数据收集过程。
...
@@ -1481,7 +1481,7 @@ def nms(args, classes, offsets, anchors):
...
@@ -1481,7 +1481,7 @@ def nms(args, classes, offsets, anchors):
# 13\. SSD 模型验证
# 13\. SSD 模型验证
在对 SSD 模型进行 200 个时期的训练之后,可以验证性能。 用于评估的三个可能指标:1)
**IoU**
,2)
**精度**
和 3)
**调用。**
在对 SSD 模型进行 200 个时期的训练之后,可以验证性能。 用于评估的三个可能指标:1)
**IoU**
,2)
**精度**
和 3)
**召回**
。
第一个指标是
**平均 IoU**
(
**mIoU**
)。 给定地面真相测试数据集,计算地面真相边界框和预测边界框之间的 IoU。 在执行 NMS 之后,对所有地面真相和预测的边界框执行此操作。 所有 IoU 的平均值计算为 mIoU:
第一个指标是
**平均 IoU**
(
**mIoU**
)。 给定地面真相测试数据集,计算地面真相边界框和预测边界框之间的 IoU。 在执行 NMS 之后,对所有地面真相和预测的边界框执行此操作。 所有 IoU 的平均值计算为 mIoU:
...
@@ -1493,7 +1493,7 @@ def nms(args, classes, offsets, anchors):
...
@@ -1493,7 +1493,7 @@ def nms(args, classes, offsets, anchors):
![](
img/B14853_11_075.png
)
(
Equation
11.3.2)
![](
img/B14853_11_075.png
)
(
Equation
11.3.2)
第三个度量是
**
调用
**
,如“公式 11.3.3”所示。 它是正确预测的对象类别的数量(真阳性或 TP)除以正确预测的对象类别的数量(真阳性或 TP)加上错过的对象数量(假阴性或 FN)之和。 召回率是衡量 SSD 在不对图像中的对象进行错误分类方面有多出色的度量。 召回率越接近 1.0,则越好。
第三个度量是
**
召回
**
,如“公式 11.3.3”所示。 它是正确预测的对象类别的数量(真阳性或 TP)除以正确预测的对象类别的数量(真阳性或 TP)加上错过的对象数量(假阴性或 FN)之和。 召回率是衡量 SSD 在不对图像中的对象进行错误分类方面有多出色的度量。 召回率越接近 1.0,则越好。
![](
img/B14853_11_076.png
)
(
Equation
11.3.3)
![](
img/B14853_11_076.png
)
(
Equation
11.3.3)
...
@@ -1617,9 +1617,8 @@ python3 ssd-11.6.1.py --restore-weights=ResNet56v2-4layer-extra_anchors-drinks-2
...
@@ -1617,9 +1617,8 @@ python3 ssd-11.6.1.py --restore-weights=ResNet56v2-4layer-extra_anchors-drinks-2
结果如下,在“表 11.13.1”中:
结果如下,在“表 11.13.1”中:
<colgroup><col>
<col>
<col>
<col>
<col>
<col></colgroup>
| |
**未归一化的偏移量**
|
**未归一化的偏移,平滑 L1**
|
**归一化的偏移量**
|
**归一化偏移,平滑 L1**
|
**归一化偏移,平滑 L1,焦点损失**
|
| |
**未归一化的偏移量**
|
**未归一化的偏移,平滑 L1**
|
**规范化的偏移量**
|
**标准化偏移,平滑 L1**
|
**归一化偏移,平滑 L1,焦点损失**
|
| IoU | 0.64 | 0.61 | 0.53 | 0.50 | 0.51 |
| I | 0.64 | 0.61 | 0.53 | 0.50 | 0.51 |
| 平均精度 | 0.87 | 0.86 | 0.90 | 0.85 | 0.85 |
| 平均精度 | 0.87 | 0.86 | 0.90 | 0.85 | 0.85 |
| 平均召回率 | 0.87 | 0.85 | 0.87 | 0.83 | 0.83 |
| 平均召回率 | 0.87 | 0.85 | 0.87 | 0.83 | 0.83 |
...
...
new/adv-dl-tf2-keras/12.md
浏览文件 @
a3058fcb
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
在“第 11 章”,“对象检测”中,我们讨论了对象检测作为一种重要的计算机视觉算法,具有多种实际应用。 在本章中,我们将讨论另一种称为语义分割的相关算法。 如果对象检测的目的是对图像中的每个对象同时执行定位和标识,则在语义分割中,目的是根据每个像素的对象类别对它们进行分类。
在“第 11 章”,“对象检测”中,我们讨论了对象检测作为一种重要的计算机视觉算法,具有多种实际应用。 在本章中,我们将讨论另一种称为语义分割的相关算法。 如果对象检测的目的是对图像中的每个对象同时执行定位和标识,则在语义分割中,目的是根据每个像素的对象类别对它们进行分类。
进一步扩展类比,在对象检测中,我们使用边界框显示结果。 在语义分割中,同一对象的所有像素都属于同一类别。 在视觉上,同一对象的所有像素将具有相同的颜色。 例如,属于
*
*苏打
水**
类别的所有像素均为蓝色。 非苏打罐对象的像素将具有不同的颜色。
进一步扩展类比,在对象检测中,我们使用边界框显示结果。 在语义分割中,同一对象的所有像素都属于同一类别。 在视觉上,同一对象的所有像素将具有相同的颜色。 例如,属于
*
汽
水*
*
类别的所有像素均为蓝色。 非苏打罐对象的像素将具有不同的颜色。
类似于对象检测,语义分割有许多实际应用。 在医学成像中,它可用于分离和测量正常细胞与异常细胞的区域。 在卫星成像中,语义分段可用于度量森林覆盖率或灾难期间的洪水程度。 通常,语义分割可用于识别属于同一类对象的像素。 识别每个对象的各个实例并不重要。
类似于对象检测,语义分割有许多实际应用。 在医学成像中,它可用于分离和测量正常细胞与异常细胞的区域。 在卫星成像中,语义分段可用于度量森林覆盖率或灾难期间的洪水程度。 通常,语义分割可用于识别属于同一类对象的像素。 识别每个对象的各个实例并不重要。
...
@@ -52,7 +52,7 @@
...
@@ -52,7 +52,7 @@
图 12.2.1:可以将语义分割网络视为按像素分类器。 彩色效果最佳。 原始图像可以在 https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/tree/master/chapter12-segmentation 中找到
图 12.2.1:可以将语义分割网络视为按像素分类器。 彩色效果最佳。 原始图像可以在 https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras/tree/master/chapter12-segmentation 中找到
例如,假设我们对以下四个类别感兴趣:0)
**背景**
,1)
**水
壶**
,2)
**汽水罐**
和 3)
[
HTG6 果汁可以
,我们可以在“图 12.2.2”中看到,每个对象类别有四个像素。
例如,假设我们对以下四个类别感兴趣:0)
**背景**
,1)
**水
瓶**
,2)
**汽水罐**
和 3)
**果汁罐**
,我们可以在“图 12.2.2”中看到,每个对象类别有四个像素。
相应地,使用 4-dim
`one-hot vector`
对每个像素进行分类。 我们使用阴影表示像素的类别。 利用这一知识,我们可以想象一个语义分割网络预测
`image_width`
x
`image_height`
4 维一热向量作为输出,每个像素一个 4 维一热向量:
相应地,使用 4-dim
`one-hot vector`
对每个像素进行分类。 我们使用阴影表示像素的类别。 利用这一知识,我们可以想象一个语义分割网络预测
`image_width`
x
`image_height`
4 维一热向量作为输出,每个像素一个 4 维一热向量:
...
@@ -328,7 +328,7 @@ def build_fcn(input_shape,
...
@@ -328,7 +328,7 @@ def build_fcn(input_shape,
# 4.示例数据集
# 4.示例数据集
我们可以使用在“第 11 章”,“对象检测”中使用的数据集。 回想一下,我们使用了一个小型数据集,其中包含使用便宜的 USB 相机(A4TECH PK-635G)收集的 1,000 640 x 480 RGB 训练图像和 50 640 x 480 RGB 测试图像。 但是,我们没有使用边界框和类别进行标记,而是使用多边形形状跟踪了每个对象类别的边缘。 我们使用相同的数据集注释器
**VGG 图像
注释器**
(
**威盛**
)[4]手动跟踪边缘并分配以下标签:1)
**水瓶[**
,2)
**汽水罐**
和 3)
**果汁罐**
。
我们可以使用在“第 11 章”,“对象检测”中使用的数据集。 回想一下,我们使用了一个小型数据集,其中包含使用便宜的 USB 相机(A4TECH PK-635G)收集的 1,000 640 x 480 RGB 训练图像和 50 640 x 480 RGB 测试图像。 但是,我们没有使用边界框和类别进行标记,而是使用多边形形状跟踪了每个对象类别的边缘。 我们使用相同的数据集注释器
**VGG 图像
标注器**
(
**VIA**
)[4]手动跟踪边缘并分配以下标签:1)
**水瓶**
,2)
**汽水罐**
和 3)
**果汁罐**
。
“图 12.4.1”显示了标记过程的示例 UI。
“图 12.4.1”显示了标记过程的示例 UI。
...
...
new/adv-dl-tf2-keras/13.md
浏览文件 @
a3058fcb
...
@@ -38,7 +38,7 @@ MI 最近已成功地从未标记的数据中提取了有用的信息,可以
...
@@ -38,7 +38,7 @@ MI 最近已成功地从未标记的数据中提取了有用的信息,可以
*
`P`
(
`X`
,
`Y`
)是 X 和 Y 在样本空间
`X`
x
`Y`
上的联合分布 。
*
`P`
(
`X`
,
`Y`
)是 X 和 Y 在样本空间
`X`
x
`Y`
上的联合分布 。
*
`P`
(
`X`
)
`P`
(
`Y`
)是边际分布
`P`
(
`X`
)和
`P`
(
`Y`
)分别位于样本空间
`X`
和
`Y`
上。
*
`P`
(
`X`
)
`P`
(
`Y`
)是边际分布
`P`
(
`X`
)和
`P`
(
`Y`
)分别位于样本空间
`X`
和
`Y`
上。
换句话说,MI 是联合分布与边际分布乘积之间的
**Kullback-Leibler**
(
**KL**
)
发散
。 回顾“第 5 章”,“改进的 GAN” ,KL 是两个分布之间距离的度量。 在 MI 的上下文中,KL 距离越大,两个随机变量
`X`
和
`Y`
之间的 MI 越高。 通过扩展,MI 越高,
`X`
对
`Y`
的依赖性越高。
换句话说,MI 是联合分布与边际分布乘积之间的
**Kullback-Leibler**
(
**KL**
)
散度
。 回顾“第 5 章”,“改进的 GAN” ,KL 是两个分布之间距离的度量。 在 MI 的上下文中,KL 距离越大,两个随机变量
`X`
和
`Y`
之间的 MI 越高。 通过扩展,MI 越高,
`X`
对
`Y`
的依赖性越高。
由于 MI 等于边际分布的联合与乘积之间的 KL 散度,因此它暗示它大于或等于零:!
[](
img/B14853_13_002.png
)
。 当
`X`
和
`Y`
是独立随机变量时,MI 完全等于零。 当
`X`
和
`Y`
是独立的时,观察一个随机变量(例如
`Y`
)不会提供关于另一个随机变量的信息 例如
`X`
)。 因此,MI 是
`X`
和
`Y`
独立程度的度量。
由于 MI 等于边际分布的联合与乘积之间的 KL 散度,因此它暗示它大于或等于零:!
[](
img/B14853_13_002.png
)
。 当
`X`
和
`Y`
是独立随机变量时,MI 完全等于零。 当
`X`
和
`Y`
是独立的时,观察一个随机变量(例如
`Y`
)不会提供关于另一个随机变量的信息 例如
`X`
)。 因此,MI 是
`X`
和
`Y`
独立程度的度量。
...
@@ -59,7 +59,7 @@ MI 最近已成功地从未标记的数据中提取了有用的信息,可以
...
@@ -59,7 +59,7 @@ MI 最近已成功地从未标记的数据中提取了有用的信息,可以
哪里:
哪里:
*
`p`
(
`x`
,
`y`
)是联合
**概率
分布
函数**
(
**PDF**
)。
*
`p`
(
`x`
,
`y`
)是联合
**概率
密度
函数**
(
**PDF**
)。
*
`p`
(
`x`
)和
`p`
(
`y`
)是边缘 PDF。
*
`p`
(
`x`
)和
`p`
(
`y`
)是边缘 PDF。
连续随机变量的 MI 通常很难处理,并且可以通过变分方法进行估算。 在本章中,我们将讨论估计两个连续随机变量之间的 MI 的技术。
连续随机变量的 MI 通常很难处理,并且可以通过变分方法进行估算。 在本章中,我们将讨论估计两个连续随机变量之间的 MI 的技术。
...
@@ -470,7 +470,7 @@ class VGG:
...
@@ -470,7 +470,7 @@ class VGG:
回到
`IIC`
类,
`IIC`
的关键算法是使负 MI 最小的损耗函数。 此方法显示在“列表 13.5.4”中。 为了评估单个批次中的损失,我们研究了
`y_pred`
,并将其分为上下两半,分别对应于输入图像!
[](
img/B14853_13_076.png
)
及其变换后的图像!
[](
img/B14853_13_075.png
)
的编码器输出的 ]。 回想一下,配对数据是通过将一批图像!
[](
img/B14853_13_076.png
)
和一批其变换后的图像!
[](
img/B14853_13_0761.png
)
串联在一起而制成的。
回到
`IIC`
类,
`IIC`
的关键算法是使负 MI 最小的损耗函数。 此方法显示在“列表 13.5.4”中。 为了评估单个批次中的损失,我们研究了
`y_pred`
,并将其分为上下两半,分别对应于输入图像!
[](
img/B14853_13_076.png
)
及其变换后的图像!
[](
img/B14853_13_075.png
)
的编码器输出的 ]。 回想一下,配对数据是通过将一批图像!
[](
img/B14853_13_076.png
)
和一批其变换后的图像!
[](
img/B14853_13_0761.png
)
串联在一起而制成的。
`y_pred`
的下半部分为
`Z`
,而上半部分为!
[](
img/B14853_13_077.png
)
遵循“公式 10.3.2”至“公式 10.3.7”,联合分布
[
![
](
img/B14853_13_078.png
)
和边际分布被计算。 最后,返回负数 MI。 注意,每个头对总损失函数的贡献均等。 因此,损失是根据
磁头
的数量来缩放的。
`y_pred`
的下半部分为
`Z`
,而上半部分为!
[](
img/B14853_13_077.png
)
遵循“公式 10.3.2”至“公式 10.3.7”,联合分布
[
![
](
img/B14853_13_078.png
)
和边际分布被计算。 最后,返回负数 MI。 注意,每个头对总损失函数的贡献均等。 因此,损失是根据
头部
的数量来缩放的。
“列表 13.5.4”:
`iic-13.5.1.py`
。
“列表 13.5.4”:
`iic-13.5.1.py`
。
...
@@ -657,10 +657,9 @@ python3 iic-13.5.1.py --heads=1 --train --save-weights=head1.h5
...
@@ -657,10 +657,9 @@ python3 iic-13.5.1.py --heads=1 --train --save-weights=head1.h5
在本节中,我们将研究使用 MNIST 测试数据集对 IIC 进行验证之后的结果。 在测试数据集上运行聚类预测后,线性分配问题为每个聚类分配标签,从本质上将聚类转换为分类。 我们计算了分类精度,如“表 13.6.1”所示。 IIC 的准确率高于论文中报告的 99.3%。 但是,应该注意的是,并非每次训练都会导致高精度分类。
在本节中,我们将研究使用 MNIST 测试数据集对 IIC 进行验证之后的结果。 在测试数据集上运行聚类预测后,线性分配问题为每个聚类分配标签,从本质上将聚类转换为分类。 我们计算了分类精度,如“表 13.6.1”所示。 IIC 的准确率高于论文中报告的 99.3%。 但是,应该注意的是,并非每次训练都会导致高精度分类。
有时,由于优化似乎停留在局部最小值中,我们不得不多次运行训练。 此外,在多
磁头 IIC 模型中,对于所有磁头,我们都无法获得相同水平的性能。“表 13.6.1”报告了最佳性能的喷头
。
有时,由于优化似乎停留在局部最小值中,我们不得不多次运行训练。 此外,在多
头 IIC 模型中,对于所有头部,我们都无法获得相同水平的性能。“表 13.6.1”报告了最佳性能的头部
。
<colgroup><col>
<col>
<col>
<col>
<col>
<col></colgroup>
|
**头部数**
|
`1`
|
`2`
|
`3`
|
`4`
|
`5`
|
|
**头数**
|
`1`
|
`2`
|
`3`
|
`4`
|
`5`
|
|
**精度,%**
| 99.49 | 99.47 | 99.54 | 99.52 | 99.53 |
|
**精度,%**
| 99.49 | 99.47 | 99.54 | 99.52 | 99.53 |
表 13.6.1 不同头数的 IIC 精度
表 13.6.1 不同头数的 IIC 精度
...
@@ -677,7 +676,7 @@ python3 iic-13.5.1.py --heads=1 --eval --restore-weights=head1-best.h5
...
@@ -677,7 +676,7 @@ python3 iic-13.5.1.py --heads=1 --eval --restore-weights=head1-best.h5
在前面的章节中,我们了解到可以很好地估计离散随机变量的 MI。 我们还证明了借助线性分配算法,通过最大化 MI 来执行聚类的网络可以得出准确的分类器。
在前面的章节中,我们了解到可以很好地估计离散随机变量的 MI。 我们还证明了借助线性分配算法,通过最大化 MI 来执行聚类的网络可以得出准确的分类器。
如果 IIC 是离散随机变量 MI 的良好估计者,那么连续随机变量又如何呢? 在本节的中,我们讨论 Belghazi 等人的
**互信息网络估计器**
(
**
矿山
**
)。 [3]作为连续随机变量 MI 的估计量。
如果 IIC 是离散随机变量 MI 的良好估计者,那么连续随机变量又如何呢? 在本节的中,我们讨论 Belghazi 等人的
**互信息网络估计器**
(
**
MINE
**
)。 [3]作为连续随机变量 MI 的估计量。
MINE 在“公式 13.1.1”中提出了 KL 散度的另一种表示形式,以使用神经网络实现 MI 估计器。 在 MINE 中,使用 KL 散度的
**Donsker-Varadhan**
(
**DV**
)表示:
MINE 在“公式 13.1.1”中提出了 KL 散度的另一种表示形式,以使用神经网络实现 MI 估计器。 在 MINE 中,使用 KL 散度的
**Donsker-Varadhan**
(
**DV**
)表示:
...
@@ -697,9 +696,9 @@ MINE 在“公式 13.1.1”中提出了 KL 散度的另一种表示形式,以
...
@@ -697,9 +696,9 @@ MINE 在“公式 13.1.1”中提出了 KL 散度的另一种表示形式,以
“算法 13.7.1”:
`MINE`
。
“算法 13.7.1”:
`MINE`
。
![](
img/B14853_13_096.png
)
初始化所有网络参数
初始化所有网络参数
`θ`
。
**虽然**
!
[](
img/B14853_13_097.png
)
尚未收敛
**,但请执行**
:
`θ`
尚未收敛时,请执行
:
1.
从联合分布!
[](
img/B14853_13_098.png
)
中抽取一个小批量的
`b`
1.
从联合分布!
[](
img/B14853_13_098.png
)
中抽取一个小批量的
`b`
2.
从边际分布!
[](
img/B14853_13_099.png
)
和!
[](
img/B14853_13_100.png
)
中抽取一个小批量的
`b`
。
2.
从边际分布!
[](
img/B14853_13_099.png
)
和!
[](
img/B14853_13_100.png
)
中抽取一个小批量的
`b`
。
...
...
new/master-cv-tf-2x/9.md
浏览文件 @
a3058fcb
...
@@ -396,7 +396,7 @@ head_next_stage = Add()([head, head_m, prelayerfeatures])
...
@@ -396,7 +396,7 @@ head_next_stage = Add()([head, head_m, prelayerfeatures])
return
head_next_stage
,
head_parts
return
head_next_stage
,
head_parts
```
```
磁头
有两个主要块,每个块由一个 1 x 1 Conv2D 滤波器组成。 它使用激活层和填充。 作为复习,请参考“人体姿势估计-沙漏模型”部分下显示的沙漏架构图,以了解以下组件之间的联系:
头部
有两个主要块,每个块由一个 1 x 1 Conv2D 滤波器组成。 它使用激活层和填充。 作为复习,请参考“人体姿势估计-沙漏模型”部分下显示的沙漏架构图,以了解以下组件之间的联系:
*
进入下一个阶段
*
进入下一个阶段
*
前往中间特征
*
前往中间特征
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录