Tensorflow 关于bert的_生成器中的tf.data.Dataset
关于这件事我搜索了一下,但我找不到该怎么办。 通常,它们使用tf.constant或tf.data.TFrecord 我想通过读取csv文件,使用生成器生成输入数据集api。 我试了几个小时,但发生了各种各样的错误。 我混淆了使用输出类型和输出形状 下面是我的代码。 有什么问题吗Tensorflow 关于bert的_生成器中的tf.data.Dataset,tensorflow,dataset,generator,bert-language-model,Tensorflow,Dataset,Generator,Bert Language Model,关于这件事我搜索了一下,但我找不到该怎么办。 通常,它们使用tf.constant或tf.data.TFrecord 我想通过读取csv文件,使用生成器生成输入数据集api。 我试了几个小时,但发生了各种各样的错误。 我混淆了使用输出类型和输出形状 下面是我的代码。 有什么问题吗 import tensorflow as tf print(tf.__version__) import tensorflow_datasets from transformers import * import pa
import tensorflow as tf
print(tf.__version__)
import tensorflow_datasets
from transformers import *
import pandas as pd
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tqdm.notebook import tqdm
# from wandb.keras import WandbCallback
import tensorflow_datasets as tfds
import matplotlib.pyplot as plt
import feed
from feed import *
import time
train_df = pd.read_csv('files/train.csv')
from transformers import AlbertTokenizer, TFAlbertForSequenceClassification
tokenizer = AlbertTokenizer.from_pretrained('albert-base-v2')
model = TFAlbertForSequenceClassification.from_pretrained('albert-base-v2', num_labels=Num_class)
# usually error happened here or next line
train_dataset = create_dataset('files/train.csv',batch_size=32,
tokenizer=tokenizer, max_seq_len=128 )
al_inputs, label = next(iter(train_dataset))
feed.py
def convert_single_example(tokenizer, example, max_seq_length=512):
"""Converts a single `InputExample` into a single `InputFeatures`."""
if isinstance(example, PaddingInputExample):
input_ids = [0] * max_seq_length
input_mask = [0] * max_seq_length
segment_ids = [0] * max_seq_length
label = 0
return input_ids, input_mask, segment_ids, label
tokens_a = tokenizer.tokenize(example.text_a)
if len(tokens_a) > max_seq_length - 2:
tokens_a = tokens_a[0 : (max_seq_length - 2)]
tokens = []
segment_ids = []
tokens.append("[CLS]")
segment_ids.append(0)
for token in tokens_a:
tokens.append(token)
segment_ids.append(0)
tokens.append("[SEP]")
segment_ids.append(0)
#print(tokens)
input_ids = tokenizer.convert_tokens_to_ids(tokens)
# The mask has 1 for real tokens and 0 for padding tokens. Only real
# tokens are attended to.
input_mask = [1] * len(input_ids)
# Zero-pad up to the sequence length.
while len(input_ids) < max_seq_length:
input_ids.append(0)
input_mask.append(0)
segment_ids.append(0)
assert len(input_ids) == max_seq_length
assert len(input_mask) == max_seq_length
assert len(segment_ids) == max_seq_length
return input_ids, input_mask, segment_ids, example.label
def convert_text_to_features(texts, labels, tokenizer, max_seq_len) :
InputExamples = []
# for text, label in zip(texts, labels) :
InputExamples.append(
InputExample(guid=None, text_a=texts, text_b=None, label=labels)
)
input_ids, input_masks, segment_ids, labels = [], [], [], []
for example in (InputExamples) :
input_id, input_mask, segment_id, label = convert_single_example(
tokenizer, example, max_seq_len
)
input_ids.append(input_id)
input_masks.append(input_mask)
segment_ids.append(segment_id)
labels.append(label)
return (np.array(input_ids), np.array(input_masks),np.array(segment_ids)),np.array(labels).reshape(-1, 1)
def read_csvs(csv_files):
sets = []
for csv in csv_files:
file = pandas.read_csv(csv, encoding='utf-8', na_filter=False)
#FIXME: not cross-platform
# csv_dir = os.path.dirname(os.path.abspath(csv))
sets.append(file)
# Concat all sets, drop any extra columns, re-index the final result as 0..N
return pandas.concat(sets, join='inner', ignore_index=True)
def create_dataset(csvs, batch_size, tokenizer, max_seq_len):
print(max_seq_len)
csvs = csvs.split(',')
df = read_csvs(csvs)
def generate_values() :
for _, row in df.iterrows() :
yield convert_text_to_features(row.text, row.label_id,
tokenizer=tokenizer,max_seq_len=max_seq_len)
dataset = tf.data.Dataset.from_generator(generate_values,
output_types=((tf.int32, tf.int32, tf.int32), tf.int32), output_shapes=(tf.TensorShape([1, max_seq_len]), tf.TensorShape([1, max_seq_len]), tf.TensorShape([1, max_seq_len]), tf.TensorShape([1, 1])))
dataset = dataset.shuffle(100, reshuffle_each_iteration = True).repeat(2).batch(batch_size, drop_remainder=True)
return dataset
def convert_single_示例(标记器,示例,max_seq_length=512):
“”“将单个`InputExample`转换为单个`InputFeatures`.”“”
如果isinstance(例如,PaddingInputExample):
输入标识=[0]*最大顺序长度
输入掩码=[0]*最大顺序长度
段ID=[0]*最大顺序长度
标签=0
返回输入标识、输入掩码、段标识、标签
tokens\u a=tokenizer.tokenize(例如.text\u a)
如果len(令牌a)>max_seq_length-2:
令牌\u a=令牌\u a[0:(最大长度-2)]
代币=[]
段_id=[]
标记。追加(“[CLS]”)
段ID.append(0)
对于令牌a中的令牌:
tokens.append(标记)
段ID.append(0)
标记。附加(“[SEP]”)
段ID.append(0)
#打印(代币)
输入\u id=tokenizer。将\u令牌\u转换为\u id(令牌)
#掩码有1表示实令牌,0表示填充令牌。只有真实的
#代币被处理。
输入\u掩码=[1]*len(输入\u ID)
#零填充到序列长度。
而len(输入ID)