在LDA模型中,每次我在同一个语料库上进行训练时,都会生成不同的主题,通过设置np.random.seed(0),LDA模型将始终以完全相同的方式进行初始化和训练。
来自的Word2Vec模型是否相同gensim?通过将随机种子设置为常数,在同一数据集上运行的不同样本会产生相同的模型吗?
但是奇怪的是,它已经在不同情况下为我提供了相同的矢量。
>>> from nltk.corpus import brown
>>> from gensim.models import Word2Vec
>>> sentences = brown.sents()[:100]
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042, 0.02882229, -0.03625415, -0.03165979, 0.06049283,
0.01207791, 0.04722737, 0.01984878, -0.03026265, 0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042, 0.02882229, -0.03625415, -0.03165979, 0.06049283,
0.01207791, 0.04722737, 0.01984878, -0.03026265, 0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.02596745, 0.01475067, …Run Code Online (Sandbox Code Playgroud) 我试图通过TensorFlow tf.nn.embedding_lookup()函数"从头开始"学习imdb数据集的单词表示.如果我理解正确,我必须在另一个隐藏层之前设置一个嵌入层,然后当我执行渐变下降时,该层将"学习"该层权重中的一个单词表示.但是,当我尝试这样做时,我的嵌入层和网络的第一个完全连接层之间出现了形状错误.
def multilayer_perceptron(_X, _weights, _biases):
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W")
embedding_layer = tf.nn.embedding_lookup(W, _X)
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(embedding_layer, _weights['h1']), _biases['b1']))
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']))
return tf.matmul(layer_2, weights['out']) + biases['out']
x = tf.placeholder(tf.int32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
pred = multilayer_perceptron(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cost)
init = tf.initialize_all_variables()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ValueError: Shapes TensorShape([Dimension(None), Dimension(300), Dimension(128)])
and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
Run Code Online (Sandbox Code Playgroud) python machine-learning python-2.7 tensorflow word-embedding
我一直在阅读一些带有深度学习论文的NLP,并发现微调似乎是一个简单但却令人困惑的概念.这里提出了同样的问题,但仍然不太清楚.
如Y. Kim,"用于句子分类的卷积神经网络"和KS Tai,R.Socher,以及CD Manning,"改进树的语义表示"等论文所述,将预训练的单词嵌入微调到特定于任务的单词嵌入.- 结构化的长期短期记忆网络,"只是简单地提一下,没有详细说明.
我的问题是:
使用word2vec或Glove生成的Word嵌入作为预训练的单词向量用作(X)下游任务的输入要素,如解析或情感分析,这意味着那些输入向量插入到某个特定任务的新神经网络模型中,同时训练这个新模型,不知何故我们可以获得更新的特定于任务的单词嵌入.
但据我所知,在训练过程中,反向传播的作用是更新(W)模型的权重,它不会改变输入特征(X),那么原始单词嵌入的精确程度如何?这些微调的载体来自哪里?
如果我有一个要矢量化的文本字符串,我应该如何处理其中的数字?或者,如果我向神经网络提供数字和单词,我如何将数字保存为数字?
我打算制作一本关于我所有单词的字典(如此处所示).在这种情况下,所有字符串都将成为数字数组.我该如何处理数字字符?如何输出不将单词索引与数字字符混合的向量?
将数字转换为字符串会削弱我为网络提供的信息吗?
我需要问几个关于词嵌入的问题......可能是基本的。
[0 0 0 1 0]转换为嵌入向量时E = [0.2, 0.4, 0.2, 0.2]......结果词向量中的每个索引是否有任何重要性?例如E[1],哪个是 0.2....具体E[1]定义了什么(尽管我知道它基本上是到另一个空间的转换)...或词向量共同定义上下文但不是单独定义...提前致谢
我有以下适用于可变长度输入的顺序模型:
m = Sequential()
m.add(Embedding(len(chars), 4, name="embedding"))
m.add(Bidirectional(LSTM(16, unit_forget_bias=True, name="lstm")))
m.add(Dense(len(chars),name="dense"))
m.add(Activation("softmax"))
m.summary()
Run Code Online (Sandbox Code Playgroud)
给出以下总结:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, None, 4) 204
_________________________________________________________________
bidirectional_2 (Bidirection (None, 32) 2688
_________________________________________________________________
dense (Dense) (None, 51) 1683
_________________________________________________________________
activation_2 (Activation) (None, 51) 0
=================================================================
Total params: 4,575
Trainable params: 4,575
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试在功能 API 中实现相同的模型时,我不知道我尝试了什么,因为输入层形状似乎与顺序模型不同。这是我的尝试之一:
charinput = Input(shape=(4,),name="input",dtype='int32')
embedding = Embedding(len(chars), 4, name="embedding")(charinput)
lstm = Bidirectional(LSTM(16, unit_forget_bias=True, name="lstm"))(embedding)
dense = Dense(len(chars),name="dense")(lstm)
output = Activation("softmax")(dense)
Run Code Online (Sandbox Code Playgroud)
总结如下:
_________________________________________________________________ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些预先训练的向量加载到 gensimWord2Vec模型中,以便可以使用新数据重新训练它们。我的理解是我可以用 进行再培训gensim.Word2Vec.train()。然而,我能找到的加载向量的唯一方法是gensim.models.KeyedVectors.load_word2vec_format('path/to/file.bin', binary=True)创建一个通常是模型wv属性的对象gensim.Word2Vec。但是这个对象本身没有方法train(),而这正是我重新训练向量所需的方法。
那么如何将这些向量转化为实际gensim.Word2Vec模型呢?
我正在尝试使用嵌入和RNN构建翻译网络。我已经训练了Gensim Word2Vec模型,并且可以很好地学习单词联想。但是,我无法理解如何正确地将层添加到Keras模型中。(以及如何对输出进行“反向嵌入”。但这是另一个已回答的问题:默认情况下您不能这样做。)
在Word2Vec中,当您输入一个字符串(例如)时model.wv[‘hello’],将获得该单词的矢量表示。但是,我相信keras.layers.EmbeddingWord2Vec的get_keras_embedding()返回的层采用单键/标记化输入,而不是字符串输入。但是文档没有提供有关适当输入内容的解释。我无法弄清楚如何获得与嵌入层的输入具有1对1对应关系的词汇表的一键式/标记式向量。
以下详细说明:
目前,我的解决方法是在将Keras馈送到网络之前,将其应用于Keras外部。这样做有什么害处吗?无论如何,我都会将嵌入设置为不可训练。到目前为止,我已经注意到内存使用效率非常低(甚至在声明Keras模型以收集64个单词长的句子之前,甚至是50GB)都必须将填充的输入和权重加载到模型外部。也许发电机可以提供帮助。
以下是我的代码。输入被填充为64个字长。Word2Vec嵌入具有300个尺寸。由于尝试反复进行嵌入工作的反复实验,此处可能存在很多错误。欢迎提出建议。
import gensim
word2vec_model = gensim.models.Word2Vec.load(“word2vec.model")
Run Code Online (Sandbox Code Playgroud)
from keras.models import Sequential
from keras.layers import Embedding, GRU, Input, Flatten, Dense, TimeDistributed, Activation, PReLU, RepeatVector, Bidirectional, Dropout
from keras.optimizers import Adam, Adadelta
from keras.callbacks import ModelCheckpoint
from keras.losses import sparse_categorical_crossentropy, mean_squared_error, cosine_proximity
keras_model = Sequential()
keras_model.add(word2vec_model.wv.get_keras_embedding(train_embeddings=False))
keras_model.add(Bidirectional(GRU(300, return_sequences=True, dropout=0.1, recurrent_dropout=0.1, activation='tanh')))
keras_model.add(TimeDistributed(Dense(600, activation='tanh')))
# keras_model.add(PReLU())
# ^ For some reason I get error when I add Activation ‘outside’:
# int() argument …Run Code Online (Sandbox Code Playgroud) 我在gensim训练过word2vec.在Keras,我想用它来制作句子矩阵使用那个词嵌入.由于存储所有句子的矩阵,因此空间和内存效率很低.因此,我想在Keras中实现嵌入层以实现这一点,以便可以在其他层(LSTM)中使用它.你能详细告诉我怎么做吗?
PS:它与其他问题不同,因为我使用gensim进行word2vec训练而不是keras.
给定一个“Roberta 是 BERT 的高度优化版本”类型的句子,我需要使用 RoBERTa 获取该句子中每个单词的嵌入。我试图在网上查看示例代码,但未能找到明确的答案。
我的看法如下:
tokens = roberta.encode(headline)
all_layers = roberta.extract_features(tokens, return_all_hiddens=True)
embedding = all_layers[0]
n = embedding.size()[1] - 1
embedding = embedding[:,1:n,:]
Run Code Online (Sandbox Code Playgroud)
whereembedding[:,1:n,:]用于仅提取句子中单词的嵌入,不包含开始和结束标记。
这是对的吗?
word-embedding ×10
word2vec ×6
gensim ×4
python ×4
keras ×3
nlp ×3
tensorflow ×3
encoding ×1
python-2.7 ×1
random ×1
text-mining ×1