From 37cd0f77aea2d601f9664f9ec943de220568b95d Mon Sep 17 00:00:00 2001 From: Mu Li Date: Fri, 17 Jul 2020 19:08:52 -0700 Subject: [PATCH] more --- chapter_preliminaries/ndarray.md | 19 +++++++++-------- chapter_preliminaries/ndarray_origin.md | 2 +- chapter_preliminaries/pandas.md | 12 ++++++----- chapter_preliminaries/pandas_origin.md | 2 +- setup.py | 14 ++----------- setup_origin.py | 28 +++++++++++++++++++++++++ 6 files changed, 49 insertions(+), 28 deletions(-) create mode 100644 setup_origin.py diff --git a/chapter_preliminaries/ndarray.md b/chapter_preliminaries/ndarray.md index 9ea5ab1cc..2c8050039 100644 --- a/chapter_preliminaries/ndarray.md +++ b/chapter_preliminaries/ndarray.md @@ -94,7 +94,7 @@ x = tf.reshape(x, (3, 4)) x ``` -通过手动指定每个尺寸进行重塑是不必要的。如果我们的目标形状是一个具有形状(高度,宽度)的矩阵,那么在我们知道宽度之后,高度会隐式给出。我们为什么要自己执行分裂?在上面的样本中,为了获得包含 3 行的矩阵,我们指定了它应该有 3 行和 4 列。幸运的是,张量可以自动计算出一个维度,给出其余部分。我们通过为我们希望张量自动推断的维度放置 `-1` 来调用此功能。在我们的例子中,我们可以等效地称为 `x.reshape(-1, 4)` 或 `x.reshape(3, -1)`,而不是调用 `x.reshape(3, 4)`。 +通过手动指定每个尺寸进行重塑是不必要的。如果我们的目标形状是一个具有形状(高度,宽度)的矩阵,那么在我们知道宽度之后,高度会隐式给出。我们为什么要自己执行分裂?在上面的样本中,为了获得包含 3 行的矩阵,我们指定了它应该有 3 行和 4 列。幸运的是,张量可以自动计算出一个维度,给出其余部分。我们通过为我们希望张量自动推断的维度放置 `-1` 来调用此功能。在我们的例子中,我们可以等同地调用 `x.reshape(3, 4)`,而不是调用 `x.reshape(-1, 4)` 或 `x.reshape(3, -1)`。 通常,我们希望我们的矩阵初始化为零,一,一些其他常量,或者从特定分布中随机采样的数字。我们可以创建一个表示张量的张量,所有元素都设置为 0,形状为 (2,3,4),如下所示: @@ -164,9 +164,9 @@ tf.constant([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) 这本书不是关于软件工程。我们的兴趣不仅仅限于从数组读取和写入数据。我们想在这些数组上执行数学运算。一些最简单和最有用的操作是 * 元素 * 操作。它们将标准标量运算应用于数组的每个元素。对于将两个数组作为输入的函数,元素运算将一些标准的二进制运算符应用于两个数组中的每对相应元素。我们可以从任何从标量映射到标量的函数创建一个元素函数。 -在数学表示法中,我们将通过签名 $f: \mathbb{R} \rightarrow \mathbb{R}$ 来表示这样的 * 一个 * 标量运算符(获取一个输入)。这只是意味着该函数从任何实数($\mathbb{R}$)映射到另一个实数。同样,我们通过签名 $f: \mathbb{R}, \mathbb{R} \rightarrow \mathbb{R}$ 表示一个 * 二进制 * 标量运算符(取两个实际输入,并产生一个输出)。给定任意两个向量 $\mathbf{u}$ 和 $c_i \gets f(u_i, v_i)$2 * 具有相同形状 *,以及二进制运算符 $c_i \gets f(u_i, v_i)$0,我们可以通过为所有 $i$ 设置 $c_i \gets f(u_i, v_i)$ 来生成一个向量 $\mathbf{c} = F(\mathbf{u},\mathbf{v})$,其中 $c_i, u_i$ 和 $c_i \gets f(u_i, v_i)$3 是矢量的 $i^\mathrm{th}$ 元素。在这里,我们通过 * 将标量函数提升到元素向量操作来生成矢量值 $c_i \gets f(u_i, v_i)$1。 +在数学表示法中,我们将通过签名 $\mathbf{v}$3 来表示这样的 * 一个 * 标量运算符(获取一个输入)。这只是意味着该函数从任何实数($\mathbf{v}$0)映射到另一个实数。同样,我们通过签名 $f: \mathbb{R}, \mathbb{R} \rightarrow \mathbb{R}$ 表示一个 * 二进制 * 标量运算符(取两个实际输入,并产生一个输出)。给定任意两个向量 $\mathbf{u}$ 和 $\mathbf{v}$ * 具有相同形状 *,以及二进制运算符 $f$,我们可以通过为所有 $i$ 设置 $\mathbf{v}$1 来生成一个向量 $\mathbf{c} = F(\mathbf{u},\mathbf{v})$,其中 $c_i, u_i$ 和 $v_i$ 是矢量的 $i^\mathrm{th}$ 元素。在这里,我们通过 * 将标量函数提升到元素向量操作来生成矢量值 $F: \mathbb{R}^d, \mathbb{R}^d \rightarrow \mathbb{R}^d$。 -对于任意形状的相同形状张量,常见的标准算术运算符(`+`、`-`、`*`、`/` 和 `**`)都已 * 提升 * 为元素运算。我们可以在同一形状的任何两个张量上调用元素操作。在下面的样本中,我们使用逗号来制定一个 5 元素元组,其中每个元素都是元素操作的结果。 +对于任意形状的相同形状张量,常见的标准算术运算符(`+`、`-`、`*`、`/` 和 `**`)都已 * 提升 * 为元素运算符。我们可以在同一形状的任何两个张量上调用元素操作。在下面的样本中,我们使用逗号来制定一个 5 元素元组,其中每个元素都是元素操作的结果。 ```{.python .input} x = np.array([1, 2, 4, 8]) @@ -330,7 +330,7 @@ x_var[0:2,:].assign(tf.ones(x_var[0:2,:].shape, dtype = tf.float32)*12) x_var ``` -## 节省内存 +## 保存内存 运行操作可能会导致将新内存分配给主机结果。样本如,如果我们编写 `y = x + y`,我们将取消引用 `y` 用来指向的张量,而是指向新分配的内存处的 `y`。在下面的样本中,我们使用 Python 的 `id()` 函数演示了这一点,该函数给了我们内存中引用对象的确切地址。运行 `y = y + x` 后,我们会发现 `id(y)` 指向另一个位置。这是因为 Python 首先评估 `y + x`,为结果分配新的内存,然后使 `y` 指向内存中的这个新位置。 @@ -344,7 +344,7 @@ id(y) == before 这可能是不可取的,原因有两个。首先,我们不想一直不必要地分配内存。在机器学习中,我们可能有数百兆字节的参数,并且每秒多次更新所有参数。通常情况下,我们希望执行这些更新 * 到位。其次,我们可以指向来自多个变量的相同参数。如果我们不更新,其他引用仍然会指向旧的内存位置,这样我们的代码中的一部分可能会无意中引用陈旧的参数。 :begin_tab:`mxnet, pytorch` -幸运的是,执行就地操作非常简单。我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如 `y [:] = `。为了说明这一概念,我们首先创建一个新的矩阵 `z`,其形状与另一个 `y` 相同,使用 `zeros_like` 来分配一个 $0$ 条目的块。 +幸运的是,执行就地操作非常简单。我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如 `y[:] = `。为了说明这一概念,我们首先创建一个新的矩阵 `z`,其形状与另一个 `y` 相同,使用 `zeros_like` 来分配一个 $0$ 条目的块。 :end_tab: :begin_tab:`tensorflow` @@ -455,16 +455,17 @@ a, a.item(), float(a), int(a) ## 练习 -1.运行本节中的代码。将本节中的条件语句 `x == y` 更改为 `x < y` or `x > y`,然后看看你可以得到什么样的张量。1.用其他形状(例如三维张量)替换广播机构中按元件操作的两个张量。结果是否与预期相同? +1. 运行本节中的代码。将本节中的条件语句 `x == y` 更改为 `x < y` 或 `x > y`,然后查看您可以获得哪种张量。 +1. 用其他形状(例如三维张量)替换广播机构中按元件操作的两个张量。结果是否与预期相同? :begin_tab:`mxnet` -[讨论](https://discuss.d2l.ai/t/26) +[Discussions](https://discuss.d2l.ai/t/26) :end_tab: :begin_tab:`pytorch` -[讨论](https://discuss.d2l.ai/t/27) +[Discussions](https://discuss.d2l.ai/t/27) :end_tab: :begin_tab:`tensorflow` -[讨论](https://discuss.d2l.ai/t/187) +[Discussions](https://discuss.d2l.ai/t/187) :end_tab: diff --git a/chapter_preliminaries/ndarray_origin.md b/chapter_preliminaries/ndarray_origin.md index 10e1b62fe..6968f0e5a 100644 --- a/chapter_preliminaries/ndarray_origin.md +++ b/chapter_preliminaries/ndarray_origin.md @@ -1,6 +1,6 @@ --- source: https://github.com/d2l-ai/d2l-en/blob/master/chapter_preliminaries/ndarray.md -commit: c991159 +commit: 9e55a9c --- # Data Manipulation diff --git a/chapter_preliminaries/pandas.md b/chapter_preliminaries/pandas.md index 9f97461c6..0624aba04 100644 --- a/chapter_preliminaries/pandas.md +++ b/chapter_preliminaries/pandas.md @@ -95,22 +95,24 @@ X, y ## 摘要 -* 与 Python 生态系统中的许多其他扩展包一样,`pandas` 可以与张量一起工作。* 插入和删除可以用于处理丢失的数据。 +* 像庞大的 Python 生态系统中的许多其他扩展包一样,`pandas` 可以与张量一起工作。 +* 输入和删除可用于处理丢失的数据。 ## 练习 创建包含更多行和列的原始数据集。 -1.删除缺失值最多的列。2.将预处理的数据集转换为张量格式。 +1. 删除缺失值最多的列。 +2. 将预处理的数据集转换为张量格式。 :begin_tab:`mxnet` -[讨论](https://discuss.d2l.ai/t/28) +[Discussions](https://discuss.d2l.ai/t/28) :end_tab: :begin_tab:`pytorch` -[讨论](https://discuss.d2l.ai/t/29) +[Discussions](https://discuss.d2l.ai/t/29) :end_tab: :begin_tab:`tensorflow` -[讨论](https://discuss.d2l.ai/t/195) +[Discussions](https://discuss.d2l.ai/t/195) :end_tab: diff --git a/chapter_preliminaries/pandas_origin.md b/chapter_preliminaries/pandas_origin.md index 7ac6559e3..63857c3fd 100644 --- a/chapter_preliminaries/pandas_origin.md +++ b/chapter_preliminaries/pandas_origin.md @@ -1,6 +1,6 @@ --- source: https://github.com/d2l-ai/d2l-en/blob/master/chapter_preliminaries/pandas.md -commit: c991159 +commit: 9e55a9c --- # Data Preprocessing diff --git a/setup.py b/setup.py index 43cdfc47a..de765a355 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ from setuptools import setup, find_packages -import re -import os +import d2l requirements = [ 'jupyter', @@ -9,18 +8,9 @@ 'pandas' ] -# don't import d2l to get __version__ since it has deps -ver_re = re.compile("__version__ = \"([\.\d]+).*") -with open(os.path.join('d2l','__init__.py')) as f: - lines = f.readlines() -for l in lines: - m = ver_re.match(l) - if m: - version = m.group(1) - break setup( name='d2l', - version=version, + version=d2l.__version__, python_requires='>=3.5', author='D2L Developers', author_email='d2l.devs@gmail.com', diff --git a/setup_origin.py b/setup_origin.py new file mode 100644 index 000000000..8af9cf907 --- /dev/null +++ b/setup_origin.py @@ -0,0 +1,28 @@ +--- +source: https://github.com/d2l-ai/d2l-en/blob/master/setup.py +commit: 9e55a9c +--- + +from setuptools import setup, find_packages +import d2l + +requirements = [ + 'jupyter', + 'numpy', + 'matplotlib', + 'pandas' +] + +setup( + name='d2l', + version=d2l.__version__, + python_requires='>=3.5', + author='D2L Developers', + author_email='d2l.devs@gmail.com', + url='https://d2l.ai', + description='Dive into Deep Learning', + license='MIT-0', + packages=find_packages(), + zip_safe=True, + install_requires=requirements, +)