Python 稀疏分类交叉熵()缺少2个必需的位置参数:';是真的';和';y#u pred';

Python 稀疏分类交叉熵()缺少2个必需的位置参数:';是真的';和';y#u pred';,python,deep-learning,nlp,lstm,bert-language-model,Python,Deep Learning,Nlp,Lstm,Bert Language Model,我想使用Bert语言模型来训练一个多类文本分类任务。以前我使用LSTM进行训练时没有任何错误,但伯特给了我这个错误。我得到这个错误如下,我真的不知道如何解决它,有人能帮我吗 不幸的是,在keras库中使用Bert的文档很少 错误: TypeError Traceback (most recent call last) <ipython-input-177-7b203e5e7f55> in <module>()

我想使用Bert语言模型来训练一个多类文本分类任务。以前我使用LSTM进行训练时没有任何错误,但伯特给了我这个错误。我得到这个错误如下,我真的不知道如何解决它,有人能帮我吗

不幸的是,在keras库中使用Bert的文档很少

错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-177-7b203e5e7f55> in <module>()
      3 
      4 model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 2e-5),
----> 5               loss = tf.keras.losses.sparse_categorical_crossentropy(from_logits=True),
      6               metrics = [tf.keras.metrics.categorical_accuracy()])
      7 model.summary

/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py in wrapper(*args, **kwargs)
    199     """Call target, and fall back on dispatchers if there is a TypeError."""
    200     try:
--> 201       return target(*args, **kwargs)
    202     except (TypeError, ValueError):
    203       # Note: convert_to_eager_tensor currently raises a ValueError, not a

TypeError: sparse_categorical_crossentropy() missing 2 required positional arguments: 'y_true' and 'y_pred'
SEARCH
从TensorFlow Hub下载预先训练的BERT模型


label_list = [0.0, 1.0, 2.0] # Label categories
max_seq_length = 64  # maximum length of (token) input sequences
train_batch_size = 32



# Get BERT layer and tokenizer:
# More details here: https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/2

bert_layer = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/2",
                            trainable= True)
vocab_file = bert_layer.resolved_object.vocab_file.asset_path.numpy()
do_lower_case = bert_layer.resolved_object.do_lower_case.numpy()
tokenizer = tokenization.FullTokenizer(vocab_file, do_lower_case)

tokenizer.wordpiece_tokenizer.tokenize('Hi, how are you doing?')

BERT的标记化和预处理文本

# This provides a function to convert row to input features and label

def to_feature(text, label, label_list=label_list, max_seq_length=max_seq_length, tokenizer=tokenizer):
  example = classifier_data_lib.InputExample(quit = None,
                                             text_a= text.numpy(),
                                             text_b= None,
                                             label= label.numpy())
  feature = classifier_data_lib.convert_single_example(0, example, label_list, max_seq_length,tokenizer)
  return (feature.input_ids, feature.input_mask, feature.segment_ids, feature.label_id )
将Python函数包装到TensorFlow op中,以便立即执行

def to_feature_map(text, label):
  input_ids, input_mask, input_type_ids, label_id = tf.py_function(to_feature,
                                                                inp = [text, label],
                                                                Tout = [tf.int32,
                                                                        tf.int32,
                                                                        tf.int32,
                                                                        tf.int32])
  input_ids.set_shape([max_seq_length])
  input_mask.set_shape([max_seq_length])
  input_type_ids.set_shape([max_seq_length])
  label_id.set_shape([])

  x= {
      'input_word_ids':input_ids,
      'input_mask' : input_mask,
      'input_type_ids' : input_type_ids,

  }
  return (x, label_id)
使用tf.data创建TensorFlow输入管道

with tf.device('/cpu:0'):
  train_data = (train_data.map(to_feature_map,
                               num_parallel_calls = tf.data.experimental.AUTOTUNE)
  .shuffle(1000)
  .batch(32, drop_remainder = True)
  .prefetch(tf.data.experimental.AUTOTUNE))
 

 
  valid_data = (valid_data.map(to_feature_map,
                               num_parallel_calls = tf.data.experimental.AUTOTUNE)
  .shuffle(1000)
  .batch(32, drop_remainder = True)
  .prefetch(tf.data.experimental.AUTOTUNE))
  

将分类标头添加到BERT层

def create_model():
  input_word_ids = tf.keras.layers.Input(shape=(max_seq_length,), dtype=tf.int32,
                                       name="input_word_ids")
  input_mask = tf.keras.layers.Input(shape=(max_seq_length,), dtype=tf.int32,
                                   name="input_mask")
  input_type_ids = tf.keras.layers.Input(shape=(max_seq_length,), dtype=tf.int32,
                                    name="input_type_ids")
  
  pooled_output, sequence_output = bert_layer([input_word_ids, input_mask, input_type_ids])

  drop = tf.keras.layers.Dropout(0.5)(pooled_output)
  output = tf.keras.layers.Dense(3, activation='softmax',name = "output")(drop)

  model = tf.keras.Model(
      inputs = {
          'input_word_ids':input_word_ids,
          'input_mask' : input_mask,
          'input_type_ids' : input_type_ids},
           outputs = output)
  return model
文本分类的微调



model = create_model()

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 2e-5),
              loss = tf.keras.losses.sparse_categorical_crossentropy(),
              metrics = [tf.keras.metrics.categorical_accuracy()])
model.summary

可使用以下方法解决此问题:

model = create_model()

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 2e-5),
              loss = tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics = [tf.keras.metrics.Accuracy()])
model.summary()

model = create_model()

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 2e-5),
              loss = tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics = [tf.keras.metrics.Accuracy()])
model.summary()