pytorch之wod2vec实现

pytorch之wod2vec实现,第1张

介绍在语料库上训练的词嵌入模型的实现。我们将会介绍一些实现中的技巧,如二次采样(subsampling)。

首先引入实验所需的包或模块。

PTB(Penn Tree Bank)是一个常用的小型语言料库[1]。它采样自《华尔街日报》的文章,包括训练集,验证集和测试集。我们将在PTB训练集上训练词嵌入模型。该数据集的每一行作为一个句子。句子中的每个词由空格隔开。

确保 ptbtraintxt 已经放在了文件夹 //data/ptb 下。

对于数据集的前3个句子,打印每个句子的词数和前5个词。这个数据集中句尾符为 “<EOS>”,生僻词全用 “<UNK>” 表示,数字则被替换变成“ N”。

输出:

为了计算简单,我们只保留在数据集中至少出现5次的词。

然后将词映射到整体索引。

文本数据中一般会出现一些生成词,如英文中的“ the”“ a”和“ in”。通常来说,在一个背景窗口中,一个词(如“ chip”)和可能频词(如“微处理器”)同时出现比和较高频词(如“ the”)同时出现对训练词嵌入模型更有益。因此,训练词嵌入模型时可以对词进行二次采样[2]。我,和越高频的词被最大化的概率值。

可以看到,二次采样后我们去掉了一半左右的词。下面比较一个词在二次采样前后出现在数据集中的次数。可见穿透词“ the”的采样率不足1/20。

但补充词“ join”则完整地保留了下来。

我们将与中心词距离不超过背景窗口大小的词作为它的背景词。下面定义函数提取所有中心词和它们的背景词。它每次在多个1和 max_window_size (最大背景窗口)之间随机均匀采样一个整体作为背景窗口大小。

下面我们创建一个人工数据集,其中包含词数分别为7和3的两个句子。设最大背景窗口为2,打印所有中心词和它们的背景词。

输出:

实验中,我们设最大背景窗口大小为5。下面提取数据集中所有的中心词及其背景词。

词频与总词频之比的075次方[2]。

我们从数据集中提取所有中心词 all_centers ,以及每个中心词对应的背景词 all_contexts 和噪声词 all_negatives 。我们先定义一个 Dataset 类。

为了避免填充项对损失函数计算的影响,我们构造了变量变量 masks ,其每一个元素分别与连结后的背景词和噪声词 contexts_negatives 中的元素一一对应。当 contexts_negatives 变量中的某个元素为填充项时,相同位置的变量变量 masks 中的元素取0,否则取1。为了区分正类和负类,我们还需要将 contexts_negatives 变量中的背景词和噪声词区分开来。取决于变量的构造思路,我们只需创建与 contexts_negatives 变量形状相同的标签变量 labels ,变为与背景词(正类)对应的元素设置1,其余清0。

下面的我们实现这个小批量重新编码函数 batchify 。它的小批量输入 data 是一个长度为批量大小的列表,其中每个元素分别包含中心词 center ,背景词 context 和噪声词 negative 。该函数返回的小批量数据符合我们需要的格式,例如,包含了预设变量。

我们用刚刚定义的 batchify 函数指定 DataLoader 实例中小批量的读取方式,然后打印读取的第一个批量中各个变量的形状。

输出:

我们将通过使用嵌入层和小批量乘法来实现跳字模型。它们也常常用于实现其他自然语言处理的应用。

获取词嵌入的层称为嵌入层,在PyTorch中可以通过创建 nnEmbedding 实例得到。嵌入层的权重是一个矩阵,其行数为字典大小( num_embeddings ),列数为每个词向量的尺寸( embedding_dim )。字典大小为20,词向量的尺寸为4。

输出:

下面我们将形状为(2,3)的索引输入进嵌入层,由于词向量的尺寸为4,我们得到形状为(2,3,4)的词向量。

输出:

输出:

在前向计算中,跳字模型的输入包含中心词索引 center 以及连结的背景词与噪声词索引 contexts_and_negatives 。其中 center 变量的形状为(批量,1),而 contexts_and_negatives 变量的形状为(批量,, max_len )。一个变量先通过词嵌入层分别由词索引变换为词向量,再通过小批量复制得到形状为(批量,1, max_len )的输出。输出中的每个元素是中心词向量与背景词向量或噪声词向量的内积。

在训练词嵌入模型之前,我们需要定义模型的损失函数。

根据负采样中损失函数的定义,我们可以使用二元交叉熵损失函数,如下定义 SigmoidBinaryCrossEntropyLoss 。

值得一提的是,我们可以通过分配变量指定小批量中参与损失函数计算的部分预测值和标签:当中断为1时,相应位置的预测值和标签将参与损失函数的计算;当掩盖编码为0时,相应位置的预测值和标签则不参与损失函数的计算。我们之前提到,变量变量可用于避免填充项对损失函数计算的影响。

输出:

作为比较,下面纠正零开始实现二元交叉熵损失函数的计算,并根据变量变量 mask 计算变量为1的预测值和标签的损失。

输出:

我们分别构造中心词和背景词的嵌入层,将超参数词向量维度 embed_size 设置成100。

下面定义的训练函数。由于填充项的存在,与之前的训练函数划分,损失函数的计算稍有不同。

现在我们就可以使用负采样训练跳字模型了。

输出:

训练好词嵌入模型之后,我们可以根据两个词向量的余弦相似度表示词与词之间在语义上的相似度。可以看到,使用训练得到的词嵌入模型时,与词“ chip”语义最接近的词大多与芯片有关。

输出:

本文源自 >

GAN本身是一种生成式模型,所以在数据生成上用的是最普遍的,最常见的是生成,常用的有DCGAN WGAN,BEGAN。目前比较有意思的应用就是GAN用在图像风格迁移,图像降噪修复,图像超分辨率了,都有比较好的结果。目前也有研究者将GAN用在对抗性攻击上,具体就是训练GAN生成对抗文本,有针对或者无针对的欺骗分类器或者检测系统等等,但是目前没有见到很典范的文章。好吧,笔者有一个项目和对抗性攻击有关,所以要学习一下GAN。

GANs组成:生成器和判别器。结构如图1所示

针对问题: 给定一批样本,训练一个系统能够生成类似的新样本

核心思想:博弈论中的纳什均衡,

判别器D 的目的是判断数据来自生成器还是训练集,

生成器G 的目的是学习真实数据的分布,使得生成的数据更接近真实数据,

两者不断学习优化最后得到纳什平衡点。

D( x) 表示真实数据的概率分布,

G( z) 表示输入噪声z 产生的生成数据的概率分布

训练目标:G( Z)在判别器上的分布D( G( Z) ) 更接近真实数据在判别器上的分布D( X)

接下来就来实现我们的例子把,目标是把标准正态分布的数据,通过训练的GAN网络之后,得到的数据x_fake能尽量拟合均值为3方差为1的高斯分布N(3,1)的数据。

可以看出生成器其实就是简单的全连接网络,当然CNN,RNN等网络都是适合GAN的,根据需要选择。

可以看出判别器其实也是简单的全连接网络,当然CNN,RNN等网络都是适合GAN的,根据需要选择。

在这里想说的是对于判别器和生成器的训练是分开的,训练判别器的时候固定生成器,训练生成器的时候固定判别器,如此循环。本例子中先训练三次判别器,接着训练一次生成器。

为了便于理解具体训练过程,图2 、图3展示了判别器和生成器训练时的数据流向,具体就不展开了,参考注释。

画图函数敬上

然后调用main()函数就好了

红色是目标分布,蓝色是生成分布,还是有一定效果的额。

感受到是在调参了,请教我如何学习生成(xie)对抗(lun)网络(wen)。

往期的文章,我们分享了手写字母的训练与识别

使用EMNIST数据集训练第一个pytorch CNN手写字母识别神经网络

利用pytorch CNN手写字母识别神经网络模型识别手写字母

哪里的文章,我们只是分享了单个字母的识别,如何进行多个字母的识别,其思路与多数字识别类似,首先对进行识别,并进行每个字母的轮廓识别,然后进行字母的识别,识别完成后,直接在上进行多个字母识别结果的备注

Pytorch利用CNN卷积神经网络进行多数字(0-9)识别

根据上期文章的分享,我们搭建一个手写字母识别的神经网络

第一层,我们输入Eminist的数据集,Eminist的数据是一维 2828的,所以第一层的输入(1,28,28),高度为1,设置输出16通道,使用55的卷积核对进行卷积运算,每步移动一格,为了避免尺寸变化,设置pading为2,则经过第一层卷积就输出(16,28,28)数据格式

再经过relu与maxpooling (使用22卷积核)数据输出(16,14,14)

第二层卷积层是简化写法nnConv2d(16, 32, 5, 1, 2)的第一个参数为输入通道数in_channels=16,其第二个参数是输出通道数out_channels=32, # n_filters(输出通道数),第三个参数为卷积核大小,第四个参数为卷积步数,最后一个为pading,此参数为保证输入输出的尺寸大小一致

全连接层,最后使用nnlinear()全连接层进行数据的全连接数据结构(3277,37)以上便是整个卷积神经网络的结构,

大致为:input-卷积-Relu-pooling-卷积

-Relu-pooling-linear-output

卷积神经网络建完后,使用forward()前向传播神经网络进行输入的识别

这里我们使用腐蚀,膨胀 *** 作对进行一下预处理 *** 作,方便神经网络的识别,当然,我们往期的字母数字识别也可以添加此预处理 *** 作,方便神经网络进行预测,提高精度

getContours函数主要是进行中数字区域的区分,把每个数字的坐标检测出来,这样就可以 把每个字母进行CNN卷积神经网络的识别,进而实现多个字母识别的目的

首先,输入一张需要检测的,通过preProccessing预处理与getContours函数获取中的每个字母的轮廓位置

transformsCompose此函数可以 把输入进行pytorch相关的 *** 作,包括转换到torch,灰度空间转换,resize,缩放等等 *** 作

然后加载我们前期训练好的模型

由于神经网络识别完成后,反馈给程序的是字母的 UTF-8编码,我们通过查表来找到对应的字母

字符编码表(UTF-8)

通过上面的 *** 作,我们已经识别出了中包括的字母轮廓,我们遍历每个字母轮廓,获取单个字母数据,这里需要特殊提醒一下 :我们知道EMNIST数据库左右翻转后,又进行了的逆时针旋转90度

这里我们使用cv2flip(imgRes,1)函数,进行的镜像,并使用getRotationMatrix2D函数与warpAffine函数配合来进行的旋转 *** 作,这里就没有PIL来的方便些

然后,我们对数据进行torch转换train_transform(imgRes),并传递给神经网络进行识别

待识别完成后,就可以把结果备注在原始上

以上就是关于pytorch之wod2vec实现全部的内容,包括:pytorch之wod2vec实现、PyTorch-4 nn.DataParallel 数据并行详解、GAN 拟合高斯分布数据Pytorch实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9530986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存