Machine learning 使用预先训练好的word2vec和LSTM生成单词

Machine learning 使用预先训练好的word2vec和LSTM生成单词,machine-learning,neural-network,keras,lstm,word2vec,Machine Learning,Neural Network,Keras,Lstm,Word2vec,LSTM/RNN可用于文本生成。 展示了为Keras模型使用预先训练的手套单词嵌入的方法 如何在Keras LSTM中使用预先训练好的Word2Vec单词嵌入 模型波斯特确实帮了忙 当模型以单词序列作为输入时,如何预测/生成下一个单词 尝试的示例方法: # Sample code to prepare word2vec word embeddings import gensim documents = ["Human machine interface for lab abc compu

LSTM/RNN可用于文本生成。 展示了为Keras模型使用预先训练的手套单词嵌入的方法

  • 如何在Keras LSTM中使用预先训练好的Word2Vec单词嵌入 模型波斯特确实帮了忙
  • 当模型以单词序列作为输入时,如何预测/生成下一个单词
  • 尝试的示例方法:

    # Sample code to prepare word2vec word embeddings    
    import gensim
    documents = ["Human machine interface for lab abc computer applications",
                 "A survey of user opinion of computer system response time",
                 "The EPS user interface management system",
                 "System and human system engineering testing of EPS",
                 "Relation of user perceived response time to error measurement",
                 "The generation of random binary unordered trees",
                 "The intersection graph of paths in trees",
                 "Graph minors IV Widths of trees and well quasi ordering",
                 "Graph minors A survey"]
    sentences = [[word for word in document.lower().split()] for document in documents]
    
    word_model = gensim.models.Word2Vec(sentences, size=200, min_count = 1, window = 5)
    
    # Code tried to prepare LSTM model for word generation
    from keras.layers.recurrent import LSTM
    from keras.layers.embeddings import Embedding
    from keras.models import Model, Sequential
    from keras.layers import Dense, Activation
    
    embedding_layer = Embedding(input_dim=word_model.syn0.shape[0], output_dim=word_model.syn0.shape[1], weights=[word_model.syn0])
    
    model = Sequential()
    model.add(embedding_layer)
    model.add(LSTM(word_model.syn0.shape[1]))
    model.add(Dense(word_model.syn0.shape[0]))   
    model.add(Activation('softmax'))
    model.compile(optimizer='sgd', loss='mse')
    
    培训LSTM和预测的样本代码/伪代码将受到欢迎

    我创建了一个简单的生成器,它建立在您最初想法的基础上:它是一个连接到预先训练好的单词2VEC嵌入的LSTM网络,经过训练可以预测句子中的下一个单词。数据是最重要的

    我将在这里强调最重要的部分

    Gensim Word2Vec 除了训练代码的迭代次数外,您的代码很好。默认的
    iter=5
    似乎相当低。此外,这绝对不是瓶颈——LSTM培训需要更长的时间<代码>iter=100看起来更好

    word\u model=gensim.models.Word2Vec(句子,大小=100,最小计数=1,
    窗口=5,iter=100)
    预训练权重=word\u model.wv.syn0
    vocab_尺寸,emdedding_尺寸=预训练的重量.shape
    打印('结果嵌入形状:',预训练的权重.shape)
    打印('检查相似单词:')
    对于['model'、'network'、'train'、'learn']中的单词:
    most_相似=','。连接(“%s(%.2f)”(相似,距离)
    对于相似,请在word模型中显示距离。最相似(word)[:8])
    打印(“%s->%s%”(word,最相似))
    def word2idx(word):
    返回word_model.wv.vocab[word].index
    定义idx2word(idx):
    返回单词\u model.wv.index2word[idx]
    
    结果嵌入矩阵被保存到
    预训练权重
    数组中,该数组具有形状
    (vocab\u大小,emdedding\u大小)

    凯拉斯模型 除了loss函数外,您的代码几乎是正确的。由于模型预测下一个单词,这是一项分类任务,因此损失应该是
    category\u crossentropy
    sparse\u category\u crossentropy
    。出于效率考虑,我选择了后者:这种方式避免了一个热编码,这对于一个庞大的词汇表来说是相当昂贵的

    model=Sequential()
    添加(嵌入(输入尺寸=声音尺寸,输出尺寸=嵌入尺寸,
    权重=[预训练的_权重])
    模型添加(LSTM(单位=EMD尺寸))
    模型.添加(密度(单位=声纳大小))
    添加(激活('softmax'))
    compile(优化器='adam',loss='sparse\u categorical\u crossentropy')
    
    注意将预先训练的权重传递给
    权重

    数据准备 为了处理
    sparse\u categorical\u crossentropy
    loss,句子和标签都必须是单词索引。短句必须用零填充到一般长度

    train\u x=np.zero([len(句子),max\u句子,dtype=np.int32)
    序列y=np.zero([len(句子)],dtype=np.int32)
    对于i,枚举中的句子(句子):
    对于t,枚举中的单词(句子[:-1]):
    列x[i,t]=word2idx(word)
    序列y[i]=word2idx(句子[-1])
    
    样本生成 这很简单:模型输出概率向量,下一个单词被采样并附加到输入中。请注意,如果对下一个单词进行采样,而不是选择
    argmax
    ,则生成的文本会更好、更多样化。我使用的基于温度的随机抽样是

    def样本(preds,温度=1.0): 中频温度深卷积算法初始化步长无偏有效性 简单有效…->简单有效的变量族防止自动计算 非凸…->一个非凸的比较层收敛到如此独立的隐马尔可夫 a、 ..->一个函数参数化必须同时具备两种直觉和valpola使用的技术 没有太多的意义,但能够产生至少在语法上合理的句子(有时)


    指向.

    的链接给我的印象是,
    keras.layers.Embedding
    with
    weights
    的格式已被弃用,如果您选中此()和此()@PoeteMaudit,则不会弃用<代码>权重参数由基类
    支持,因此所有层都自动支持()。从2017年起,这也是一种推荐的传递权重的方法()。哎呀,现在还是这样。但是你是对的,
    embeddings\u初始值设定项
    也受支持。谢谢你的否决票!谢谢你的回答。我希望您是对的,
    weights
    参数也被支持(但也是
    可训练的
    参数?)。老实说,我只是否决了你的帖子,因为否则你可能不会在意我的评论。如果我现在可以回来,我会这样做,但您必须编辑StackOverflow的答案,以允许我这样做。我相信答案中的代码是有效的,但如果您觉得一些细节也值得一提,请继续编辑它。这里没问题。老实说,我甚至没有测试
    weights
    参数当前是否有效。我刚刚看到这个人的帖子,他声称它不起作用。在你的帖子中,在结尾至少添加一个更新注释,以告知读者这个(潜在的)变化是很有用的