linear_chain_crf

查看属性与别名

API属性:声明式编程(静态图)专用API

paddle.fluid.layers.linear_chain_crf ( input, label, param_attr=None, length=None ) [源代码]

线性链条件随机场(Linear Chain CRF)

条件随机场定义间接概率图,节点代表随机变量,边代表两个变量之间的依赖。CRF学习条件概率

linear_chain_crf - 图1

linear_chain_crf - 图2

是结构性输入,

linear_chain_crf - 图3

为输入标签。

线性链条件随机场(Linear Chain CRF)是特殊的条件随机场(CRF),有利于序列标注任务。序列标注任务不为输入设定许多条件依赖。唯一的限制是输入和输出必须是线性序列。因此类似CRF的图是一个简单的链或者线,也就是线性链随机场(linear chain CRF)。

该操作符实现了线性链条件随机场(linear chain CRF)的前向——反向算法。详情请参照 http://www.cs.columbia.edu/~mcollins/fb.pdfhttp://cseweb.ucsd.edu/~elkan/250Bwinter2012/loglinearCRFs.pdf

长度为L的序列s的概率定义如下:

linear_chain_crf - 图4

其中Z是归一化值,所有可能序列的P(s)之和为1,x是线性链条件随机场(linear chain CRF)的发射(emission)特征权重。

线性链条件随机场最终输出每个batch训练样本的条件概率的对数

1.这里

linear_chain_crf - 图5

代表Emission

2.Transition的第一维度值,代表起始权重,这里用

linear_chain_crf - 图6

表示

3.Transition的下一维值,代表末尾权重,这里用

linear_chain_crf - 图7

表示

4.Transition剩下的值,代表转移权重,这里用

linear_chain_crf - 图8

表示

5.Label用

linear_chain_crf - 图9

表示

注意:

1.条件随机场(CRF)的特征函数由发射特征(emission feature)和转移特征(transition feature)组成。发射特征(emission feature)权重在调用函数前计算,而不在函数里计算。

2.由于该函数对所有可能序列的进行全局正则化,发射特征(emission feature)权重应是未缩放的。因此如果该函数带有发射特征(emission feature),并且发射特征是任意非线性激活函数的输出,则请勿调用该函数。

3.Emission的第二维度必须和标记数字(tag number)相同。

参数

  • input (LoDTensor|Tensor) - 数据类型为float32, float64的Tensor或者LoDTensor。线性链条件随机场的发射矩阵emission。输入为LoDTensor时,是一个shape为[N*D]的2-D LoDTensor,N是每一个batch中batch对应的长度数想加的总数,D是维度。当输入为Tensor时,应该是一个shape为[N x S x D]的Tensor,N是batch_size,S为序列的最大长度,D是维度。
  • label (Tensor|LoDTensor) - 数据类型为int64类型Tensor或者LoDTensor。该值为标签值。输入为LoDTensor时[N x 1],N是mini-batch的总数;输入为Tensor时,[N x S],N为batch数量,S为序列的最大长度。
  • Length (Tensor) - 数据类型为int64类型的Tensor。 shape为[M x 1]的Tensor,M为mini_batch中序列的数量。
  • param_attr (ParamAttr) - 可学习参数的属性,为transition矩阵。详见代码示例。

返回

Emission的指数形式。shape与Emission相同。这是前向计算中的中间计算结果,在反向计算中还会复用。

Transition的指数形式。shape为[(D+2)*D]的二维张量。这是前向计算中的中间计算结果,在反向计算中还会复用。

条件概率的对数形式。每个batch训练样本的条件概率的对数。这是一个shape为[S*1]的二维张量,S是mini-batch的序列数。注:S等于mini-batch的序列数。输出不再是LoDTensor。

返回类型

Emission的指数形式。Variable(Tensor|LoDTensor):数据类型为float32, float64的Tensor或者LoDTensor。

Transition的指数形式。Variable(Tensor|LoDTensor):数据类型为float32, float64的Tensor或者LoDTensor。

条件概率的对数形式。Variable(Tensor):数据类型为float32, float64的Tensor。

代码示例

  1. import paddle.fluid as fluid
  2. import numpy as np
  3. train_program = fluid.Program()
  4. startup_program = fluid.Program()
  5. with fluid.program_guard(train_program, startup_program):
  6. input_data = fluid.layers.data(name='input_data', shape=[10], dtype='float32', lod_level=1)
  7. label = fluid.layers.data(name='label', shape=[1], dtype='int', lod_level=1)
  8. emission= fluid.layers.fc(input=input_data, size=10, act="tanh")
  9. crf_cost = fluid.layers.linear_chain_crf(
  10. input=emission,
  11. label=label,
  12. param_attr=fluid.ParamAttr(
  13. name='crfw',
  14. learning_rate=0.01))
  15. use_cuda = False
  16. place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
  17. exe = fluid.Executor(place)
  18. exe.run(startup_program)
  19. #using LoDTensor, define network
  20. a = fluid.create_lod_tensor(np.random.rand(12,10).astype('float32'), [[3,3,4,2]], place)
  21. b = fluid.create_lod_tensor(np.array([[1],[1],[2],[3],[1],[1],[1],[3],[1],[1],[1],[1]]),[[3,3,4,2]] , place)
  22. feed1 = {'input_data':a,'label':b}
  23. loss= exe.run(train_program,feed=feed1, fetch_list=[crf_cost])
  24. print(loss)
  25. #using padding, define network
  26. train_program = fluid.Program()
  27. startup_program = fluid.Program()
  28. with fluid.program_guard(train_program, startup_program):
  29. input_data2 = fluid.layers.data(name='input_data2', shape=[10,10], dtype='float32')
  30. label2 = fluid.layers.data(name='label2', shape=[10,1], dtype='int')
  31. label_length = fluid.layers.data(name='length', shape=[1], dtype='int')
  32. emission2= fluid.layers.fc(input=input_data2, size=10, act="tanh", num_flatten_dims=2)
  33. crf_cost2 = fluid.layers.linear_chain_crf(
  34. input=emission2,
  35. label=label2,
  36. length=label_length,
  37. param_attr=fluid.ParamAttr(
  38. name='crfw',
  39. learning_rate=0.01))
  40. use_cuda = False
  41. place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
  42. exe = fluid.Executor(place)
  43. exe.run(startup_program)
  44. #define input data
  45. cc=np.random.rand(4,10,10).astype('float32')
  46. dd=np.random.rand(4,10,1).astype('int64')
  47. ll=np.array([[3,3,4,2]])
  48. feed2 = {'input_data2':cc,'label2':dd,'length':ll}
  49. loss2= exe.run(train_program,feed=feed2, fetch_list=[crf_cost2])
  50. print(loss2)
  51. """
  52. output:
  53. [array([[ 7.8902354],
  54. [ 7.3602567],
  55. [ 10.004011],
  56. [ 5.86721 ]], dtype=float32)]
  57. """