Tensorflow 关于bert的_生成器中的tf.data.Dataset

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

关于这件事我搜索了一下,但我找不到该怎么办。 通常,它们使用tf.constant或tf.data.TFrecord

我想通过读取csv文件,使用生成器生成输入数据集api。 我试了几个小时,但发生了各种各样的错误。 我混淆了使用输出类型和输出形状

下面是我的代码。 有什么问题吗

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)