У меня есть моя функция кодирования, которая выглядит следующим образом:
from transformers import BertTokenizer, BertModel
MODEL = 'bert-base-multilingual-uncased'
tokenizer = BertTokenizer.from_pretrained(MODEL)
def encode(texts, tokenizer=tokenizer, maxlen=10):
# import pdb; pdb.set_trace()
inputs = tokenizer.encode_plus(
texts,
return_tensors='tf',
return_attention_masks=True,
return_token_type_ids=True,
pad_to_max_length=True,
max_length=maxlen
)
return inputs['input_ids'], inputs["token_type_ids"], inputs["attention_mask"]
Я хочу закодировать свои данные на лету, выполнив это:
x_train = (tf.data.Dataset.from_tensor_slices(df_train.comment_text.astype(str).values)
.map(encode))
Однако, это бросает ошибка:
ValueError: Input is not valid. Should be a string, a list/tuple of strings or a list/tuple of integers.
Теперь, насколько я понимаю, когда я установил точку останова внутри encode
, это произошло потому, что я отправлял массив не numpy. Как заставить преобразователи с обнимающимися лицами хорошо играть со строками тензорного потока в качестве входных данных?
Если вам нужен фиктивный фрейм данных, вот он:
df_train = pd.DataFrame({'comment_text': ['Today was a good day']*5})
Что я пробовал
Итак Я попытался использовать from_generator
, чтобы я мог разобрать строки в функции encode_plus
. Однако это не работает с TPU.
AUTO = tf.data.experimental.AUTOTUNE
def get_gen(df):
def gen():
for i in range(len(df)):
yield encode(df.loc[i, 'comment_text']) , df.loc[i, 'toxic']
return gen
shapes = ((tf.TensorShape([maxlen]), tf.TensorShape([maxlen]), tf.TensorShape([maxlen])), tf.TensorShape([]))
train_dataset = tf.data.Dataset.from_generator(
get_gen(df_train),
((tf.int32, tf.int32, tf.int32), tf.int32),
shapes
)
train_dataset = train_dataset.batch(BATCH_SIZE).prefetch(AUTO)
Информация о версии:
transformers.__version__, tf.__version__
=> ('2.7.0', '2.1.0')