代码之家  ›  专栏  ›  技术社区  ›  Swamy

如何建立深度学习模型,从几个不同的袋子中挑选单词,形成一个有意义的句子[结束]

  •  -2
  • Swamy  · 技术社区  · 6 年前

    Image of Bags and how to choose from them

    想象一下,我有10个袋子,一个接一个地订购。ie包1、包2。。。。。。。。。袋子,袋子。

    每个袋子都有不同的单词集。

    为了了解什么是包, 假设我们有10000个单词的词汇量。 第一个袋子里写着“你好,印度,经理”。

    ie袋1在袋中的单词索引处有1。 示例:1号袋的尺寸为10000*1 如果Hello指数为1,则India指数为2,Manager指数为4 会的 [0,1,1,0,1,0,0,0,0………]

    *我还没有模型。 *我想用故事书,但对我来说还是有点抽象。

    必须从每个袋子中选择一个单词,并分配一个数字单词1(袋子1中的单词) 单词2(来自第二袋的单词),它们必须按数字顺序组成一个有意义的句子。!

    2 回复  |  直到 6 年前
        1
  •  4
  •   Damien W    6 年前

    首先,我们需要一种计算机能够识别单词的方法,否则它就无法选择正确的单词。这意味着在这个阶段,我们需要决定我们要从什么开始教计算机(即什么是动词、名词、语法),但我假设我们会将一本词典放入其中,除了单词本身之外,不提供任何信息。

    为了让计算机能够计算出句子是什么,我们需要将它们转换成数字(一种方法是从1开始按字母顺序工作,将它们用作字典的键(这次是数字(!))将单词作为值)。现在我们可以将同样的线性代数技术应用于这个问题,就像其他任何问题一样。

    因此,我们需要将几代权重矩阵相乘到字典的键中,然后移除字典键范围之外的所有权重,其余的可以用来获取字典中的值并生成一个句子。也可以选择使用阈值来获取矩阵乘法的所有输出

    现在来看最难的部分:学习。一旦你有了几个(比如100个)矩阵,我们就需要“培育”最好的矩阵(这是需要人工干预的地方),你需要挑选50个最有意义的句子(一开始可能很难),并用它们来为你接下来的100个矩阵打下基础(最简单的方法是随机加权50个矩阵的加权平均值100次)。

    令人厌烦的是,不断重复几代人,直到你的句子大部分时间都是有意义的(当然,不能保证它总是有意义的,但这是安的本性)

    如果你发现它不起作用,你可以使用更多的层(更多的矩阵)和/或我最近听说的一种动态改变网络的不同技术,但我真的无能为力。

        2
  •  3
  •   Daniel Möller    6 年前

    有一个 database 有成千上万的有效句子。

    创建一个字典,其中每个单词表示一个数字(0表示“无”,1表示“句子开头”,2表示“句子结尾”)。

    word_dic = { "_nothing_": 0, "_start_": 1, "_end_": 2, "word1": 3, "word2": 4, ...}
    reverse_dic = {v:k for k,v in word_dic.items()}
    

    记住添加 "_start_" "_end_" 在数据库中所有句子的开头和结尾,以及 "_nothing_" 在结束后完成所需的长度,能够容纳所有句子。(理想情况下,使用10个或更少单词的句子,这样你的模型就不会试图创建更大的句子)。

    将所有句子转换为索引序列:

     #supposing you have an array of shape (sentences, length) as string:
     indices = []
     for word in database.reshape((-1,)):
         indices.append(word_dic[word])
     indices = np.array(indices).reshape((sentences,length))
    

    使用keras函数将其转换为分类词 to_categorical()

     cat_sentences = to_categorical(indices) #shape (sentences,length,dictionary_size)
    

    提示:keras有很多有用的文本预处理函数 here

    单独的培训输入和输出数据:

    #input is the sentences except for the last word
    x_train = cat_sentences[:,:-1,:]
    y_train = cat_sentences[:,1:,:]
    

    让我们创建一个基于LSTM的模型,该模型将根据前面的单词预测下一个单词:

    model = Sequential()
    model.add(LSTM(dontKnow,return_sequences=True,input_shape=(None,dictionary_size)))
    model.add(.....)
    model.add(LSTM(dictionary_size,return_sequences=True,activation='sigmoid')) 
       #or a Dense(dictionary_size,activation='sigmoid')
    

    编译此模型并使其适合 x_train y_train :

    model.compile(....)
    model.fit(x_train,y_train,....)
    

    使用创建相同的模型 stateful=True 总共 LSTM 图层:

    newModel = ...... 
    

    传递训练模型的权重:

    newModel.set_weights(model.get_weights())
    

    以分类的方式创建您的包,塑造 (10, dictionary_size)

    使用该模型从 _start_ 单词

    #reset the states of the stateful model before you start a 10 word prediction:
    newModel.reset_states()
    
    firstWord = newModel.predict(startWord) #startword is shaped as (1,1,dictionary_size)
    

    这个 firstWord 将是具有大小的向量 dictionary_size 告诉(某种程度上)每个现有单词的概率。与袋子里的单词进行比较。您可以选择最高概率,或者如果包中其他单词的概率也很好,可以使用一些随机选择。

    #example taking the most probable word:
    firstWord = np.array(firstWord == firstWord.max(), dtype=np.float32)
    

    再次执行相同操作,但现在输入 第一个字 在模型中:

    secondWord = newModel.predict(firstWord) #respect the shapes
    

    重复这个过程直到你得到一个句子。请注意,您可能会发现 _end_ 在袋子里的10个字都满足之前。你可能会决定用一个较短的句子来完成这个过程,尤其是在其他单词概率较低的情况下。