我正在对tensorflow中的IMDB数据集进行情感分析,我正试图通过使用textaugment库来增强训练数据集,他们说这是"即插即用"。这应该很简单,但是我是新手,所以我不知道该怎么做。以下是我所拥有的和我正在尝试的,基于阅读网站上的教程。
我试图做一个地图来增加训练数据,但我得到了一个错误。您可以向下滚动到最后一个代码块以查看错误。
pip install -q tensorflow-text
pip install -q tf-models-official
import os
import shutil
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_text as text
from official.nlp import optimization # to create AdamW Optimizer
import matplotlib.pyplot as plt
tf.get_logger().setLevel('ERROR')
#下载IMDB数据集并制作训练/验证/测试集
url = 'https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz'
dataset = tf.keras.utils.get_file('aclImdb_v1.tar.gz', url,
untar=True, cache_dir='.',
cache_subdir='')
dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')
train_dir = os.path.join(dataset_dir, 'train')
# remove unused folders to make it easier to load the data
remove_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(remove_dir)
AUTOTUNE = tf.data.AUTOTUNE
batch_size = 32
seed = 42
raw_train_ds = tf.keras.preprocessing.text_dataset_from_directory(
'aclImdb/train',
batch_size=batch_size,
validation_split=0.2,
subset='training',
seed=seed)
class_names = raw_train_ds.class_names
train_ds = raw_train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = tf.keras.preprocessing.text_dataset_from_directory(
'aclImdb/train',
batch_size=batch_size,
validation_split=0.2,
subset='validation',
seed=seed)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
test_ds = tf.keras.preprocessing.text_dataset_from_directory(
'aclImdb/test',
batch_size=batch_size)
test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)
#setting up the textaugment
try:
import textaugment
except ModuleNotFoundError:
!pip install textaugment
import textaugment
from textaugment import EDA
import nltk
nltk.download('stopwords')
现在这就是我得到错误的地方,我尝试在train_ds上进行映射,并试图在保持类相同的情况下为每个元素添加随机交换:
aug_ds = train_ds.map(
lambda x, y: (t.random_swap(x), y))
错误信息:
AttributeError Traceback (most recent call last)
<ipython-input-24-b4af68cc0677> in <module>()
1 aug_ds = train_ds.map(
----> 2 lambda x, y: (t.random_swap(x), y))
10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
668 except Exception as e: # pylint:disable=broad-except
669 if hasattr(e, 'ag_error_metadata'):
--> 670 raise e.ag_error_metadata.to_exception(e)
671 else:
672 raise
AttributeError: in user code:
<ipython-input-24-b4af68cc0677>:2 None *
lambda x, y: (t.random_swap(x), y))
/usr/local/lib/python3.6/dist-packages/textaugment/eda.py:187 random_swap *
self.validate(sentence=sentence, n=n)
/usr/local/lib/python3.6/dist-packages/textaugment/eda.py:74 validate *
if not isinstance(kwargs['sentence'].strip(), str) or len(kwargs['sentence'].strip()) == 0:
AttributeError: 'Tensor' object has no attribute 'strip'
我也在努力做同样的事情。发生此错误是因为textaugment函数t.random_swap()
应该在Python字符串对象上工作。
在你的代码中,函数接受一个dtype=string的张量。到目前为止,张量对象没有与Python字符串相同的方法。因此,错误代码。
Nb。tensorflow_text有一些额外的api来处理这种字符串类型的张量。尽管如此,它目前仅限于标记化,检查大写或小写等。一个冗长的解决方法是使用py_function
包装器,但这会降低性能。干杯,希望这能有所帮助。在我的用例中,我最后选择不使用textaugment。
Nbb。特遣部队。字符串api有更多的功能,比如正则表达式替换等,但对于你的扩展用例来说还不够复杂。看看其他人的想法会很有帮助,或者将来是否有TF或textaugment的更新。