linear_chain_crf icon indicating copy to clipboard operation
linear_chain_crf copied to clipboard

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

Open blueskydavie opened this issue 7 years ago • 5 comments

请问 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吗?非常感谢。

blueskydavie avatar Feb 05 '18 11:02 blueskydavie

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

heshenghuan avatar Feb 05 '18 12:02 heshenghuan

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

blueskydavie avatar Feb 08 '18 12:02 blueskydavie

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

heshenghuan avatar Feb 08 '18 15:02 heshenghuan

我表述的不太清楚,是那个权重矩阵 初始化的时候,把+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) )

blueskydavie avatar Feb 09 '18 03:02 blueskydavie

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

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

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

heshenghuan avatar Feb 09 '18 07:02 heshenghuan