liyonglion
liyonglion
貌似是在函数调用的时候,在栈上做了特殊处理。当发生函数调用,会检查某些条件(具体啥条件我也不知道),如果触发了该条件,则会调度另外一个G运行。
> > 貌似是在函数调用的时候,在栈上做了特殊处理。当发生函数调用,会检查某些条件(具体啥条件我也不知道),如果触发了该条件,则会调度另外一个G运行。 > > 对的。正是因为依赖函数调用才能实现G的切换,所以如果函数没有发生函数调用(死循环)时,G就无法被抢占,Go在1.14版本实现的抢占式调度正是解决的这个问题。 感谢 @RainbowMango 贡献如此好文,结合你的文章,再看源码如虎添翼
我使用gensim 加载,未解压的模型,报错:utf-8' codec can't decode bytes in position 96-97: unexpected end of data。如何加载这个模型呢?
例如第一次调用embed_sequence函数,传入的第一个参数是[1,2,3,4],返回的值为a。第二次再调用embed_sequence,同样传入[1,2,3,4],返回值b,此时a是不等于的b的吧~ 在问一个问题:在训练解码端,为什么要在target前面添加呢?不能直接使用target作为解码端的input吗?
我写的代码和你的差不多,但是我没有用tf.contrib.layers.embed_sequence,这个,而是使用tf.nn.embedding_lookup,第一个参数我使用变量共享。例如: `def get_embedding(ids): with variable_scope('embedding',reuse=tf.AUTO_REUSE) : embedding = tf.get_variable('vocab', [vocab_size, embedding_size]) return tf.nn.embedding_lookup(embedding, ids) ` 第二个问题:在预测阶段是无法知道target的,也不能添加token,而是直接把编码的最后一个时间步骤 output作为解码的的输入,然后预测的。还是无法理解为什么在训练解码端,给target开头添加一个token。
我并不认为最后的output 等效于单词,从LSTM的原型来看,当前的Ht = f(Ct,Xt),Ct = g(Ct-1,Xt),这里H表示输出,C表示状态,t表示时间步骤。可以从上面的简化公式理解:当前的输出,是综合了上一个状态(可以理解为记忆)和当前的输入,表示当从t0开始到tn输入的“理解”而已,当然可以用来预测当前的时间步输出单词而已,这里的预测也是用类似于全连接层,进行分类而已。
目前我还没有测试。我也是在前天加了token,这个我后面再试。目前我正在做文本摘要,从目前的训练结果来看,可以提取文章的中心思想,但是有些重要的词抓的不准确,有些头疼。不知道如何改进。context-vector这个词用的好传神。如果给一个0向量作为Decoder的启动,那么其实相当于什么input信息都没给他,他能依赖的只有context-vector这句话说的很有些道理。
Thanks for your implementation.