Kaggle 不断给我一个 TypeError: 'NoneType' object is not iterable for the following code:
dls = DataBlock(
blocks=(ImageBlock, CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=42),
get_y=parent_label,
item_tfms=[Resize(192, method='squish')]
).dataloaders(path_to_images, bs=32)
dls.show_batch(max_n=6)
这是完整的笔记本:
我尝试过更改笔记本的环境,但我不知道如何修复它。该代码在另一台笔记本上运行良好,但对于这台笔记本来说,它只是表现不佳。
这个错误信息 "TypeError: 'NoneType' object is not iterable" 通常出现在你尝试对一个 None 值进行迭代时,例如使用 for 循环遍历它。在你的代码中,问题可能出在以下几处:
-
get_image_files
函数 : 确保这个函数返回的是一个图像文件路径的列表,而不是 None。检查该函数的逻辑,确保它能够找到并返回图像文件。 -
parent_label
函数 : 确保这个函数为每个图像返回一个有效的类别标签,而不是 None。检查该函数的逻辑,确保它能够正确提取类别标签。 -
path_to_images
变量 : 确保这个变量指向的是一个包含图像的有效路径。检查路径是否正确,以及文件夹中是否存在图像文件。
以下是一些调试建议:
-
打印中间结果 : 在代码的不同阶段,使用
print()
打印出get_image_files
和parent_label
的返回值,以及path_to_images
的值。这可以帮助你确定哪个部分返回了 None。 -
使用断点调试 : 如果你的 IDE 支持断点调试,可以设置断点并逐行执行代码,观察变量的值和函数的返回值。
-
简化代码 : 尝试创建一个更简单的例子,只使用一个图像文件和一个类别标签。如果这个简单的例子能够运行,说明问题可能出在你的数据加载逻辑上。
其他可能性:
- 库版本 : 确保你的 fastai 和其他相关库版本是最新的。有时,旧版本的库可能存在 bug。
- Kaggle 环境 : 尝试重启你的 Kaggle kernel 或者创建一个新的 kernel。
请提供
get_image_files
和
parent_label
函数的代码,以及
path_to_images
的值,以便我更准确地帮助你找到问题所在。