微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

层模型需要 3 个输入,但它收到 1 个输入张量 - 尝试拟合模型时出现错误

如何解决层模型需要 3 个输入,但它收到 1 个输入张量 - 尝试拟合模型时出现错误

我正在使用 BERT 嵌入和 TensorFlow 建立一个简单的网络欺凌检测模型。我的数据集有两列(标签和文本)。这是一个二元分类问题,因为 0 表示一条推文是骚扰性的,而 1 是中性的。
您可以找到我使用的 alter_data 数据集 here。可以找到原始数据集here。 按照 TensorFlow documentation 微调 BERT,我构建了以下模型:

!git clone --depth 1 -b v2.3.0 https://github.com/tensorflow/models.git
!pip install -Uqr models/official/requirements.txt

此后,需要重新启动运行时。然后执行下面的代码

import sys
sys.path.append('models')
import tensorflow as tf
import tensorflow_hub as tf_hub

import numpy as np
import pandas as pd
import sklearn

from official.nlp.data import classifier_data_lib
from official.nlp.bert import tokenization
from official.nlp import optimization
from sklearn.model_selection import train_test_split

df = pd.read_csv('altered_data.csv',encoding='utf-8')
train_df,remaining = train_test_split(df,random_state=42,train_size=0.90,stratify=df.sentiment.values)
valid_df,_ = train_test_split(remaining,stratify=remaining.sentiment.values)
train_df.shape,valid_df.shape
with tf.device('/cpu:0'):
  train_data = tf.data.Dataset.from_tensor_slices((train_df['sentiment'].values,train_df['tweet'].values))
  valid_data = tf.data.Dataset.from_tensor_slices((valid_df.sentiment.values,valid_df.tweet.values))

  for label,text in train_data.take(1):
    print(label)
    print(text)

  for label,text in valid_data.take(1):
    print(label)
    print(text)  

label_list = [0,1]
max_seq_length = 128
train_batch_size = 32

bert_layer = tf_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)

def to_feature(text,label,label_list=label_list,max_seq_length=max_seq_length,tokenizer=tokenizer):
  example = classifier_data_lib.InputExample(guid=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)

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

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

  return (label,x)

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)
  .batch(32,drop_remainder=True)
  .prefetch(tf.data.experimental.AUTOTUNE))

训练数据张量规范

train_data.element_spec

tensorSpecResult


创建模型代码

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,name="input_mask")
  input_type_ids = tf.keras.layers.Input(shape=(max_seq_length,name="input_type_ids")
  
  pooled_output,sequence_output = bert_layer([input_word_ids,input_type_ids])
  drop = tf.keras.layers.Dropout(0.4)(pooled_output)
  output = tf.keras.layers.Dense(1,activation='sigmoid',name="output")(drop)

  model = tf.keras.Model(
      inputs={
          'input_word_ids': input_word_ids,'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.BinaryCrossentropy(),metrics=[tf.keras.metrics.BinaryAccuracy()])
model.summary()

model summary


index


epoch = 4
history = model.fit(train_data,validation_data=valid_data,epochs=epoch,verbose=1)

引发以下错误

error1


error2


我仍然是 TensorFlow 的初学者。据我了解,在获取输入时,dropout 层和密集层之间存在问题。但是,我无法弄清楚需要做什么才能解决这个问题。任何帮助将不胜感激!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。