提交 6712f901 编写于 作者: W wizardforcel

2020-12-28 22:27:03

上级 6a051be6
......@@ -276,7 +276,7 @@ ReLU 的限制条件之一是其输入负值的零梯度。 这可能会减慢
# 循环神经网络(RNN)
**循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的功能,因此名称中的术语为**循环**。 下图说明了 RNN 的架构:
**循环神经网络****RNN**)在处理顺序或时间数据时非常有用,其中给定实例或位置的数据与先前时间步长或位置中的数据高度相关。 RNN 在处理文本数据方面已经非常成功,因为给定实例中的单词与它前面的单词高度相关。 在 RNN 中,网络在每个时间步执行相同的函数,因此名称中的术语为**循环**。 下图说明了 RNN 的架构:
![](img/0c426b93-140c-48a7-b982-e649cbaac4e3.png)
......@@ -472,7 +472,7 @@ Figure 1.14: GAN architecture 
![](img/673b706b-7aa2-488e-851d-860dffe3abfb.png)
图 1.17:深度 Q 学习功能近似器网络
图 1.17:深度 Q 学习函数近似器网络
在本书中,我们将使用强化学习来训练赛车,以通过深度 Q 学习自行驾驶。
......@@ -480,9 +480,9 @@ Figure 1.14: GAN architecture 
通常,**迁移学习**是指使用在一个领域中获得的知识来解决另一领域中的相关问题的概念。 但是,在深度学习中,它专门指的是将针对特定任务训练的神经网络重新用于不同领域中的相似任务的过程。 新任务使用从先前任务中学到的特征检测器,因此我们不必训练模型就可以学习它们。
由于不同层之间的连接模式的性质,深度学习模型倾向于具有大量参数。 要训​​练这么大的模型,需要大量的数据; 否则,模型可能会过拟合。 对于许多需要深度学习解决方案的问题,将无法获得大量数据。 例如,在用于对象识别的图像处理中,深度学习模型提供了最新的解决方案。 在这种情况下,可以基于从现有的经过训练的深度学习模型中学习到的特征检测器,使用迁移学习来创建特征。 然后,这些功能可用于使用可用数据构建简单模型,以解决当前的新问题。 因此,新模型需要学习的唯一参数是与构建简单模型有关的参数,从而减少了过拟合的机会。 通常在大量数据上训练预训练的模型,因此,它们具有作为特征检测器的可靠参数。
由于不同层之间的连接模式的性质,深度学习模型倾向于具有大量参数。 要训​​练这么大的模型,需要大量的数据; 否则,模型可能会过拟合。 对于许多需要深度学习解决方案的问题,将无法获得大量数据。 例如,在用于对象识别的图像处理中,深度学习模型提供了最新的解决方案。 在这种情况下,可以基于从现有的经过训练的深度学习模型中学习到的特征检测器,使用迁移学习来创建特征。 然后,这些特征可用于使用可用数据构建简单模型,以解决当前的新问题。 因此,新模型需要学习的唯一参数是与构建简单模型有关的参数,从而减少了过拟合的机会。 通常在大量数据上训练预训练的模型,因此,它们具有作为特征检测器的可靠参数。
当我们在 CNN 中处理图像时,初始层会学会检测非常通用的特征,例如卷曲,边缘,颜色组成等。 随着网络的深入发展,更深层次的卷积层将学会检测与特定种类的数据集相关的更复杂特征。 我们可以使用预训练的网络,并选择不训练前几层,因为它们会学习非常通用的功能。 相反,我们可以只专注于训练最后几层的参数,因为它们将学习针对当前问题的复杂功能。 这样可以确保我们需要训练的参数较少,并且可以明智地使用数据,仅训练所需的复杂参数,而不训练通用特征。
当我们在 CNN 中处理图像时,初始层会学会检测非常通用的特征,例如卷曲,边缘,颜色组成等。 随着网络的深入发展,更深层次的卷积层将学会检测与特定种类的数据集相关的更复杂特征。 我们可以使用预训练的网络,并选择不训练前几层,因为它们会学习非常通用的函数。 相反,我们可以只专注于训练最后几层的参数,因为它们将学习针对当前问题的复杂函数。 这样可以确保我们需要训练的参数较少,并且可以明智地使用数据,仅训练所需的复杂参数,而不训练通用特征。
迁移学习已广泛应用于通过 CNN 进行图像处理的过程,其中滤镜充当特征检测器。 用于迁移学习的最常见的预训练 CNN 是`AlexNet``VGG16``VGG19``Inception V3``ResNet`等。 下图说明了用于传输学习的预训练`VGG16`网络:
......
......@@ -167,7 +167,7 @@ Softmax 将是表示输出层中不同类别的概率的最佳激活函数,而
# 预处理图像
不同类别的图像将存储在不同的文件夹中,因此可以轻松标记其类别。 我们将使用`Opencv`函数读取图像,并将其调整为不同的尺寸,例如`224 x 224 x3`。我们将基于 ImageNet 数据集从每个图像的通道方向上减去平均像素强度。 这意味着减法将使糖尿病性视网膜病变图像达到与在其上训练了预训练模型的处理过的 ImageNet 图像相同的强度范围。 提出每个图像后,它们将存储在`numpy`数组中。 图像预处理功能可以定义如下:
不同类别的图像将存储在不同的文件夹中,因此可以轻松标记其类别。 我们将使用`Opencv`函数读取图像,并将其调整为不同的尺寸,例如`224 x 224 x3`。我们将基于 ImageNet 数据集从每个图像的通道方向上减去平均像素强度。 这意味着减法将使糖尿病性视网膜病变图像达到与在其上训练了预训练模型的处理过的 ImageNet 图像相同的强度范围。 提出每个图像后,它们将存储在`numpy`数组中。 图像预处理函数可以定义如下:
```py
def get_im_cv2(path,dim=224):
......@@ -330,7 +330,7 @@ def VGG16_pseudo(dim=224,freeze_layers=10,full_freeze='N'):
return model_final
```
我们将使用 ImageNet 上训练的`VGG16`的权重作为模型的初始权重,然后对模型进行微调。 我们还冻结了前几层的权重(默认设置为`10`),因为在 CNN 中,前几层学会了检测通用特征,例如边缘,颜色成分等。 因此,功能在各个域之间不会有太大变化。 冻结层是指不训练该层特定的权重。 我们可以尝试冻结的层数,并选择提供最佳验证分数的层。 由于我们正在执行多类分类,因此已为输出层选择了 softmax 激活函数。
我们将使用 ImageNet 上训练的`VGG16`的权重作为模型的初始权重,然后对模型进行微调。 我们还冻结了前几层的权重(默认设置为`10`),因为在 CNN 中,前几层学会了检测通用特征,例如边缘,颜色成分等。 因此,特征在各个域之间不会有太大变化。 冻结层是指不训练该层特定的权重。 我们可以尝试冻结的层数,并选择提供最佳验证分数的层。 由于我们正在执行多类分类,因此已为输出层选择了 softmax 激活函数。
# InceptionV3 迁移学习网络
......@@ -380,7 +380,7 @@ def resnet_pseudo(dim=224,freeze_layers=10,full_freeze='N'):
# 优化器和初始学习率
**Adam** 优化器(**自适应矩估计器**)用于实现随机梯度下降高级版本的训练。 Adam 优化器会考虑成本函数中的曲率,同时使用动量来确保朝着良好的局部最小值稳定发展。 对于眼前的问题,由于我们正在使用迁移学习,并且希望使用从预训练的网络中获得的尽可能多的先前学习的功能,因此我们将使用较小的初始学习率`0.00001`。 这将确保网络不会丢失经过预训练的网络学习到的有用功能,并根据当前问题的新数据将其微调至较不激进的最佳点。 Adam 优化器可以定义如下:
**Adam** 优化器(**自适应矩估计器**)用于实现随机梯度下降高级版本的训练。 Adam 优化器会考虑成本函数中的曲率,同时使用动量来确保朝着良好的局部最小值稳定发展。 对于眼前的问题,由于我们正在使用迁移学习,并且希望使用从预训练的网络中获得的尽可能多的先前学习的特征,因此我们将使用较小的初始学习率`0.00001`。 这将确保网络不会丢失经过预训练的网络学习到的有用特征,并根据当前问题的新数据将其微调至较不激进的最佳点。 Adam 优化器可以定义如下:
```py
adam = optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
......@@ -427,7 +427,7 @@ reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.50,
# Python 实现训练过程
以下 Python 代码块显示了训练过程的端到端实现。 它由前面各节中讨论的所有功能块组成。 让我们首先调用所需的所有 Python 程序包,如下所示:
以下 Python 代码块显示了训练过程的端到端实现。 它由前面各节中讨论的所有函数块组成。 让我们首先调用所需的所有 Python 程序包,如下所示:
```py
import numpy as np
......@@ -595,7 +595,7 @@ def inception_pseudo(self,dim=224,freeze_layers=30,full_freeze='N'):
return model_final
```
现在,让我们定义训练功能,如下所示:
现在,让我们定义训练函数,如下所示:
```py
def train_model(self,train_X,train_y,n_fold=5,batch_size=16,epochs=40,
......@@ -1074,7 +1074,7 @@ class DataGenerator(keras.utils.Sequence):
我们定义数据生成器以接受图像文件名,标签,批量大小,类数以及我们希望将图像调整大小的尺寸。 另外,我们指定是否希望将图像在一个时代中的处理顺序进行混排。
我们指定的功能是从`keras.utils.Sequence`继承的,因此,这些功能中每个功能的特定活动都无法在其他位置指定。`len`函数用于计算一个时期中的批量数。
我们指定的函数是从`keras.utils.Sequence`继承的,因此,这些函数中每个函数的特定活动都无法在其他位置指定。`len`函数用于计算一个时期中的批量数。
类似地,在`on_epoch_end`函数中,我们可以指定在周期结束时要执行的活动,例如打乱周期中要处理输入的顺序。 我们可以在每个时期创建一组不同的数据集进行处理。 当我们有大量数据并且我们不想在每个时期处理所有数据时,这通常很有用。 `__getitem__`函数通过提取与特定于批量的所有数据点索引相对应的数据来帮助创建批量。 如果数据创建过程更复杂,则可以利用`__data_generation `函数具有特定于批量中每个单独数据点提取的逻辑。 例如,我们将与批量中的数据点索引相对应的文件名传递给`__data_generation`函数,以使用`opencv`读取每个图像,并使用`preprocess`函数对其进行预处理,我们必须进行平均像素减法。
......@@ -1156,7 +1156,7 @@ epochs=40,dim=224,lr=1e-5,model='ResNet50'):
return model_save_dest
```
从前面的代码中我们可以看到,训练生成器和验证生成器是使用`DataGenerator`类创建的,该类继承了`keras.utils.sequence`类。 推理功能可以编码如下:
从前面的代码中我们可以看到,训练生成器和验证生成器是使用`DataGenerator`类创建的,该类继承了`keras.utils.sequence`类。 推理函数可以编码如下:
```py
def inference_validation(self,test_X,test_y,model_save_dest,n_class=5,
......
......@@ -86,7 +86,7 @@
* 从目标语言到源语言构建**翻译模型**,这使我们能够估算`P(s / t)`
* 对可能的目标翻译进行搜索,然后选择最大化`P(s / t)P(t)`的翻译
我们将讨论这三个主题中的每一个,因为这些功能是任何机器翻译问题所固有的。
我们将讨论这三个主题中的每一个,因为这些函数是任何机器翻译问题所固有的。
# 语言模型
......@@ -333,7 +333,7 @@ NMT 与其他传统方法相比的一些优点如下:
dict((i, word) for word, i in self.target_word_index.items())
```
`process_input`函数利用先前功能中构建的输入和目标文本以及词汇表,将文本数据转换为数字形式,以供神经翻译机架构使用。 `process_input`函数的代码如下:
`process_input`函数利用先前函数中构建的输入和目标文本以及词汇表,将文本数据转换为数字形式,以供神经翻译机架构使用。 `process_input`函数的代码如下:
```py
def process_input(self,input_texts,target_texts=None,verbose=True):
......@@ -392,7 +392,7 @@ NMT 与其他传统方法相比的一些优点如下:
return encoder_input_data,None,None,np.array(input_texts),None
```
`encoder_input_data` 变量将包含输入源数据,并且将是记录数,时间步数以及每个维度的维数的三维数组。 热编码向量。 类似地,`decoder_input_data` 将包含输入目标数据,而`decoder_target_data` 将包含目标标签。 在执行上述功能后,将生成训练机器翻译系统所需的所有相关输入和输出。 以下代码块包含与使用`40000`样本执行`vocab_generation`函数有关的显示统计信息:
`encoder_input_data` 变量将包含输入源数据,并且将是记录数,时间步数以及每个维度的维数的三维数组。 热编码向量。 类似地,`decoder_input_data` 将包含输入目标数据,而`decoder_target_data` 将包含目标标签。 在执行上述函数后,将生成训练机器翻译系统所需的所有相关输入和输出。 以下代码块包含与使用`40000`样本执行`vocab_generation`函数有关的显示统计信息:
```py
......@@ -521,7 +521,7 @@ NMT 与其他传统方法相比的一些优点如下:
```
我们在 80% 的数据上训练模型,并将其余 20% 的数据用于验证。 训练/测试拆分由以下定义的功能执行:
我们在 80% 的数据上训练模型,并将其余 20% 的数据用于验证。 训练/测试拆分由以下定义的函数执行:
```py
def train_test_split(self,num_recs,train_frac=0.8):
......@@ -595,7 +595,7 @@ def model_enc_dec(self):
解码器一次将运行一个时间步。 在第一种情况下,它将从编码器获取隐藏状态和单元状态,并根据伪单词`[START]`猜测翻译的第一个单词。 第一步中预测的单词,连同生成的隐藏状态和单元状态一起,再次馈送到解码器以预测第二个单词,然后继续进行处理,直到预测出由虚拟单词`[END]`表示的句子结尾。
现在,我们已经定义了将源句子/文本翻译成目标语言对应物所需的所有功能,我们将它们组合起来以构建一个函数,该函数会生成翻译后的句子,给定源语言输入序列或句子:
现在,我们已经定义了将源句子/文本翻译成目标语言对应物所需的所有函数,我们将它们组合起来以构建一个函数,该函数会生成翻译后的句子,给定源语言输入序列或句子:
```py
def decode_sequence(self,input_seq,encoder_model,decoder_model):
......@@ -714,7 +714,7 @@ python MachineTranslation.py --path '/home/santanu/ML_DS_Catalog/Machine Transla
# 实现基于嵌入的 NMT
我们将需要对现有功能进行一些更改,以适应嵌入层。 首先,`process_input`将处理输入以在不同的时间步长中具有单词索引,而不是单热编码矢量,如下所示:
我们将需要对现有函数进行一些更改,以适应嵌入层。 首先,`process_input`将处理输入以在不同的时间步长中具有单词索引,而不是单热编码矢量,如下所示:
```py
def process_input(self,input_texts,target_texts=None,verbose=True):
......@@ -862,7 +862,7 @@ Max sequence length for outputs: 16
return model,encoder_model,decoder_model
```
接下来,我们需要对与推理相关的功能进行修改,以适应与嵌入相关的更改。 现在,用于推断的`encoder_model``decoder_model`分别将嵌入层用于英语和法语词汇。
接下来,我们需要对与推理相关的函数进行修改,以适应与嵌入相关的更改。 现在,用于推断的`encoder_model``decoder_model`分别将嵌入层用于英语和法语词汇。
最后,我们可以使用`decoder_model``encoder_model`如下创建序列生成器函数:
......
......@@ -29,7 +29,7 @@
图 4.1:DiscoGAN 的架构图
`B`中生成的图像在样式和样式上都类似于域`A`中的图像。 无需在训练过程中显式配对来自两个域的图像就可以学习这种关系。 鉴于项目的配对是一项耗时的任务,因此这是一项非常强大的功能。 在较高的水平上,它尝试学习神经网络`G[AB]``G[BA]`形式的两个生成器函数。 图像`x[A]`,当通过发生器馈入时`G[AB]`,产生图像`x[AB]`,在域`B`中看起来很真实。此外,当此图像`x[AB]`通过其他生成器网络`G[BA]`馈送时,它应产生图像`x[ABA]`,理想情况下应与原始图像`x[A]`相同。 关于生成器功能,以下关系应成立:
`B`中生成的图像在样式和样式上都类似于域`A`中的图像。 无需在训练过程中显式配对来自两个域的图像就可以学习这种关系。 鉴于项目的配对是一项耗时的任务,因此这是一项非常强大的功能。 在较高的水平上,它尝试学习神经网络`G[AB]``G[BA]`形式的两个生成器函数。 图像`x[A]`,当通过发生器馈入时`G[AB]`,产生图像`x[AB]`,在域`B`中看起来很真实。此外,当此图像`x[AB]`通过其他生成器网络`G[BA]`馈送时,它应产生图像`x[ABA]`,理想情况下应与原始图像`x[A]`相同。 关于生成器函数,以下关系应成立:
![](img/b12bb426-7c2a-4116-be5b-98a133536497.png)
......@@ -284,9 +284,9 @@ def build_generator(self,image,reuse=False,name='generator'):
在生成器函数中,我们定义了 LReLU 激活函数,并使用`0.2`的泄漏因子。 我们还定义了卷积层生成函数`common_conv2d`(用于对图像进行下采样)和`common_deconv2d`(用于将经降采样的图像上采样至其原始空间尺寸)。
我们通过使用`tf.get_variable_scope().reuse_variables()`使用`reuse`选项定义生成器功能。 当多次调用同一个生成器函数时,重用选项可确保我们重用特定生成器使用的相同变量。 当我们删除重用选项时,我们为生成器创建了一组新的变量。
我们通过使用`tf.get_variable_scope().reuse_variables()`使用`reuse`选项定义生成器函数。 当多次调用同一个生成器函数时,重用选项可确保我们重用特定生成器使用的相同变量。 当我们删除重用选项时,我们为生成器创建了一组新的变量。
例如,我们可能使用生成器函数创建了两个生成器网络,因此在第一次创建这些网络时不会使用`reuse`选项。 如果再次引用该生成器功能,则使用`reuse`选项。 卷积(下采样)和解卷积(上采样)期间的激活函数是 LReLU,然后进行批量归一化,以实现稳定和快速的收敛。
例如,我们可能使用生成器函数创建了两个生成器网络,因此在第一次创建这些网络时不会使用`reuse`选项。 如果再次引用该生成器函数,则使用`reuse`选项。 卷积(下采样)和解卷积(上采样)期间的激活函数是 LReLU,然后进行批量归一化,以实现稳定和快速的收敛。
网络不同层中的输出要素图的数量可以是`self.gf` 或其倍数。 对于我们的 DiscoGAN 网络,我们选择了`self.gf`作为`64`
......
......@@ -93,7 +93,7 @@ o1, o2, . . . . . ot . . . oN = { "A ","man" "in" "a" "yellow" "helmet" "is" "wo
从指定位置下载数据后,下一个任务是处理视频图像帧,以从预训练的卷积神经网络的最后全连接层中提取特征。 我们使用在 ImageNet 上预训练的`VGG16`卷积神经网络。 我们将激活从`VGG16`的最后一个全连接层中取出。 由于`VGG16`的最后一个全连接层具有`4096`单位,因此每个时间步`t`的特征向量`f[t]``4096`维向量,`f[t] ∈ R^4096`
在通过`VGG16`处理视频中的图像之前,需要从视频中对其进行采样。 我们从视频中采样图像,使每个视频具有`80`帧。 处理来自`VGG16``80`图像帧后,每个视频将具有`80`特征向量`f[1], f[2], ..., f[80]`。 这些功能将被馈送到 LSTM 以生成文本序列。 我们在 Keras 中使用了预训练的`VGG16`模型。 我们创建一个`VideoCaptioningPreProcessing`类,该类首先通过函数`video_to_frames`从每个视频中提取`80`视频帧作为图像,然后通过函数`extract_feats_pretrained_cnn`中的预训练`VGG16`卷积神经网络处理这些视频帧。 。
在通过`VGG16`处理视频中的图像之前,需要从视频中对其进行采样。 我们从视频中采样图像,使每个视频具有`80`帧。 处理来自`VGG16``80`图像帧后,每个视频将具有`80`特征向量`f[1], f[2], ..., f[80]`。 这些特征将被馈送到 LSTM 以生成文本序列。 我们在 Keras 中使用了预训练的`VGG16`模型。 我们创建一个`VideoCaptioningPreProcessing`类,该类首先通过函数`video_to_frames`从每个视频中提取`80`视频帧作为图像,然后通过函数`extract_feats_pretrained_cnn`中的预训练`VGG16`卷积神经网络处理这些视频帧。 。
`extract_feats_pretrained_cnn`的输出是每个视频帧尺寸为`4096`的 CNN 特征。 由于我们正在处理每个视频的`80`帧,因此每个视频将具有`80`这样的`4096`维向量。
......@@ -210,7 +210,7 @@ Processing video /media/santanu/9eb9b6dc-b380-486e-b4fd-c424a325b976/Video Capti
图 5.5:字幕文件格式的快照
`VideoID``Start``End`列组合以形成以下格式的视频名称:`VideoID_Start_End.avi`。 基于视频名称,来自卷积神经网络`VGG16`的特征已存储为`VideoID_Start_End.npy`。 以下代码块中所示的功能是处理视频的文本标题并创建来自`VGG16`的视频图像特征的路径交叉引用:
`VideoID``Start``End`列组合以形成以下格式的视频名称:`VideoID_Start_End.avi`。 基于视频名称,来自卷积神经网络`VGG16`的特征已存储为`VideoID_Start_End.npy`。 以下代码块中所示的函数是处理视频的文本标题并创建来自`VGG16`的视频图像特征的路径交叉引用:
```py
def get_clean_caption_data(self,text_path,feat_path):
......@@ -233,7 +233,7 @@ def get_clean_caption_data(self,text_path,feat_path):
return data
```
在已定义的`get_data`函数中,我们从`video_corpus.csv`文件中删除了所有非英语的字幕。 完成后,我们首先通过构建视频名称(作为`VideoID``Start``End`函数的连接)并在功能目录名称前添加前缀来形成视频功能的链接。 然后,我们删除所有未指向`features`目录中任何实际视频特征向量或具有无效非文本描述的视频语料库文件记录。
在已定义的`get_data`函数中,我们从`video_corpus.csv`文件中删除了所有非英语的字幕。 完成后,我们首先通过构建视频名称(作为`VideoID``Start``End`函数的连接)并在特征目录名称前添加前缀来形成视频特征的链接。 然后,我们删除所有未指向`features`目录中任何实际视频特征向量或具有无效非文本描述的视频语料库文件记录。
数据如下图所示输出(“图 5.6”):
......@@ -243,7 +243,7 @@ def get_clean_caption_data(self,text_path,feat_path):
# 建立训练和测试数据集
训练模型后,我们想评估模型的运行情况。 我们可以根据测试集中的视频内容验证为测试数据集生成的字幕。 可以使用以下功能创建列车测试集数据集。 我们可以在训练期间创建测试数据集,并在训练模型后将其用于评估:
训练模型后,我们想评估模型的运行情况。 我们可以根据测试集中的视频内容验证为测试数据集生成的字幕。 可以使用以下函数创建列车测试集数据集。 我们可以在训练期间创建测试数据集,并在训练模型后将其用于评估:
```py
def train_test_split(self,data,test_frac=0.2):
......@@ -273,7 +273,7 @@ def get_clean_caption_data(self,text_path,feat_path):
![](img/aa71833b-2882-4ace-abe6-d6dad3254469.png)
这些权重`W[ho]``b`在以下代码块中定义为`self.word_emb_W``self.word_emb_b`。 有关更多详细信息,请参考`build_model`函数。 为了方便解释,构建功能分为三部分。 构建模型有 3 个主要单元
这些权重`W[ho]``b`在以下代码块中定义为`self.word_emb_W``self.word_emb_b`。 有关更多详细信息,请参考`build_model`函数。 为了方便解释,构建函数分为三部分。 构建模型有 3 个主要单元
* **定义阶段**:定义变量,标题词的嵌入层和序列到序列模型的两个 LSTM。
* **编码阶段**:在这一阶段中,我们将视频帧图像特征传递给 LSTM1 的时间步长,并将每个时间步长的隐藏状态传递给 LSTM2。此活动一直进行到时间步长`N`其中`N`是从每个视频中采样的视频帧图像的数量。
......@@ -472,7 +472,7 @@ unk => A substitute for a word that is not included in the vocabulary
# 训练模型
在本节中,我们将所有部分放在一起以构建用于训练视频字幕模型的功能
在本节中,我们将所有部分放在一起以构建用于训练视频字幕模型的函数
首先,我们结合训练和测试数据集中的视频字幕,创建单词词汇词典。 完成此操作后,我们将结合两个 LSTM 调用`build_model`函数来创建视频字幕网络。 对于每个带有特定*开始**结束*的视频,都有多个输出视频字幕。 在每个批量中,从开始和结束的特定视频的输出视频字幕是从多个可用的视频字幕中随机选择的。 调整 LSTM 2 的输入文本标题,使其在时间步`N + 1`处的起始词为`<bos>`,而输出文本标题的结束词被调整为最终文本标签`<eos>`。 每个时间步长上的分类交叉熵损失之和被视为特定视频的总交叉熵损失。 在每个时间步中,我们计算完整单词词汇上的分类交叉熵损失,可以表示为:
......@@ -854,7 +854,7 @@ python Video_seq2seq.py process_main --path_prj '/media/santanu/9eb9b6dc-b380-48
从前面的屏幕截图中,我们可以看到训练后的模型为提供的测试视频提供了很好的字幕,表现出色。
该项目的代码可以在 [GitHub](https://github.com/PacktPublishing/Python-Artificial-Intelligence-Projects/tree/master/Chapter05) 中找到。 `VideoCaptioningPreProcessing.py`模块可用于预处理视频并创建卷积神经网络功能,而`Video_seq2seq.py`模块可用于训练端到端视频字幕系统和运行推断。
该项目的代码可以在 [GitHub](https://github.com/PacktPublishing/Python-Artificial-Intelligence-Projects/tree/master/Chapter05) 中找到。 `VideoCaptioningPreProcessing.py`模块可用于预处理视频并创建卷积神经网络特征,而`Video_seq2seq.py`模块可用于训练端到端视频字幕系统和运行推断。
# 总结
......
......@@ -22,7 +22,7 @@
# 什么是推荐系统?
推荐系统在当今世界无处不在。 无论是 Netflix 上的电影推荐还是亚马逊上的产品推荐,推荐器系统都产生了重大影响。 推荐系统可以大致分为基于内容的过滤系统,协同过滤系统和基于潜在因子的过滤推荐系统。 **基于内容的过滤**依赖于基于项目内容的手工编码功能。 根据用户对现有商品的评分方式,创建用户个人资料,并将用户提供的排名赋予这些商品:
推荐系统在当今世界无处不在。 无论是 Netflix 上的电影推荐还是亚马逊上的产品推荐,推荐器系统都产生了重大影响。 推荐系统可以大致分为基于内容的过滤系统,协同过滤系统和基于潜在因子的过滤推荐系统。 **基于内容的过滤**依赖于基于项目内容的手工编码特征。 根据用户对现有商品的评分方式,创建用户个人资料,并将用户提供的排名赋予这些商品:
![](img/eaa4391a-b8cf-42ce-bad4-c4977e83bdbc.png)
......@@ -40,7 +40,7 @@
# 基于潜在分解的推荐系统
基于潜在因子分解的过滤器推荐方法尝试通过分解评分来发现潜在特征,以表示用户和项目资料。 与基于内容的过滤功能不同,这些潜在功能不可解释,可以表示复杂的功能。 例如,在电影推荐系统中,潜在特征之一可能以特定比例表示幽默,悬念和浪漫的线性组合。 通常,对于已经评分的商品,用户`i`对商品`j`的评分`r[ij]`可以表示为`r[ij] = u[i]^T v[j]`。 其中`u[i]`是基于潜在因子的用户配置文件矢量,而`v[i]`是基于相同潜在因子的项目矢量 :
基于潜在因子分解的过滤器推荐方法尝试通过分解评分来发现潜在特征,以表示用户和项目资料。 与基于内容的过滤特征不同,这些潜在特征不可解释,可以表示复杂的特征。 例如,在电影推荐系统中,潜在特征之一可能以特定比例表示幽默,悬念和浪漫的线性组合。 通常,对于已经评分的商品,用户`i`对商品`j`的评分`r[ij]`可以表示为`r[ij] = u[i]^T v[j]`。 其中`u[i]`是基于潜在因子的用户配置文件矢量,而`v[i]`是基于相同潜在因子的项目矢量 :
![](img/719736b5-d23e-49ca-b6b2-bfcda9d9657a.png)
......@@ -93,7 +93,7 @@ def model(max_users,max_movies,latent_factors):
在前面的`model`函数中,`max_users``max_movies`分别确定用户的大小和电影嵌入矩阵。 该模型的参数不过是用户和电影嵌入矩阵的组成部分。 因此,如果我们有`m`个用户和`n`个电影,并且我们选择了`k`的潜在维度,那么我们就有`mxk + nxk = (m + n) * k`个待学习参数。
数据处理功能可以编码如下:
数据处理函数可以编码如下:
```py
data_dir = Path('/home/santanu/ML_DS_Catalog-/Collaborating Filtering/ml-100k/')
......@@ -478,7 +478,7 @@ python preprocess_ratings.py --path '/home/santanu/ML_DS_Catalog-/Collaborating
接下来,我们根据吉布斯采样定义对比差异的逻辑。 `gibbs_step`函数执行吉布斯采样的一个步骤,然后利用它来实现`k`阶的对比散度。
现在我们拥有所有必需的功能,我们将创建 TensorFlow 操作,以在给定可见输入的情况下对隐藏状态`self.h`进行采样,并在给定采样状态下对可见单位`self.x`进行采样。 我们还使用对比散度从`v``h`的联合概率分布(即`P(v,h/model)`)中抽取`(self.x_s,self.h_s)`作为代表性样本,以计算梯度中的不同期望项。
现在我们拥有所有必需的函数,我们将创建 TensorFlow 操作,以在给定可见输入的情况下对隐藏状态`self.h`进行采样,并在给定采样状态下对可见单位`self.x`进行采样。 我们还使用对比散度从`v``h`的联合概率分布(即`P(v,h/model)`)中抽取`(self.x_s,self.h_s)`作为代表性样本,以计算梯度中的不同期望项。
`_network`函数的最后一步基于梯度更新 RBM 模型的权重和偏差。 如我们先前所见,梯度基于给定可见层输入的隐藏层激活`self.h`以及通过对比发散得出的联合概率分布`P(v,h/model)`的代表性样本`(self.x_s,self.h_s)`
......
......@@ -263,7 +263,7 @@ def _build_model(self):
# 训练模型
在本部分中,我们将说明用于训练模型的 TensorFlow 代码。 训练模型时要适度`10 epochs`,以避免过拟合。 用于优化器的学习速率为`0.001`,而训练批量大小和验证批量大小分别设置为`250``50`。 需要注意的一件事是,我们使用`tf.train.write_graph`函数将模型图定义保存在`model.pbtxt`文件中。 同样,一旦模型被训练,我们将使用`tf.train.Saver` 功能将模型权重保存在检查点文件`model_ckpt`中。 `model.pbtxt``model_ckpt`文件将用于创建 protobuf 格式的 TensorFlow 模型的优化版本,该版本可以与 Android 应用集成:
在本部分中,我们将说明用于训练模型的 TensorFlow 代码。 训练模型时要适度`10 epochs`,以避免过拟合。 用于优化器的学习速率为`0.001`,而训练批量大小和验证批量大小分别设置为`250``50`。 需要注意的一件事是,我们使用`tf.train.write_graph`函数将模型图定义保存在`model.pbtxt`文件中。 同样,一旦模型被训练,我们将使用`tf.train.Saver`函数将模型权重保存在检查点文件`model_ckpt`中。 `model.pbtxt``model_ckpt`文件将用于创建 protobuf 格式的 TensorFlow 模型的优化版本,该版本可以与 Android 应用集成:
```py
def _train(self):
......@@ -303,7 +303,7 @@ def _build_model(self):
# 批量生成器
`train`函数中,我们将使用批量生成器根据传递的批量大小生成随机批量。 生成器功能可以定义如下。 请注意,这些功能使用`yield`代替`return`。 通过使用所需参数调用函数,将创建批量的迭代器对象。 可以通过将`next`方法应用于迭代器对象来检索批量。 我们将在每个时期开始时调用生成器函数,以便在每个时期中批量都是随机的。
`train`函数中,我们将使用批量生成器根据传递的批量大小生成随机批量。 生成器函数可以定义如下。 请注意,这些函数使用`yield`代替`return`。 通过使用所需参数调用函数,将创建批量的迭代器对象。 可以通过将`next`方法应用于迭代器对象来检索批量。 我们将在每个时期开始时调用生成器函数,以便在每个时期中批量都是随机的。
以下代码段说明了用于生成批量迭代器对象的函数:
......
......@@ -81,7 +81,7 @@
# 创建用于训练聊天机器人的数据
要提取客户发布的所有入站推文,我们需要将具有`in_response_to_tweet_id` 字段的所有推文作为`null`提取。 如果`in_response_to_tweet_id` 字段不为空,则可以通过推文筛选出包含客户服务代表响应的出站文件。 有了入站和出站文件后,我们需要将它们合并到入站文件的`tweet_id`和出站文件的`in_response_to_tweet_id` 中。 作为回应,这将为我们提供客户发布的`tweets in`以及客户服务代表在回复中发布`tweets out`。 数据创建功能可以编码如下:
要提取客户发布的所有入站推文,我们需要将具有`in_response_to_tweet_id` 字段的所有推文作为`null`提取。 如果`in_response_to_tweet_id` 字段不为空,则可以通过推文筛选出包含客户服务代表响应的出站文件。 有了入站和出站文件后,我们需要将它们合并到入站文件的`tweet_id`和出站文件的`in_response_to_tweet_id` 中。 作为回应,这将为我们提供客户发布的`tweets in`以及客户服务代表在回复中发布`tweets out`。 数据创建函数可以编码如下:
```py
def process_data(self,path):
......@@ -102,7 +102,7 @@
# 将文本标记为单词索引
需要将这些推文标记化并转换为数字,然后才能将其发送到神经网络。 **计数向量化器**用于确定固定数量的常见单词,这些单词构成了聊天机器人的词汇空间。 我们还引入了三个新标记,分别表示句子的开头`(START)`,句子的结尾(`PAD`)和任何未知的单词(`UNK`)。 标记推文的功能如下所示,以供参考:
需要将这些推文标记化并转换为数字,然后才能将其发送到神经网络。 **计数向量化器**用于确定固定数量的常见单词,这些单词构成了聊天机器人的词汇空间。 我们还引入了三个新标记,分别表示句子的开头`(START)`,句子的结尾(`PAD`)和任何未知的单词(`UNK`)。 标记推文的函数如下所示,以供参考:
```py
def tokenize_text(self,in_text,out_text):
......@@ -134,7 +134,7 @@ def words_to_indices(self,sent):
return word_indices
```
我们还希望将循环神经网络预测的单词索引转换为单词以形成句子。 此功能可以编码如下:
我们还希望将循环神经网络预测的单词索引转换为单词以形成句子。 此函数可以编码如下:
```py
def indices_to_words(self,indices):
......@@ -144,7 +144,7 @@ def words_to_indices(self,sent):
# 替换匿名的屏幕名称
在对推文进行标记之前,可能值得将推文中的匿名屏幕名称替换为通用名称,以使响应更好地泛化。 此功能可以编码如下:
在对推文进行标记之前,可能值得将推文中的匿名屏幕名称替换为通用名称,以使响应更好地泛化。 此函数可以编码如下:
```py
def replace_anonymized_names(self,data):
......@@ -269,7 +269,7 @@ Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长
return _model_
```
现在我们已经研究了所有基本功能,可以将训练功能编码如下:
现在我们已经研究了所有基本函数,可以将训练函数编码如下:
```py
def train_model(self,model,X_train,X_test,y_train,y_test):
......@@ -295,7 +295,7 @@ def train_model(self,model,X_train,X_test,y_train,y_test):
```
`train_model`函数的开头,我们创建`input_y_train``input_y_test`,它们分别是`y_train``y_test`的副本,并从它们移了一个时间步,以便它们可以用作解码器每个时间步的前一个单词的输入。 这些移位序列的第一个单词是`START`关键字,它在解码器 LSTM 的第一时间步输入。 `include_start_token`定制工具功能如下:
`train_model`函数的开头,我们创建`input_y_train``input_y_test`,它们分别是`y_train``y_test`的副本,并从它们移了一个时间步,以便它们可以用作解码器每个时间步的前一个单词的输入。 这些移位序列的第一个单词是`START`关键字,它在解码器 LSTM 的第一时间步输入。 `include_start_token`定制工具函数如下:
```py
def include_start_token(self,Y):
......@@ -305,7 +305,7 @@ def include_start_token(self,Y):
return Y
```
回到训练函数`train_model`,我们看到如果`10`时期的损失没有减少,可以使用`EarlyStopping`回调工具启用提前停止功能。 类似地,如果错误没有在两个时期内减少,则`ReduceLROnPlateau`回调会将现有学习率降低一半(`0.5`)。 只要错误在某个时期减少,就会通过`ModelCheckpoint`回调保存模型。
回到训练函数`train_model`,我们看到如果`10`时期的损失没有减少,可以使用`EarlyStopping`回调工具启用提前停止。 类似地,如果错误没有在两个时期内减少,则`ReduceLROnPlateau`回调会将现有学习率降低一半(`0.5`)。 只要错误在某个时期减少,就会通过`ModelCheckpoint`回调保存模型。
# 从模型生成输出响应
......@@ -333,7 +333,7 @@ def respond_to_input(self,model,input_sent):
# 全部放在一起
综上所述,`main`函数可以定义为具有两个流程:一个用于训练,另一个用于推理。 即使在训练功能中,我们也会对输入的推文序列生成一些响应,以检查我们对模型的训练程度。 以下代码显示`main`函数供参考:
综上所述,`main`函数可以定义为具有两个流程:一个用于训练,另一个用于推理。 即使在训练函数中,我们也会对输入的推文序列生成一些响应,以检查我们对模型的训练程度。 以下代码显示`main`函数供参考:
```py
def main(self):
......
......@@ -259,7 +259,7 @@ class DQN:
* `Agent`:基于给定状态的 Q 值执行动作
* `RandomAgent`:执行随机动作
智能体类具有三个功能,具有以下功能
智能体类具有三个函数,具有以下函数
* `act`:智能体根据状态决定要采取的措施
* `observe`:智能体捕获状态和目标 Q 值
......@@ -767,7 +767,7 @@ if __name__ == '__main__':
# 辅助函数
以下是在此强化学习框架中用于进行动作选择,存储用于训练的观察值,状态图像处理以及节省训练后模型权重的一些辅助功能
以下是在此强化学习框架中用于进行动作选择,存储用于训练的观察值,状态图像处理以及节省训练后模型权重的一些辅助函数
```py
"""
......
......@@ -398,7 +398,7 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
![](img/ae36b54b-0a7c-4c94-8c4b-4e5209859d44.png)
在前面的表达式中`D(.)`是鉴别函数,其输出表示将图像标记为实数的可能性。`P[z](z)`表示随机变量噪声`z`的分布,而`P[X](x)`表示真实门牌号图像的分布。`G(.)``D(.)`分别表示生成器网络功能和判别器网络功能。 这些参数可以通过网络的权重进行参数化,而网络的权重是我们为表示法的混乱而方便地跳过的。 如果我们用`θ`表示发生器网络权重的参数,用`φ`表示判别器网络的权重,则判别器将学会使`(1)`相对于`φ`的损失最小化,而生成器将旨在使`(1)``θ`的损失相同。 我们可以将`(1)`中优化的损耗称为效用函数,发生器和判别器都在参数方面进行了优化。 实用函数`U`可以根据生成器和判别器的参数来编写,如下所示:
在前面的表达式中`D(.)`是鉴别函数,其输出表示将图像标记为实数的可能性。`P[z](z)`表示随机变量噪声`z`的分布,而`P[X](x)`表示真实门牌号图像的分布。`G(.)``D(.)`分别表示生成器网络函数和判别器网络函数。 这些参数可以通过网络的权重进行参数化,而网络的权重是我们为表示法的混乱而方便地跳过的。 如果我们用`θ`表示发生器网络权重的参数,用`φ`表示判别器网络的权重,则判别器将学会使`(1)`相对于`φ`的损失最小化,而生成器将旨在使`(1)``θ`的损失相同。 我们可以将`(1)`中优化的损耗称为效用函数,发生器和判别器都在参数方面进行了优化。 实用函数`U`可以根据生成器和判别器的参数来编写,如下所示:
![](img/e18dcc4f-da73-459c-ae45-a767f0e05be9.png)
......@@ -410,7 +410,7 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
在参数空间中的某个点上,如果某个函数相对于某些参数而言是局部最大值,而对于其余参数而言是局部最小值,则该点称为**鞍点**。 因此,`(θ_hat, φ_hat)`给出的点将成为效用函数`U(θ, φ)`的鞍点。 该鞍点是极小极大零和博弈的纳什均衡,对于生成器和判别器正在优化的效用,`(θ_hat, φ_hat)`参数是最佳的。 就当前问题而言,生成器`G`会产生最困难的验证码,供判别器以`θ_hat`作为其参数进行检测。 同样,判别器最适合以`φ`作为参数来检测伪造的验证码。
具有鞍点的最简单功能`x^2 - y^2`,鞍点是原点:`(0,0)`
具有鞍点的最简单函数`x^2 - y^2`,鞍点是原点:`(0,0)`
# 优化 GAN 损失
......@@ -582,7 +582,7 @@ def train(dest_train,outdir,
`Adam`优化器用于两个网络的优化。 要注意的一件事是,仅需要对网络`g_d`进行编译,以仅针对发生器`G`的参数来优化损耗。 因此,我们需要禁用网络`g_d`中判别器`D`的参数训练。
我们可以使用以下功能来禁用或启用对网络参数的学习:
我们可以使用以下函数来禁用或启用对网络参数的学习:
```py
def make_trainable(model, trainable):
......
......@@ -371,7 +371,7 @@ print(' accuracy: {:.3f}'.format(mean_accuracy))
# TF 2.0 的未来
TF 2.0 目前处于 beta 版本,因此仍在开发中。 即将出现的一些关键功能包括对软件包的修改,例如 TensorBoard,TensorFlow Lite,TensorFlow.js,用于 TensorFlow 的 Swift 和 TensorFlow Extended,以及对基本 API 的微小更改。 TensorBoard 将看到增强功能,例如改进的超参数调优功能,引入托管功能以使共享仪表板变得容易,并使插件能够使用不同的前端技术,例如 ReactJS。 TensorFlow Lite 将扩大支持的操作范围,将 TF 2.0 模型更轻松地转换为 TFLite,并扩展对 Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都将看到速度和性能方面的改进,并且很快将包含一组丰富的示例和带有端到端教程的入门指南。 TF Extended 即将与 TF 2.0 基本 API 完全集成,并将包括完全协调的端到端工作流程和训练功能
TF 2.0 目前处于 beta 版本,因此仍在开发中。 即将出现的一些关键功能包括对软件包的修改,例如 TensorBoard,TensorFlow Lite,TensorFlow.js,用于 TensorFlow 的 Swift 和 TensorFlow Extended,以及对基本 API 的微小更改。 TensorBoard 将看到增强功能,例如改进的超参数调优功能,引入托管功能以使共享仪表板变得容易,并使插件能够使用不同的前端技术,例如 ReactJS。 TensorFlow Lite 将扩大支持的操作范围,将 TF 2.0 模型更轻松地转换为 TFLite,并扩展对 Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都将看到速度和性能方面的改进,并且很快将包含一组丰富的示例和带有端到端教程的入门指南。 TF Extended 即将与 TF 2.0 基本 API 完全集成,并将包括完全协调的端到端工作流程和训练函数
TF 2.0 基本 API 将包括针对任务的更多预制估计器,例如增强树,随机森林,最近邻搜索和 k 均值聚类。 `tf.distribute.Strategy`模型将扩展其对 Keras 子模型,TPU 和多节点训练的支持,以在多个处理器上实现更优化和更快的训练。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册