modeling.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding:utf-8 -*-
  2. """
  3. Author: BigCat
  4. """
  5. import tensorflow as tf
  6. from tensorflow_addons.text.crf import crf_decode, crf_log_likelihood
  7. # 关闭eager模式
  8. tf.compat.v1.disable_eager_execution()
  9. tf.compat.v1.experimental.output_all_intermediates(True)
  10. class LstmWithCRFModel(object):
  11. """ lstm + crf解码模型
  12. """
  13. def __init__(self, batch_size, n_class, ball_num, w_size, embedding_size, words_size, hidden_size, layer_size):
  14. self._inputs = tf.keras.layers.Input(
  15. shape=(w_size, ball_num), batch_size=batch_size, name="inputs"
  16. )
  17. self._tag_indices = tf.keras.layers.Input(
  18. shape=(ball_num, ), batch_size=batch_size, dtype=tf.int32, name="tag_indices"
  19. )
  20. self._sequence_length = tf.keras.layers.Input(
  21. shape=(), batch_size=batch_size, dtype=tf.int32, name="sequence_length"
  22. )
  23. # 构建特征抽取
  24. embedding = tf.keras.layers.Embedding(words_size, embedding_size)(self._inputs)
  25. first_lstm = tf.convert_to_tensor(
  26. [tf.keras.layers.LSTM(hidden_size)(embedding[:, :, i, :]) for i in range(ball_num)]
  27. )
  28. first_lstm = tf.transpose(first_lstm, perm=[1, 0, 2])
  29. second_lstm = None
  30. for _ in range(layer_size):
  31. second_lstm = tf.keras.layers.LSTM(hidden_size, return_sequences=True)(first_lstm)
  32. self._outputs = tf.keras.layers.Dense(n_class)(second_lstm)
  33. # 构建损失函数
  34. self._log_likelihood, self._transition_params = crf_log_likelihood(
  35. self._outputs, self._tag_indices, self._sequence_length
  36. )
  37. self._loss = tf.reduce_sum(-self._log_likelihood)
  38. # 构建预测
  39. self._pred_sequence, self._viterbi_score = crf_decode(
  40. self._outputs, self._transition_params, self._sequence_length
  41. )
  42. @property
  43. def inputs(self):
  44. return self._inputs
  45. @property
  46. def tag_indices(self):
  47. return self._tag_indices
  48. @property
  49. def sequence_length(self):
  50. return self._sequence_length
  51. @property
  52. def outputs(self):
  53. return self._outputs
  54. @property
  55. def transition_params(self):
  56. return self._transition_params
  57. @property
  58. def loss(self):
  59. return self._loss
  60. @property
  61. def pred_sequence(self):
  62. return self._pred_sequence
  63. class SignalLstmModel(object):
  64. """ 单向lstm序列模型
  65. """
  66. def __init__(self, batch_size, n_class, w_size, embedding_size, hidden_size, outputs_size, layer_size):
  67. self._inputs = tf.keras.layers.Input(
  68. shape=(w_size, ), batch_size=batch_size, dtype=tf.int32, name="inputs"
  69. )
  70. self._tag_indices = tf.keras.layers.Input(
  71. shape=(n_class, ), batch_size=batch_size, dtype=tf.float32, name="tag_indices"
  72. )
  73. embedding = tf.keras.layers.Embedding(outputs_size, embedding_size)(self._inputs)
  74. lstm = tf.keras.layers.LSTM(hidden_size, return_sequences=True)(embedding)
  75. for _ in range(layer_size):
  76. lstm = tf.keras.layers.LSTM(hidden_size, return_sequences=True)(lstm)
  77. final_lstm = tf.keras.layers.LSTM(hidden_size, recurrent_dropout=0.2)(lstm)
  78. self._outputs = tf.keras.layers.Dense(outputs_size, activation="softmax")(final_lstm)
  79. # 构建损失函数
  80. self._loss = - tf.reduce_sum(self._tag_indices * tf.math.log(self._outputs))
  81. # 预测结果
  82. self._pred_label = tf.argmax(self.outputs, axis=1)
  83. @property
  84. def inputs(self):
  85. return self._inputs
  86. @property
  87. def tag_indices(self):
  88. return self._tag_indices
  89. @property
  90. def outputs(self):
  91. return self._outputs
  92. @property
  93. def loss(self):
  94. return self._loss
  95. @property
  96. def pred_label(self):
  97. return self._pred_label