如何在张量流 keras 中使用 CRF?
Posted
技术标签:
【中文标题】如何在张量流 keras 中使用 CRF?【英文标题】:how to use CRF in tensorflow keras? 【发布时间】:2020-02-18 05:45:54 【问题描述】:代码是这样的:
import tensorflow as tf
from keras_contrib.layers import CRF
from tensorflow import keras
def create_model(max_seq_len, adapter_size=64):
"""Creates a classification model."""
# adapter_size = 64 # see - arXiv:1902.00751
# create the bert layer
with tf.io.gfile.GFile(bert_config_file, "r") as reader:
bc = StockBertConfig.from_json_string(reader.read())
bert_params = map_stock_config_to_params(bc)
bert_params.adapter_size = adapter_size
bert = BertModelLayer.from_params(bert_params, name="bert")
input_ids = keras.layers.Input(shape=(max_seq_len,), dtype='int32', name="input_ids")
# token_type_ids = keras.layers.Input(shape=(max_seq_len,), dtype='int32', name="token_type_ids")
# output = bert([input_ids, token_type_ids])
bert_output = bert(input_ids)
print("bert_output.shape: ".format(bert_output.shape)) # (?, 100, 768)
crf = CRF(len(tag2idx))
logits = crf(bert_output)
model = keras.Model(inputs=input_ids, outputs=logits)
model.build(input_shape=(None, max_seq_len))
# load the pre-trained model weights
load_stock_weights(bert, bert_ckpt_file)
# freeze weights if adapter-BERT is used
if adapter_size is not None:
freeze_bert_layers(bert)
model.compile('adam', loss=crf.loss_function, metrics=[crf.accuracy])
model.summary()
return model
我正在使用 tensorflow keras 并且还使用 keras_contrib 包来进行 NER。看来 tensorflow keras 包不能很好地与 keras_contrib 包配合使用。
Traceback 信息如下:
Traceback (most recent call last):
File "F:/_gitclone3/bert_examples/bert_ner_example_eval.py", line 120, in <module>
model = create_model(max_seq_len, adapter_size=adapter_size)
File "F:/_gitclone3/bert_examples/bert_ner_example_eval.py", line 101, in create_model
logits = crf(bert_output)
File "C:\Users\yuexiang\Anaconda3\lib\site-packages\keras\engine\base_layer.py", line 443, in __call__
previous_mask = _collect_previous_mask(inputs)
File "C:\Users\yuexiang\Anaconda3\lib\site-packages\keras\engine\base_layer.py", line 1311, in _collect_previous_mask
mask = node.output_masks[tensor_index]
AttributeError: 'Node' object has no attribute 'output_masks'
如何在 tensorflow keras 中使用 CRF?
【问题讨论】:
【参考方案1】:我遇到了类似的问题,并花了很多时间试图让事情正常进行。以下是使用 python 3.6.5 对我有用的方法:
序列评估:
pip install seqeval==0.0.5
Keras:
pip install keras==2.2.4
Keras-contrib (2.0.8):
git clone https://www.github.com/keras-team/keras-contrib.git
cd keras-contrib
python setup.py install
TensorFlow:
pip install tensorflow==1.14.0
执行pip list
以确保您实际安装了这些版本(例如pip seqeval
可能会自动更新您的keras)
然后在你的代码中像这样导入:
from keras.models import *
from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional, Input
from keras_contrib.layers import CRF
#etc.
希望这会有所帮助,祝你好运!
【讨论】:
谢谢。我的意思是使用 tensorflow.keras 和 crf,而不是 keras 和 keras_contrib.crf。 keras 和 keras_contrib.crf 可以工作,但是带有 keras_contrib.crf 的 tensorflow.keras 不能工作。我正在使用使用 tensorflow.keras 而不是 keras 的 bert-for-tf2,所以我希望 crf 包可以很好地与 tensorflow.keras 配合使用。 在我看来,这与您原来的问题完全不同。无论如何,错误“AttributeError:'Node'对象没有属性'output_masks'”显然是因为不兼容的keras/keras contrib/tensorflow版本(***.com/questions/51821537/…)。所以现在你可能不得不使用 keras/tensorflow 的版本,并希望得到一些工作或等待开发人员解决这个问题。【参考方案2】:您可以尝试使用 tensorflow 插件。(如果您使用的是 tensorflow 版本 2)。 你可以试试tf-crf-layer(如果你使用的是tensorflow==1.15.0)
【讨论】:
欢迎。请根据How do I write a good answer?编辑您的答案。【参考方案3】:他们在README 上提到了它。
git clone https://www.github.com/keras-team/keras-contrib.git
cd keras-contrib
python convert_to_tf_keras.py
USE_TF_KERAS=1 python setup.py install
【讨论】:
以上是关于如何在张量流 keras 中使用 CRF?的主要内容,如果未能解决你的问题,请参考以下文章