heshenghuan / linear_chain_crf

A HMM-like linear-chain CRF, used Tensorflow API. :hatching_chick:
37 stars 13 forks source link

发射概率矩阵的行数为什么是self.feat_size + 1? #4

Open blueskydavie opened 6 years ago

blueskydavie commented 6 years ago

请问 with tf.name_scope('weights'): self.W = tf.get_variable( shape=[self.feat_size + 1, self.nb_classes], initializer=tf.truncated_normal_initializer(stddev=0.01), name='weights'

regularizer=tf.contrib.layers.l2_regularizer(0.001)

) 这里为什么是self.feat_size + 1呢?不应该就是self.feat_size吗?非常感谢。

heshenghuan commented 6 years ago

主要原因是,特征号在预处理统计阶段是从1开始的,而0被设计为padding占位符。 因为padding数据时,使用0表示占位数据,对应的激活的特征号也会为0,所以+1是为了防止shape的错误。

blueskydavie commented 6 years ago

运行crf_tagger.py的时候,发射概率矩阵的行设置为self.feat_size ,而不是self.feat_size+1,程序也是可以跑通的,不知道这种不加一的情况和加一的情况 有什么区别呢? 在训练出来的模型的准确率等方面没有什么区别吧?谢谢

heshenghuan commented 6 years ago

@blueskydavie 不太明白在运行crf_tagger.py时设置发射矩阵时如何进行的。可否详细一些?

blueskydavie commented 6 years ago

我表述的不太清楚,是那个权重矩阵 初始化的时候,把+1去掉了,如下 ,其他代码没有变,这样程序也是可以跑通的。
with tf.name_scope('weights'): self.W = tf.get_variable(

shape=[self.feat_size + 1, self.nb_classes],
            shape=[self.feat_size, self.nb_classes],
            initializer=tf.truncated_normal_initializer(stddev=0.01),
            name='weights'
            # regularizer=tf.contrib.layers.l2_regularizer(0.001)
        )
heshenghuan commented 6 years ago

@blueskydavie 你好,我去查看了以下lib中的相关代码,发现确实特征的编号是从0开始的。而我却忘记了0号特征已经存在于特征表中,所以这里的+1是没有必要的。

具体代码可以查看 ContextFeatureExtractor/src/pretreatment.py中的第一个函数。

这一部分的错误很快会被修复。十分感谢。