Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在网页上训练我自己的自定义单词嵌入?_Python_Tensorflow_Keras_Deep Learning_Nlp - Fatal编程技术网

Python 如何在网页上训练我自己的自定义单词嵌入?

Python 如何在网页上训练我自己的自定义单词嵌入?,python,tensorflow,keras,deep-learning,nlp,Python,Tensorflow,Keras,Deep Learning,Nlp,我在多个网页上有大量关于我想向客户销售的产品的文本数据。我尝试使用在维基百科上训练过的预先训练过的fasttext单词嵌入,但在分类任务中并没有给我带来好的结果。可能是因为网站上的文本数据包含很多技术细节,并且与维基百科中的文本数据不同。所以我想做一些单词嵌入的迁移学习,以预先训练好的快速文本单词嵌入为基础 如何使用Keras在这些网页上训练自己的自定义单词嵌入? 如何使用fasttext预先训练的嵌入和训练初始化自定义单词嵌入?这个初始化真的有助于更好地嵌入单词吗? 我更喜欢使用Keras来训

我在多个网页上有大量关于我想向客户销售的产品的文本数据。我尝试使用在维基百科上训练过的预先训练过的fasttext单词嵌入,但在分类任务中并没有给我带来好的结果。可能是因为网站上的文本数据包含很多技术细节,并且与维基百科中的文本数据不同。所以我想做一些单词嵌入的迁移学习,以预先训练好的快速文本单词嵌入为基础

如何使用Keras在这些网页上训练自己的自定义单词嵌入? 如何使用fasttext预先训练的嵌入和训练初始化自定义单词嵌入?这个初始化真的有助于更好地嵌入单词吗? 我更喜欢使用Keras来训练单词嵌入的解决方案。 我知道嵌入有trainable=True选项,但不确定如何使用它

Embedding(voc_size, emb_dim, weights=[embedding_matrix], input_length, trainable=True)
该Keras或Gensim推荐哪种框架?为什么

要仅进行训练,必须在嵌入层中将可训练标志设置为True。但他会从一开始就训练- 为了初始化矩阵,你可以使用你所考虑的,你有 这里举一个例子: 哪里 谷歌使用了300个否定词,也只使用了 它们是从原始矩阵中使用的。在嵌入构造函数类权重=[…]中使用权重参数。这个矩阵的大小应该是嵌入的字数x维数。 在Keras中,任何具有参数的层都可以训练或不训练。 当您仅希望训练仅完全连接的层子集等以避免参数爆炸时,此标志非常有用

当设置为可培训=真时:

如果该层位于网络的中间,则仅传播该层。 输入梯度,但不更正任何权重。 如果该层是网络的第一层,则不会传播任何梯度。 例如,在嵌入层的情况下,您可以将该层初始化为默认嵌入矩阵gensim Gooogle300Negative

当你激活这个层中的可训练的时候,你会为Keras提供点阵布兰奇来调整你的嵌入。这也意味着必须优化更多的参数

在某些情况下,由于涉及成本或需要保存,对修改初始嵌入没有兴趣

编辑: 该任务对应于Keras内部的Tensorflow。但这一原则并不取决于框架,而只取决于理论。   定义trainable=false时,表示不应更新权重

这意味着中间层必须只计算相对于输入的梯度,因为其中一个权重是无用的,仅当它们被计算时,什么也得不到,并且可训练标志将不存在。因为梯度必须继续传播,所以它们相对于入口进行计算

第一层还具有特殊性,即输入是您的数据,因此无需继续传播,因此如果trainable=false,则无需执行任何操作

在Tensorflow中,可训练标志将变量添加或不添加到GraphKeys.trainable_VARIABLES集合中,这样就可以考虑它们,也可以不考虑它们

要仅进行训练,必须在嵌入层中将可训练标志设置为True。但他会从一开始就训练- 为了初始化矩阵,你可以使用你所考虑的,你有 这里举一个例子: 哪里 谷歌使用了300个否定词,也只使用了 它们是从原始矩阵中使用的。在嵌入构造函数类权重=[…]中使用权重参数。这个矩阵的大小应该是嵌入的字数x维数。 在Keras中,任何具有参数的层都可以训练或不训练。 当您仅希望训练仅完全连接的层子集等以避免参数爆炸时,此标志非常有用

当设置为可培训=真时:

如果该层位于网络的中间,则仅传播该层。 输入梯度,但不更正任何权重。 如果该层是网络的第一层,则不会传播任何梯度。 例如,在嵌入层的情况下,您可以将该层初始化为默认嵌入矩阵gensim Gooogle300Negative

当你激活这个层中的可训练的时候,你会为Keras提供点阵布兰奇来调整你的嵌入。这也意味着必须优化更多的参数

在某些情况下,由于涉及成本或需要保存,对修改初始嵌入没有兴趣

编辑: 该任务对应于Keras内部的Tensorflow。但这一原则并不取决于框架,而只取决于理论。   定义trainable=false时,表示不应更新权重

这意味着中间层必须只进行校准 计算相对于输入的梯度,因为其中一个权重是无用的,仅当它们被计算时,不会获得任何结果,并且不存在可训练标志。因为梯度必须继续传播,所以它们相对于入口进行计算

第一层还具有特殊性,即输入是您的数据,因此无需继续传播,因此如果trainable=false,则无需执行任何操作


在Tensorflow中,可训练标志将变量添加或不添加到GraphKeys.trainable_VARIABLES集合中,这样就可以考虑它们,也可以不考虑它们

我建议您使用fastText的gensim实现来训练您自己的单词嵌入。这应该比您自己的Keras实现更简单、更快。您可以从加载预训练模型开始,然后使用自己的数据继续训练

from gensim.models import FastText

model = FastText.load_fasttext_format('cc.en.300.bin')

data = [['Hello', 'world'], ...] # Your own training data, a list of sentences
model.build_vocab(data, update=True)
model.train(sentences=data, 
            total_examples=model.corpus_count,
            epochs=5)

编辑:如果您想在Keras中实现您自己的模型,您确实可以使用嵌入层trainable=True,这是您建议的默认行为

我建议您使用fastText的gensim实现来训练您自己的单词嵌入。这应该比您自己的Keras实现更简单、更快。您可以从加载预训练模型开始,然后使用自己的数据继续训练

from gensim.models import FastText

model = FastText.load_fasttext_format('cc.en.300.bin')

data = [['Hello', 'world'], ...] # Your own training data, a list of sentences
model.build_vocab(data, update=True)
model.train(sentences=data, 
            total_examples=model.corpus_count,
            epochs=5)

编辑:如果您想在Keras中实现您自己的模型,您确实可以使用嵌入层trainable=True,这是您建议的默认行为

+1那么这段代码实际上是在根据新的训练数据更新预训练的fasttext嵌入的权重?是的。如果你有很多数据,你也可以尝试从头开始训练你自己的模型。你的意思是说,除非我使用tensorlfow开发自己的实现,否则Keras在默认情况下没有用于训练自定义单词嵌入的类似功能吗?为什么EmbeddedinTrainable=True不起作用?Keras也可以使用您建议的嵌入层。但是,您需要对数据进行更多的预处理,因为您不能像在Gensim中那样只传入一个单词列表。您需要将每个单词编码为整数索引。此外,您需要创建共享相同上下文以及随机对的单词对,然后在嵌入层的顶部创建一个分类器来区分差异。我曾尝试用Keras和Gensim来训练我自己的嵌入,Gensim的实现速度更快,实际上在我的例子中也提供了更好的嵌入。我认为这在line model.build_vocabdata,update=True中有所涉及。但我自己并没有尝试过,我只是尝试从头开始训练。+1所以这段代码实际上是在根据新的训练数据更新预训练的fasttext嵌入的权重?是的,没错。如果你有很多数据,你也可以尝试从头开始训练你自己的模型。你的意思是说,除非我使用tensorlfow开发自己的实现,否则Keras在默认情况下没有用于训练自定义单词嵌入的类似功能吗?为什么EmbeddedinTrainable=True不起作用?Keras也可以使用您建议的嵌入层。但是,您需要对数据进行更多的预处理,因为您不能像在Gensim中那样只传入一个单词列表。您需要将每个单词编码为整数索引。此外,您需要创建共享相同上下文以及随机对的单词对,然后在嵌入层的顶部创建一个分类器来区分差异。我曾尝试用Keras和Gensim来训练我自己的嵌入,Gensim的实现速度更快,实际上在我的例子中也提供了更好的嵌入。我认为这在line model.build_vocabdata,update=True中有所涉及。但我自己并没有试过,我只是从零开始训练。当你设置为可训练的=真的时,你能详细说明下面的内容吗?如果这个层在网络的中间,这只会传播输入梯度,但不能纠正任何重量。如果该层是网络的第一层,则不会传播任何梯度。是否有任何keras文档支持此规则?我已更新了答案。如果你注意到在这两种情况下的行为是相同的,第一层永远不会传播到输入,这是无用的,也是计算一个永远不会被使用的导数的成本。当你设置为可训练=真时,你可以详细说明下面的内容:如果该层在网络的中间,那么只传播输入梯度,但不纠正任何权重。如果该层是网络的第一层,则不会传播任何梯度。是否有任何keras文档支持此规则?我已更新了答案。如果您注意到这两种情况下的行为是相同的,那么第一层永远不会传播到输入端,这是无用的,并且在计算一个永远不会使用的导数时会产生成本。