diff --git a/new/begin-app-dev-tf-keras/2.md b/new/begin-app-dev-tf-keras/2.md index 81d221707527b6b457105aac9aae2933925b0136..c8e7b3f15690934ab4b2fdc70fd7edad0c2c1af2 100644 --- a/new/begin-app-dev-tf-keras/2.md +++ b/new/begin-app-dev-tf-keras/2.md @@ -213,7 +213,7 @@ $ jupyter notebook ![Activity 3 – Exploring the Bitcoin Dataset and Preparing Data for Model](img/image02_20.jpg) -图 8:笔记本的图像 Activity_3_Exploring_Bitcoin_Dataset.ipynb。 您现在可以与该笔记本进行交互并进行修改。 +图 8:笔记本的图像`Activity_3_Exploring_Bitcoin_Dataset.ipynb`。 您现在可以与该笔记本进行交互并进行修改。 在打开我们的 Jupyter 笔记本电脑之后,现在让我们探索本课程提供的比特币数据。 @@ -249,7 +249,7 @@ $ jupyter notebook ![Activity 3 – Exploring the Bitcoin Dataset and Preparing Data for Model](img/image02_21.jpg) -图 9:来自 close 变量的比特币收盘价的时间序列图。 重现此图,但在此图下面的新单元格中使用 volume 变量。 +图 9:来自`close`变量的比特币收盘价的时间序列图。 重现此图,但在此图下面的新单元格中使用`volume`变量。 您肯定会注意到这两个变量在 2017 年都在激增。这反映了当前的现象,即比特币的价格和价值自该年年初以来一直在持续增长。 @@ -275,7 +275,7 @@ bitcoin_recent = bitcoin[bitcoin['date'] >= '2016-01-01'] 在包含本课程的同一目录中,我们放置了一个名为`normalizations.py`的脚本。 该脚本包含本课中描述的三种标准化技术。 我们将该脚本导入到 Jupyter 笔记本中,并将这些功能应用于我们的系列。 -导航到“为模型准备数据集”部分。 现在,使用`iso_week`变量使用 pandas 方法`groupby()`将给定一周中的全天观察分组。 现在,我们可以在一周内将归一化函数`normalizations.point_relative_normalization()`直接应用于该系列。 我们使用以下命令将该归一化的输出存储为同一Pandas数据框中的新变量: +导航到“为模型准备数据集”部分。 现在,使用`iso_week`变量使用 pandas 方法`groupby()`将给定一周中的全天观察分组。 现在,我们可以在一周内将归一化函数`normalizations.point_relative_normalization()`直接应用于该系列。 我们使用以下命令将该归一化的输出存储为同一 Pandas 数据帧中的新变量: ```py bitcoin_recent['close_point_relative_normalization'] = @@ -293,7 +293,7 @@ lambda x: normalizations.point_relative_normalization(x)) ![Activity 3 – Exploring the Bitcoin Dataset and Preparing Data for Model](img/image02_25.jpg) -图 13:显示归一化变量 close_point_relative_normalization 的序列的图 +图 13:显示归一化变量`close_point_relative_normalization`的序列的图 为了评估模型的效果,我们需要对照其他数据测试其准确性。 为此,我们创建了两个数据集:训练集和测试集。 在本活动中,我们将使用 80% 的数据集训练 LSTM 模型,并使用 20% 的数据评估其性能。 @@ -403,7 +403,7 @@ model.predict(x=X_train) ![Model Components](img/image02_27.jpg) -图 15:Keras 神经网络范例:A.设计神经网络架构,B.训练神经网络(或 Fit),以及 C.进行预测 +图 15:Keras 神经网络范例:A. 设计神经网络架构,B. 训练神经网络(或拟合),以及 C. 进行预测 Keras 允许在每个步骤中进行更大的控制。 但是,其重点是使用户在尽可能短的时间内尽可能轻松地创建神经网络。 这意味着我们可以从一个简单的模型开始,然后在上述每个步骤中增加复杂性,以使初始模型的性能更好。 @@ -478,15 +478,15 @@ model.save('bitcoin_lstm_v0.h5') ![Training a Neural Network](img/image02_29.jpg) -图 17:该表显示了从 train_d–ataset.csv 文件加载的训练数据集的前五行 +图 17:该表显示了从`train_d–ataset.csv`文件加载的训练数据集的前五行 自 2016 年初以来,我们将使用变量`close_point_relative_normalization`的序列,该序列是变量`close`的归一化比特币收盘价序列。 -变量`close_point_relative_normalization`已每周标准化。 该周期间的每个观察值都是相对于该期间第一天收盘价的差额进行的。 标准化步骤很重要,将有助于我们的网络训练更快。 +变量`close_point_relative_normalization`已每周标准化。 该周的周期的每个观察值都是相对于该周期第一天收盘价的差额进行的。 标准化步骤很重要,将有助于我们的网络训练更快。 ![Training a Neural Network](img/image02_25.jpg) -> 图 18:显示归一化变量 close_point_relative_normalization 的序列的图。 此变量将用于训练我们的 LSTM 模型。 +> 图 18:显示归一化变量`close_point_relative_normalization`的序列的图。 此变量将用于训练我们的 LSTM 模型。 ### 重塑时间序列数据 @@ -516,7 +516,7 @@ LSTM 网络使用三维张量。 这些维度中的每一个都代表了网络 目前,来自变量`close_point_relative_normalization`的数据是一维向量,我们需要对其进行重塑以匹配这三个维度。 -我们将以一周的时间为。 因此,我们的期间长度为 7 天(期间长度= 7)。 我们的数据中有 77 个完整的星期可用。 在训练期间,我们将使用这周的最后一周来测试我们的模型。 这给我们留下了 76 个不同的星期(周期数= 76)。 最后,我们将在此网络中使用单个功能(功能数量= 1)-将来的版本中将包含更多功能。 +我们将以一周的时间为。 因此,我们的周期长度为 7 天(周期长度为 7)。 我们的数据中有 77 个完整的星期可用。 在训练期间,我们将使用这周的最后一周来测试我们的模型。 这给我们留下了 76 个不同的星期(周期数为 76)。 最后,我们将在此网络中使用单个功能(功能数量为 1)-将来的版本中将包含更多功能。 我们如何重塑数据以匹配这些维度? 我们将结合使用基本的 Python 属性和`numpy`库中的`reshape()`。 首先,我们使用纯 Python 创建 76 个不同的星期组,每个星期 7 天: @@ -598,7 +598,7 @@ LSTM 是计算上昂贵的模型。 在现代计算机上,我们最多可能 ![Activity 5 – Assembling a Deep Learning System](img/image02_32.jpg) - 图 21:显示归一化变量 close_point_relative_normalization 的序列的图 + 图 21:显示归一化变量`close_point_relative_normalization`的序列的图 ### 注意 @@ -618,7 +618,7 @@ LSTM 是计算上昂贵的模型。 在现代计算机上,我们最多可能 train.head() ``` - 如本课程中所述,LSTM 网络需要具有三个维度的张量。 这些维度是:期间长度,期间数和特征数。 + 如本课程中所述,LSTM 网络需要具有三个维度的张量。 这些维度是:周期长度,周期数和特征数。 现在,继续创建每周组,然后重新排列结果数组以匹配这些尺寸。 diff --git a/new/begin-app-dev-tf-keras/3.md b/new/begin-app-dev-tf-keras/3.md index c10ba01fb64bf3e1bb797c7455bb791f06950f6a..9842fe4d5ac63ee200eb8a1ad89fdaf27a754d4e 100644 --- a/new/begin-app-dev-tf-keras/3.md +++ b/new/begin-app-dev-tf-keras/3.md @@ -214,9 +214,9 @@ Keras 提供了`model.evaluate(),`方法,该方法使针对测试集评估训 我们的首先训练网络(`bitcoin_lstm_v0`)可能正遭受一种称为*过拟合*的现象。 过拟合是指训练模型来优化验证集的方法,但是这样做会以我们有意预测的现象为基础,更笼统的模式为代价。 过拟合的主要问题是模型学习了如何预测验证集,但无法预测新数据。 -在训练过程结束时,模型中使用的损失函数达到非常低的水平(约 2.9 * 10-6)。 不仅如此,而且这种情况发生得很早:用于预测我们数据最后一周的 MSE 损失函数在大约第 30 个时期下降到一个稳定的平台。这意味着我们的模型几乎可以完美地预测第 77 周的数据, 76 周。 这可能是过拟合的结果吗? +在训练过程结束时,模型中使用的损失函数达到非常低的水平(约`2.9 * 10-6`)。 不仅如此,而且这种情况发生得很早:用于预测我们数据最后一周的 MSE 损失函数在大约第 30 个时期下降到一个稳定的平台。这意味着我们的模型几乎可以完美地预测第 77 周的数据, 76 周。 这可能是过拟合的结果吗? -让我们再次看图 4。 我们知道,我们的 LSTM 模型在验证集中达到极低的值(约 2.9 * 10-6),但在测试集中也达到极低的值。 但是,关键的区别在于规模。 我们的测试集中每周的 MSE 大约是测试集中平均水平的 4,000 倍。 这意味着该模型在我们的测试数据中比在验证集中的性能要差得多。 这值得考虑。 +让我们再次看图 4。 我们知道,我们的 LSTM 模型在验证集中达到极低的值(约`2.9 * 10-6`),但在测试集中也达到极低的值。 但是,关键的区别在于规模。 我们的测试集中每周的 MSE 大约是测试集中平均水平的 4,000 倍。 这意味着该模型在我们的测试数据中比在验证集中的性能要差得多。 这值得考虑。 但是,规模隐藏了我们 LSTM 模型的力量:即使在我们的测试集中表现更差,预测的 MSE 误差仍然非常非常低。 这表明我们的模型可能是从数据中学习模式。 @@ -237,7 +237,7 @@ Keras 提供了`model.evaluate(),`方法,该方法使针对测试集评估训 predicted_weeks.append(B.predict(input_series)) ``` -> 片段 5:使用 model.predict()方法对测试数据集的所有星期进行预测的片段 +> 片段 5:使用`model.predict()`方法对测试数据集的所有星期进行预测的片段 在前面的代码中,我们使用`model.predict(),`进行预测,然后将这些预测存储在`predicted_weeks`变量中。 然后,我们绘制结果预测,如下图所示: @@ -266,7 +266,7 @@ Keras 提供了`model.evaluate(),`方法,该方法使针对测试集评估训 lambda x: denormalize(observed, x)) ``` -> “代码段 6”:使用反向点相对归一化技术对数据进行归一化。 denormalize()函数从测试的等效一周的第一天起收取第一个收盘价。 +> “代码段 6”:使用反向点相对归一化技术对数据进行归一化。 `denormalize()`函数从测试的等效一周的第一天起收取第一个收盘价。 现在,我们的结果使用美元将预测值与测试集进行比较。 从“图 5”中可以看出,`bitcoin_lstm_v0` 模型在预测接下来的 7 天比特币价格时似乎表现良好。 但是,我们如何用可解释的术语衡量绩效呢? @@ -321,7 +321,7 @@ return np.mean(np.abs((A - B) / A)) * 100 ![Activity 6 – Creating an Active Training Environment](img/image03_13.jpg) - 图 7:Jupyter 笔记本突出显示``评估 LSTM 模型''部分 + 图 7:Jupyter 笔记本突出显示“评估 LSTM 模型”部分 3. 同样在您的终端机上,通过执行以下命令来启动 TensorBoard 实例: @@ -357,7 +357,7 @@ return np.mean(np.abs((A - B) / A)) * 100 ![Activity 6 – Creating an Active Training Environment](img/image03_07.jpg) - 图 8:模型 set.evaluate()方法对测试集每周的 MSE 结果 + 图 8:模型`set.evaluate()`方法对测试集每周的 MSE 结果 正如我们在本课程中讨论的那样,MSE 损失函数很难解释。 为了促进我们对模型性能的理解,我们还每周在测试集中调用方法`model.predict()`,并将其预测结果与该集的值进行比较。 @@ -374,7 +374,7 @@ return np.mean(np.abs((A - B) / A)) * 100 ![Activity 6 – Creating an Active Training Environment](img/image03_09.jpg) - 图 9:绘制测试集每个星期从 model.predict()返回的归一化值 + 图 9:绘制测试集每个星期从`model.predict()`返回的归一化值 我们还将进行相同的比较,但使用非标准化值。 为了使我们的数据不规范,我们必须首先确定测试集和预测之间的等效周。 然后,我们获取该周的第一个价格值,并使用它来逆转“第 2 课,模型架构”中的点相对标准化方程。 @@ -390,7 +390,7 @@ return np.mean(np.abs((A - B) / A)) * 100 ![Activity 6 – Creating an Active Training Environment](img/image03_11.jpg) - 图 10:绘制测试集每个星期从 model.predict()返回的归一化值 + 图 10:绘制测试集每个星期从`model.predict()`返回的归一化值 LSTM 网络使用 MSE 值作为其损耗函数。 但是,正如课程中所讨论的,MSE 值难以解释。 为了解决这个问题,我们实现了两个功能(从脚本`utilities.py`加载),它们实现了功能 RMSE 和 MAPE。 这些函数通过返回与原始数据相同的比例尺的度量值,并比较比例尺的百分比差异,从而为我们的模型增加了可解释性。 @@ -461,7 +461,7 @@ return np.mean(np.abs((A - B) / A)) * 100 ##### 添加更多节点 -图层所需的神经元数量与输入和输出数据的结构方式有关。 例如,如果您要将 4 x 4 像素图像分为两类之一,则可以从一个具有 12 个神经元的隐藏层(每个可用像素一个)和一个只有两个神经元的输出层开始(一个用于 每个预测的课程)。 +图层所需的神经元数量与输入和输出数据的结构方式有关。 例如,如果您要将`4 x 4`像素图像分为两类之一,则可以从一个具有 12 个神经元的隐藏层(每个可用像素一个)和一个只有两个神经元的输出层开始(一个用于 每个预测的课程)。 通常在添加新层的同时添加新神经元。 然后,可以添加一层具有与前一层相同数量的神经元,或者是前一层的神经元数量的倍数的层。 例如,如果您的第一个隐藏层具有 12 个神经元,则可以尝试添加第二个具有 12、6 或 24 个层的神经元。 @@ -551,7 +551,7 @@ TensorFlow 和 Keras 提供了许多激活函数-偶尔会添加新的激活函 ### 注意 -本部分的灵感来自 Avinash Sharma V 撰写的文章[《了解神经网络中的激活函数》](https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0),该文章可从获得启发。 +本部分的灵感来自 Avinash Sharma 撰写的文章[《了解神经网络中的激活函数》](https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0),该文章可从获得启发。 ###### 线性(身份) @@ -573,7 +573,7 @@ TensorFlow 和 Keras 提供了许多激活函数-偶尔会添加新的激活函 ![Hyperbolic Tangent (Tanh)](img/image03_22.jpg) -表示将连续评估它们对节点的影响。 同样,由于其非线性,可以使用此功能来更改一层如何影响链中的下一层。 使用非线性函数时,图层会以不同的方式激活神经元,从而使从数据中学习不同的表示更为容易。 但是,它们具有类似于 S 形的图案,可反复惩罚极端节点值,从而导致称为的问题,即消失梯度。 消失的梯度对网络的学习能力产生负面影响: +表示将连续评估它们对节点的影响。 同样,由于其非线性,可以使用此功能来更改一层如何影响链中的下一层。 使用非线性函数时,图层会以不同的方式激活神经元,从而使从数据中学习不同的表示更为容易。 但是,它们具有类似于 Sigmoid 的图案,可反复惩罚极端节点值,从而导致称为的问题,即消失梯度。 消失的梯度对网络的学习能力产生负面影响: ![Hyperbolic Tangent (Tanh)](img/image03_24.jpg) @@ -630,7 +630,7 @@ ReLU 具有非线性属性。 它们的定义是: 神经网络特别容易过拟合。 当网络学习训练数据的模式但无法找到也可以应用于测试数据的可推广模式时,就会发生过拟合。 -正则化策略是指通过调整网络学习方式来解决过拟合问题的技术。 在本书中,我们讨论两种常见的策略:L2 和 Dropout。 +正则化策略是指通过调整网络学习方式来解决过拟合问题的技术。 在本书中,我们讨论两种常见的策略:L2 和丢弃。 ###### L2 正则化 @@ -638,9 +638,9 @@ L2 正则化(或权重衰减)是用于处理过拟合模型的常见技术 L2 正则化使用![L2 Regularization](img/image03_28.jpg)参数来确定对模型神经元的惩罚程度。 通常将其设置为一个非常低的值(即`0.0001`); 否则,就有可能完全消除给定神经元的输入。 -###### 辍学 +###### 丢弃 -辍学是一种基于简单问题的正则化技术:如果一个节点随机地从层中删除一部分节点,那么另一个节点将如何适应? 事实证明,其余的神经元会适应,学会代表先前由缺失的那些神经元处理过的模式。 +丢弃是一种基于简单问题的正则化技术:如果一个节点随机地从层中删除一部分节点,那么另一个节点将如何适应? 事实证明,其余的神经元会适应,学会代表先前由缺失的那些神经元处理过的模式。 退出策略易于实现,通常非常有效地避免过拟合。 这将是我们首选的正则化。 @@ -674,7 +674,7 @@ L2 正则化使用![L2 Regularization](img/image03_28.jpg)参数来确定对模 > “代码段 11”:在此代码段中,我们将`Dropout()`步骤添加到模型`(bitcoin_lstm_v3)`中,使其设为`bitcoin_lstm_v4` -可以使用 L2 正则化代替 Dropout。 为此,只需实例化`ActivityRegularization()`类,并将`L2`参数设置为较低的值(例如`0.0001,`)。 然后,将其放置在`Dropout()`类添加到网络的位置。 随时进行测试,只需将其添加到网络中,同时保持`Dropout()`的两个步骤,或者直接将所有`Dropout()`实例替换为`ActivityRegularization()`。 +可以使用 L2 正则化代替丢弃。 为此,只需实例化`ActivityRegularization()`类,并将`L2`参数设置为较低的值(例如`0.0001,`)。 然后,将其放置在`Dropout()`类添加到网络的位置。 随时进行测试,只需将其添加到网络中,同时保持`Dropout()`的两个步骤,或者直接将所有`Dropout()`实例替换为`ActivityRegularization()`。 ###### 优化结果 @@ -709,7 +709,7 @@ MAPE(整个系列) | `bitcoin_lstm_v1` | 7.15*10-6 | 419.3 | 8.8% | 49.3 秒 | | `bitcoin_lstm_v2` | 3.55*10-6 | 425.4 | 9.0% | 1 分 13 秒 | | `bitcoin_lstm_v3` | 2.8*10-4 | 423.9 | 8.8% | 1 分 19 秒 | -| `bitcoin_lstm_v4` | 4.8*10-7 | 442.4 | 9.4% | 1 分钟 20 秒 | +| `bitcoin_lstm_v4` | 4.8*10-7 | 442.4 | 9.4% | 1 分 20 秒 | > 表 2:所有模型的模型结果 diff --git a/new/begin-app-dev-tf-keras/4.md b/new/begin-app-dev-tf-keras/4.md index fa99af9ed25cfc613537691d2cd3841cfbb0f94e..2da183d8b99a4d0f51346fe9134af5c625b76541 100644 --- a/new/begin-app-dev-tf-keras/4.md +++ b/new/begin-app-dev-tf-keras/4.md @@ -27,7 +27,7 @@ 按照该建议,我们将使用两个类来帮助我们构建 Web 应用程序:`CoinMarketCap()`和`Model()`: -* `CoinMarketCap()`:此是[用于从以下网站获取比特币价格的类](http://www.coinmarketcap.com)。 这就是我们原始比特币数据来自的地方。 通过此类,可以轻松地定期检索该数据,并返回带有已解析记录和所有可用历史数据的 Pandas DataFrame。 `CoinMarketCap()`是我们的数据组件。 +* `CoinMarketCap()`:此是[用于从以下网站获取比特币价格的类](http://www.coinmarketcap.com)。 这就是我们原始比特币数据来自的地方。 通过此类,可以轻松地定期检索该数据,并返回带有已解析记录和所有可用历史数据的 Pandas 数据帧。 `CoinMarketCap()`是我们的数据组件。 * `Model()`:此类将到目前为止已编写的所有代码实现为一个类。 该类提供了与我们先前训练的模型进行交互的工具,并且还允许使用非规范化数据进行预测,这更容易理解。 `Model()`类是我们的模型组件。 这两个类在我们的示例应用程序中得到了广泛使用,并定义了数据和模型组件。 @@ -50,9 +50,9 @@ r = requests.get(url) ``` -> “代码段 1”:`CoinMarketCap()`类中的`historic()`方法。 此方法从 CoinMarketCap 网站收集数据,对其进行解析,然后返回 Pandas DataFrame。 +> “代码段 1”:`CoinMarketCap()`类中的`historic()`方法。 此方法从 CoinMarketCap 网站收集数据,对其进行解析,然后返回 Pandas 数据帧。 -`historic()`类返回一个Pandas`DataFrame`,准备由`Model()`类使用。 +`historic()`类返回一个 Pandas `DataFrame`,准备由`Model()`类使用。 当在其他模型中工作时,请考虑创建实现与`CoinMarketCap()`类相同功能的程序组件(例如 Python 类)。 也就是说,创建一个组件,该组件将从可用数据中获取数据,解析该数据,并以可用格式将其提供给您的建模组件。 @@ -191,7 +191,7 @@ M.train(model_data[i*7:7*(40 + i) + 7]) $ historic_data = CoinMarketCap.historic() ``` - 现在,变量`historic_data`填充有一个 Pandas DataFrame,其中包含截至今天或昨天的数据。 这很棒,可以在有更多数据时更容易地重新训练模型。 + 现在,变量`historic_data`填充有一个 Pandas 数据帧,其中包含截至今天或昨天的数据。 这很棒,可以在有更多数据时更容易地重新训练模型。 数据实际上包含了与我们之前的数据集相同的变量。 但是,许多数据来自较早时期。 与几年前的价格相比,最近的比特币价格已经大幅波动。 在模型中使用此数据之前,请确保将其过滤为 2017 年 1 月 1 日之后的日期。 @@ -201,7 +201,7 @@ M.train(model_data[i*7:7*(40 + i) + 7]) $ model_data = # filter the dataset using pandas here ``` - 您应该能够通过使用 date 变量作为过滤索引来做到这一点。 在继续之前,请确保已过滤数据。 + 您应该能够通过使用日期变量作为过滤索引来做到这一点。 在继续之前,请确保已过滤数据。 类`Model()`编译到目前为止我们在所有活动中编写的所有代码。 在本活动中,我们将使用该类来构建,训练和评估我们的模型。 @@ -272,7 +272,7 @@ M.train(model_data[i*7:7*(40 + i) + 7]) ###### 将模型部署为 Web 应用程序 -在此部分中,我们将模型部署为 Web 应用程序。 我们将使用一个名为“ `cryptonic`”的示例 Web 应用程序来部署我们的模型,探索其架构,以便将来进行修改。 目的是让您将此应用程序用作更复杂应用程序的入门程序; 可以正常工作的启动器,可以根据需要扩展。 +在此部分中,我们将模型部署为 Web 应用程序。 我们将使用一个名为`cryptonic`的示例 Web 应用程序来部署我们的模型,探索其架构,以便将来进行修改。 目的是让您将此应用程序用作更复杂应用程序的入门程序; 可以正常工作的启动器,可以根据需要扩展。 除了熟悉 Python 外,本主题还假定您熟悉创建 Web 应用程序。 具体来说,我们假设您对 Web 服务器,路由,HTTP 协议和缓存有所了解。 无需广泛了解这些主题,您就可以在本地部署演示的密码应用程序,但是学习这些主题将使将来的开发变得更加容易。 @@ -282,26 +282,13 @@ M.train(model_data[i*7:7*(40 + i) + 7]) 为了部署我们的 Web 应用程序,我们将使用“表 1”中描述的工具和技术。 Flask 是关键,因为它有助于我们为模型创建 HTTP 接口,从而使我们能够访问 HTTP 端点(例如`/predict`)并以通用格式接收数据。 之所以使用其他组件,是因为它们是开发 Web 应用程序时的流行选择: -