关于使用TensorFlow数据集强制加载ImageNet 2012的故事


关于本文

在相当有限的Internet环境中准备ImageNet 2012数据集而无需依赖TensorFlow Datasets下载功能时的记录。
由于附带的下载功能没有恢复功能就下载了将近150GB的数据,因此不太可能在我的环境中完成,因此我执行了本文所述的操作。
对于以下人员可能有用。

  • tfds.load('imagenet2012')下载速度慢

  • 下载途中多次失败
  • 但是我想以某种方式使用ImageNet 2012数据集
  • 然后我想用TensorFlow Datasets轻松阅读它

什么是TensorFlow数据集?

TensorFlow有一个方便的模块来读取称为TensorFlow Datasets的数据集。
这样,您可以非常轻松地加载存储库中准备的数据集。

加载MNIST

1
2
3
4
5
import tensorflow_datasets as tfds
datasets = tfds.load('mnist')
for image, label in datasets['train']:
    # たったこれだけで読み込める
    pass

我想加载ImageNet的故事

我不仅要使用

MNIST和CIFAR10,还要使用具有较大图像尺寸的数据集,因此该是时候在存储库中加载众所周知的ImageNet 2012(ILSVRC2012)数据集了。
如上所述,您只需要编写一行即可读取,并且该行将自动下载,因此如果您等待,则应该可以使用它。 ......应该是。

下载不起作用

在我的生产线上,估计的剩余时间在20到100小时之间,这似乎很耗时,所以我决定耐心等待。
但是,由于断电,第一次下载被中断,由于某种原因,第二次下载停止在30%左右,第三次下载停止在10%左右,依此类推。
此外,由于TensorFlow Datasets下载功能没有恢复功能,因此它总是从头开始。

考虑到这一点,我觉得没有恢复功能而下载接近150GB的文件是相当鲁ck的,所以我决定手动执行下载部分,并设法使TensorFlow Datasets识别它。

执行环境

这是Windows 10的常规环境。

  • Windows10专业版1809
  • NVIDIA GeForce GTX 1060 6GB
  • Python 3.7.4
  • TensorFlow GPU 2.0.0 rc0
  • TensorFlow数据集1.2.0

解决方案

过程是手动下载,修改脚本以加载数据集,设置数据集和还原脚本。
我认为操作过程不是很优雅,但是没关系,因为它不是用来恢复它的

手动下载数据集

首先,将ILSVRC2012_img_train.tarILSVRC2012_img_val.tar下载到合适的位置。
由于它基本上下载了将近150GB的数据,因此希望使用具有恢复功能的下载器。

我使用了" Academic Torrents --ImageNet 2012",这是一个促进研究人员共享数据集的网站。
了解如何自己使用种子。

下载的文件将保存在C:\Downloads中。

资料下载

1
2
3
4
Cドライブ
| - Downloads
| | - ILSVRC2012_img_train.tar
| | - ILSVRC2012_img_val.tar

修改脚本以加载

加载

ImageNet 2012的脚本在\(Pythonインストールディレクトリ)\Lib\site-packages\tensorflow_datasets\image\imagenet.py中。
请自行阅读Python的安装目标,并使用适当的编辑器将其打开。

当打开

文件时,应该有一个_split_generators()的定义,因此请寻找它。
此功能从下载文件中安装文件。
然后,通过如下更改此函数的开头,直接指定应下载的train_pathval_path

更改之前-\\(Python安装目录)\\ Lib \\ site-packages \\ tensorflow_datasets \\ image \\ imagenet.py

1
2
3
4
5
6
7
def _split_generators(self, dl_manager):
    train_path, val_path = dl_manager.download([
        '%s/ILSVRC2012_img_train.tar' % _URL_PREFIX,
        '%s/ILSVRC2012_img_val.tar' % _URL_PREFIX,
    ])
    if not tf.io.gfile.exists(train_path) or not tf.io.gfile.exists(val_path):
      ...

更改之前-\\(Python安装目录)\\ Lib \\ site-packages \\ tensorflow_datasets \\ image \\ imagenet.py

1
2
3
4
5
6
7
8
9
10
def _split_generators(self, dl_manager):
    # train_path, val_path = dl_manager.download([
    #     '%s/ILSVRC2012_img_train.tar' % _URL_PREFIX,
    #     '%s/ILSVRC2012_img_val.tar' % _URL_PREFIX,
    # ])
    # TODO: 元の代入をコメントアウトして手動ダウンロードしたファイルのパスを直接指定する
    train_path = 'C:\\Downloads\\ILSVRC2012_img_train.tar'
    val_path = 'C:\\Downloads\\ILSVRC2012_img_val.tar'
    if not tf.io.gfile.exists(train_path) or not tf.io.gfile.exists(val_path):
      ...

进行更改后保存。

执行tfds.load('imagenet2012')

编写并执行脚本,该脚本将导入并加载到适当的文件中。
将目录用于所使用的数据集。
提取文件需要143GB(153,745,173,498B),因此请提前检查可用空间。
在这里是C:\Datasets

main.py

1
2
import tensorflow_datasets as tfds
datasets = tfds.load('imagenet2012', data_dir='C:\\Datasets')

1
$ python main.py

运行

时,它应该跳过下载部分,并开始解压缩和安装文件。

撤消加载脚本

请先还原修改后的imagenet.py,然后再进行更改。

完成

如果执行上述步骤,则数据集将处于与按常规步骤进行设置时相同的状态。
之后,只需照常阅读并与tfds.load('imagenet2012')一起使用。
感谢你的努力工作。

参考文献

TensorFlow数据集
github.com --tensorflow_datasets / image / imagenet.py
学术洪流
"学术洪流"在BitTorrent上共享超过27TB的研究数据集