Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
d2l-zh
提交
7a8a02be
D
d2l-zh
项目概览
OpenDocCN
/
d2l-zh
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
d2l-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7a8a02be
编写于
11月 04, 2017
作者:
Y
yuwei wang
提交者:
Mu Li
11月 04, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Chapter01/NDArray sync (#93)
上级
b29f052b
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
46 addition
and
13 deletion
+46
-13
chapter_crashcourse/introduction.md
chapter_crashcourse/introduction.md
+7
-7
chapter_crashcourse/ndarray.md
chapter_crashcourse/ndarray.md
+39
-6
未找到文件。
chapter_crashcourse/introduction.md
浏览文件 @
7a8a02be
...
@@ -40,9 +40,9 @@ if input_command == 'Okey, Google':
...
@@ -40,9 +40,9 @@ if input_command == 'Okey, Google':
如果给我们的机器学习系统提供足够多猫和狗的图片,我们可以“编写”一个喵星人辨别器:
如果给我们的机器学习系统提供足够多猫和狗的图片,我们可以“编写”一个喵星人辨别器:
![](
../img/cat1.jpg
)
|!
[](
../img/cat2.jpg
)
|!
[](
../img/dog1.jpg
)
|!
[](
../img/dog2.jpg
)
|
| !
[](
../img/cat1.jpg
)
| !
[](
../img/cat2.jpg
)
| !
[](
../img/dog1.jpg
)
| !
[](
../img/dog2.jpg
)
|
|:---------------:|:---------------:|:---------------:|:---------------:|
|:---------------:|:---------------:|:---------------:|:---------------:|
|
喵|喵|汪|汪
|
|
喵 | 喵 | 汪 | 汪
|
如果是一只猫,辨别器会给出一个非常大的正数;如果是一只狗,会给出一个非常大的负数;如果不能确定的话,数字则接近于零。这仅仅是一个机器学习应用的粗浅例子。
如果是一只猫,辨别器会给出一个非常大的正数;如果是一只狗,会给出一个非常大的负数;如果不能确定的话,数字则接近于零。这仅仅是一个机器学习应用的粗浅例子。
...
@@ -233,10 +233,10 @@ $$L(\mathrm{action}\mid x) = \mathbf{E}_{y \sim p(y\mid x)}[\mathrm{loss}(\mathr
...
@@ -233,10 +233,10 @@ $$L(\mathrm{action}\mid x) = \mathbf{E}_{y \sim p(y\mid x)}[\mathrm{loss}(\mathr
具体展开讲,在之前的例子中,输出中的数据点的顺序与输入保持一致,而在机器翻译中,改变顺序是需要考虑的至关重要的因素。虽然我们仍是将一个序列转换为另一个序列,但是,不论是输入和输出的数量,还是对应的数据点的顺序,都可能发生变化。比如下面这个例子,这句德语(Alex写了这段话)翻译成英文时,需要将动词的位置调整到前面。
具体展开讲,在之前的例子中,输出中的数据点的顺序与输入保持一致,而在机器翻译中,改变顺序是需要考虑的至关重要的因素。虽然我们仍是将一个序列转换为另一个序列,但是,不论是输入和输出的数量,还是对应的数据点的顺序,都可能发生变化。比如下面这个例子,这句德语(Alex写了这段话)翻译成英文时,需要将动词的位置调整到前面。
|
德语 |Haben Sie sich schon dieses grossartige Lehrwerk angeschaut?
|
|
德语 | Haben Sie sich schon dieses grossartige Lehrwerk angeschaut?
|
|:------|:---------|
|:------|:---------|
|
正确的英语语序 |Did you already check out this excellent tutorial?
|
|
正确的英语语序 | Did you already check out this excellent tutorial?
|
|
错误的英语语序(对应德语语序) |Did you yourself already this excellent tutorial looked-at?
|
|
错误的英语语序(对应德语语序) | Did you yourself already this excellent tutorial looked-at?
|
## 无监督学习(Unsupervised Learning)
## 无监督学习(Unsupervised Learning)
...
@@ -284,9 +284,9 @@ RL框架的普适性并没有被夸大。例如,我们可以将任何监督学
...
@@ -284,9 +284,9 @@ RL框架的普适性并没有被夸大。例如,我们可以将任何监督学
除此以外,RL还可以解决很多监督学习无法解决的问题。例如,在监督学习中,我们总是期望训练使用的输入是与正确的标注相关联。但在RL中,我们并不给予每一次观察这样的期望,环境自然会告诉我们最优的动作,我们只是得到一些奖励。此外,环境甚至不会告诉我们是哪些动作导致了奖励。
除此以外,RL还可以解决很多监督学习无法解决的问题。例如,在监督学习中,我们总是期望训练使用的输入是与正确的标注相关联。但在RL中,我们并不给予每一次观察这样的期望,环境自然会告诉我们最优的动作,我们只是得到一些奖励。此外,环境甚至不会告诉我们是哪些动作导致了奖励。
举一个国际象棋的例子。唯一真正的奖励信号来自游戏结束时的胜利与否;如果赢了,分配奖励1;输了,分配-1
。因此,强化学习者必须处理
**信用分配问题(credit assignment problem)**
。另一个例子,一个雇员某天被升职;这一决定反应了在过去一年中,他选择了不少好的动作。想要继续升职,就要
知道是那些动作导致了这一升职奖励。
举一个国际象棋的例子。唯一真正的奖励信号来自游戏结束时的胜利与否;如果赢了,分配奖励1;输了,分配-1
;而究竟是那些动作导致了输赢却并不明确。因此,强化学习者必须处理
**信用分配问题(credit assignment problem)**
。另一个例子,一个雇员某天被升职;这说明在过去一年中他选择了不少好的动作。想要继续升职,就必须
知道是那些动作导致了这一升职奖励。
强化学习者可能也要处理部分可观察性(partial observability)的问题。即当前的观察结果可能无法反应目前的所有状态(state)。一个扫地机器人发现自己被困在一个衣柜里,而房间中
还有众多一模一样的衣柜
,要推测它的精确位置(即状态),机器人需要将进入衣柜前的观察一并放入考虑因素。
强化学习者可能也要处理部分可观察性(partial observability)的问题。即当前的观察结果可能无法反应目前的所有状态(state)。一个扫地机器人发现自己被困在一个衣柜里,而房间中
所有的衣柜都一模一样
,要推测它的精确位置(即状态),机器人需要将进入衣柜前的观察一并放入考虑因素。
最后,在任何一个特定的时刻,强化学习者可能知道一个好的策略,但也许还有不少更优的策略,智能体从未尝试过。强化学习者必须不断决策,是否
**利用**
目前已知的最佳战略作为策略,还是去
**探索**
其它策略而放弃一些短期的奖励,以获得更多的信息。
最后,在任何一个特定的时刻,强化学习者可能知道一个好的策略,但也许还有不少更优的策略,智能体从未尝试过。强化学习者必须不断决策,是否
**利用**
目前已知的最佳战略作为策略,还是去
**探索**
其它策略而放弃一些短期的奖励,以获得更多的信息。
...
...
chapter_crashcourse/ndarray.md
浏览文件 @
7a8a02be
# 使用NDArray来处理数据
# 使用NDArray来处理数据
对于机器学习来说,处理数据往往是万事之开头。它包含两个部分:数据读取和当数据已经在内存里时如何处理。本章将关注后者。我们首先介绍
`NDArray`
,这是MXNet储存和变换数据的主要工具。如果你之前用过
`NumPy`
,你会发现
`NDArray`
和
`NumPy`
的多维数组非常类似。当然,
`NDArray`
提供更多的功能,首先是CPU和GPU的异步计算,其次是自动求导。这两点使得
`NDArray`
能更好地支持机器学习。
对于机器学习来说,处理数据往往是万事之开头。它包含两个部分:(i)数据读取,(ii)数据已经在内存中时如何处理。本章将关注后者。
我们首先介绍
`NDArray`
,这是MXNet储存和变换数据的主要工具。如果你之前用过
`NumPy`
,你会发现
`NDArray`
和
`NumPy`
的多维数组非常类似。当然,
`NDArray`
提供更多的功能,首先是CPU和GPU的异步计算,其次是自动求导。这两点使得
`NDArray`
能更好地支持机器学习。
## 让我们开始
## 让我们开始
我们先介绍最基本的功能。如果你不懂我们用到的数学操作也不用担心,例如按元素加法
,或者正态分布,我们会在之后的章节分别
详细介绍。
我们先介绍最基本的功能。如果你不懂我们用到的数学操作也不用担心,例如按元素加法
、正态分布;我们会在之后的章节分别从数学和代码编写的角度
详细介绍。
我们首先从
`mxnet`
导入
`ndarray`
这个包
我们首先从
`mxnet`
导入
`ndarray`
这个包
...
@@ -12,7 +14,7 @@
...
@@ -12,7 +14,7 @@
from mxnet import ndarray as nd
from mxnet import ndarray as nd
```
```
然后我们创建一个
有3行和4列的2D数组(通常也叫矩阵
),并且把每个元素初始化成0
然后我们创建一个
3行和4列的2D数组(通常也叫
**矩阵**
),并且把每个元素初始化成0
```
{.python .input n=2}
```
{.python .input n=2}
nd.zeros((3, 4))
nd.zeros((3, 4))
...
@@ -31,7 +33,7 @@ x
...
@@ -31,7 +33,7 @@ x
nd.array([[1,2],[2,3]])
nd.array([[1,2],[2,3]])
```
```
我们经常需要创建随机数组,
就是说每个元素的值都是随机采样而来,这个经常被用来初始化模型参数。下面
创建数组,它的元素服从均值0方差1的正态分布。
我们经常需要创建随机数组,
即每个元素的值都是随机采样而来,这个经常被用来初始化模型参数。以下代码
创建数组,它的元素服从均值0方差1的正态分布。
```
{.python .input n=5}
```
{.python .input n=5}
y = nd.random_normal(0, 1, shape=(3, 4))
y = nd.random_normal(0, 1, shape=(3, 4))
...
@@ -76,7 +78,9 @@ nd.exp(y)
...
@@ -76,7 +78,9 @@ nd.exp(y)
nd.dot(x, y.T)
nd.dot(x, y.T)
```
```
## 广播
我们会在之后的线性代数一章讲解这些运算符。
## 形状转换(Broadcasting)
当二元操作符左右两边ndarray形状不一样时,系统会尝试将其复制到一个共同的形状。例如
`a`
的第0维是3,
`b`
的第0维是1,那么
`a+b`
时会将
`b`
沿着第0维复制3遍:
当二元操作符左右两边ndarray形状不一样时,系统会尝试将其复制到一个共同的形状。例如
`a`
的第0维是3,
`b`
的第0维是1,那么
`a+b`
时会将
`b`
沿着第0维复制3遍:
...
@@ -130,7 +134,7 @@ nd.elemwise_add(x, y, out=z)
...
@@ -130,7 +134,7 @@ nd.elemwise_add(x, y, out=z)
id(z) == before
id(z) == before
```
```
如果
可以现有的数组之后不会再用,我们也可以用复制操作符
达到这个目的:
如果
现有的数组不会复用,我们也可以用
`x[:] = x + y`
,或者
`x += y`
达到这个目的:
```
{.python .input n=16}
```
{.python .input n=16}
before = id(x)
before = id(x)
...
@@ -138,6 +142,35 @@ x += y
...
@@ -138,6 +142,35 @@ x += y
id(x) == before
id(x) == before
```
```
## 截取(Slicing)
NXNet NDArray 提供了各种截取方法。截取 x 的 index 为 1、2 的列:
```
{.python .input}
x = nd.arange(0,9).reshape((3,3))
print('x: ', x)
x[1:3]
```
以及直接写入指定位置:
```
{.python .input}
x[1,2] = 9.0
x
```
多维截取:
```
{.python .input}
x = nd.arange(0,9).reshape((3,3))
print('x: ', x)
x[1:2,1:3]
```
多维写入:
```
{.python .input}
x[1:2,1:3] = 9.0
x
```
## 总结
## 总结
ndarray模块提供一系列多维数组操作函数。所有函数列表可以参见
[
NDArray API文档
](
https://mxnet.incubator.apache.org/api/python/ndarray.html
)
。
ndarray模块提供一系列多维数组操作函数。所有函数列表可以参见
[
NDArray API文档
](
https://mxnet.incubator.apache.org/api/python/ndarray.html
)
。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录