2 回答
![?](http://img1.sycdn.imooc.com/5333a207000118af02200220-100-100.jpg)
TA贡献2021条经验 获得超8个赞
错误只是tokenizer.tokenize需要一个字符串,而你给它一个列表。这个简单的编辑将会起作用。我只是做了一个循环,将所有字符串提供给分词器,而不是给它一个字符串列表。
dataset = tf.data.experimental.make_csv_dataset(
'test.csv',
batch_size=2,
label_name='target',
num_epochs=1)
tokenizer = tfds.features.text.Tokenizer()
lowercase = True
vocabulary = Counter()
for features, _ in dataset:
text = features['text']
if lowercase:
text = tf.strings.lower(text)
for t in text:
tokens = tokenizer.tokenize(t.numpy())
vocabulary.update(tokens)
![?](http://img1.sycdn.imooc.com/5458692c00014e9b02200220-100-100.jpg)
TA贡献1799条经验 获得超6个赞
创建的数据集的每个元素make_csv_dataset
都是CVS 文件的一批行,而不是单个行;这就是为什么它需要batch_size
作为输入参数。另一方面,for
用于处理和标记文本特征的当前循环期望一次单个输入样本(即行)。因此,tokenizer.tokenize
给定一批字符串会失败并引发TypeError: Expected binary or unicode string, got array(...)
.
以最小的更改解决此问题的一种方法是首先以某种方式取消批处理数据集,对数据集执行所有预处理,然后再次对数据集进行批处理。unbatch
幸运的是,我们可以在这里使用一个内置方法:
dataset = tf.data.experimental.make_csv_dataset(
...,
# This change is **IMPORTANT**, otherwise the `for` loop would continue forever!
num_epochs=1
)
# Unbatch the dataset; this is required even if you have used `batch_size=1` above.
dataset = dataset.unbatch()
#############################################
#
# Do all the preprocessings on the dataset here...
#
##############################################
# When preprocessings are finished and you are ready to use your dataset:
#### 1. Batch the dataset (only if needed for or applicable to your specific workflow)
#### 2. Repeat the dataset (only if needed for or applicable to specific your workflow)
dataset = dataset.batch(BATCH_SIZE).repeat(NUM_EPOCHS or -1)
@NicolasGervais 的答案中建议的另一种解决方案是调整和修改所有预处理代码,以处理一批样本,而不是一次处理单个样本。
添加回答
举报