tfds.load()两种调用差异:为何一正常一报TypeError?
问题原因与解决方案
两段代码的核心差异在于数据集加载后的结构和文本类型处理,错误的根源有两点:
1. 数据集解包错误
当使用split=['train','test']参数时,部分TensorFlow Datasets版本会返回字典结构(键为'train'/'test',值为对应数据集),而非你预期的列表。这会导致你用(x_train,y_train),(x_test,y_test)解包时,x_train被错误赋值为字典的键或其他非文本结构,最终Tokenizer处理时遇到字典类型,抛出"需要bytes-like对象而非dict"的错误。
2. 文本类型未转换
即使解包正确,as_supervised=True返回的文本是bytes类型(numpy数组元素),而Keras的Tokenizer要求输入是字符串类型,这也会导致后续处理出错。
修正后的代码
# 加载数据集,返回包含训练/测试集的列表 train_ds, test_ds = tfds.load('imdb_reviews', split=['train', 'test'], as_supervised=True, batch_size=-1) # 转换为numpy数组,分离文本和标签 x_train, y_train = tfds.as_numpy(train_ds) x_test, y_test = tfds.as_numpy(test_ds) # 将bytes类型的文本解码为UTF-8字符串 x_train = [text.decode('utf-8') for text in x_train] x_test = [text.decode('utf-8') for text in x_test] # 正常执行Tokenzier处理 tokenizer = Tokenizer(num_words=10000) tokenizer.fit_on_texts(x_train) sequences = tokenizer.texts_to_sequences(x_train)
内容的提问来源于stack exchange,提问作者Anurag Nimonkar
相关产品推荐
相关产品推荐

