下载、预处理和上传 ImageNet 数据集
本文档介绍了如何下载、预处理和上传 ImageNet 数据集,以便与 Cloud TPU 虚拟机架构搭配使用。
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。ImageNet 数据库的大小意味着训练模型需要相当长的时间。另一种方法是使用演示版的数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试模型,同时降低通常与使用完整 ImageNet 数据库相关的存储空间和时间要求。
预处理完整的 ImageNet 数据集
ImageNet 数据集包括三个部分:训练数据、验证数据和图片标签。
训练数据包含 1000 个类别和 120 万张图片,已打包好以便可以下载。验证数据和测试数据不包含在 ImageNet 训练数据中(重复项已移除)。
验证数据和测试数据由 15 万张照片组成,这些照片是通过 Flickr 和其他搜索引擎收集而来,并手动标记是否存在 1000 个对象类别。1000 个对象类别同时包含 ImageNet 的内部节点和叶节点,但彼此不重叠。发布了带有标签的 50000 个寻机图片子集作为验证数据,以及包含 1000 个类别的列表。其余图片用于评估,并已发布且不带标签。
预处理完整的 ImageNet 数据集的步骤
准备完整的 ImageNet 数据集以供机器学习模型使用,这个过程分为五个步骤:
验证空间要求
无论您是将数据集下载到本地机器还是下载到虚拟机实例,下载目标都需要大约 300GB 的空间。
TPU 虚拟机的默认磁盘分配为 100 GB。由于下载到 TPU 虚拟机需要 300 GB 的空间,因此如果您要下载到 TPU 虚拟机实例,则需要添加一个永久性磁盘并额外提供 200 GB 的空间才能完成下载。在 TPU 虚拟机上,您可以使用 df -ha
命令检查可用存储空间。
添加永久性磁盘时,请务必:
- 将删除实例时设置为删除磁盘,以确保在您删除虚拟机后,相应磁盘也会一并删除。
- 记下新磁盘的路径,例如:
/mnt/disks/mnt-dir
。
设置目标目录
在本地机器或虚拟机实例上,设置目录结构来存储下载的数据。
在下载目标(本地机器或 TPU 虚拟机)的主目录下创建一个目录,例如
imagenet
。mkdir imagenet
在此目录下,创建两个子目录:
train
和validation
。mkdir imagenet/train mkdir imagenet/validation
将
imagenet
目录导出为IMAGENET_HOME
。export IMAGENET_HOME=~/imagenet
注册并申请下载数据集的权限
在 Imagenet 网站上注册。在 ImageNet 确认您已注册并向您发送确认电子邮件之后,您才能下载数据集。如果您在几天内未收到确认电子邮件,请与 ImageNet 支持团队联系,以了解您的注册为何未被确认。确认您的注册后,您就可以下载数据集了。使用 ImageNet 数据集的 Cloud TPU 教程使用 ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012) 中的图片。
下载 ImageNet 数据集
在 LSRVC 2012 下载网站中,前往页面上的“图片”部分,然后右键点击“训练图片(任务 1 和 2)”。用于下载训练集大部分数据的网址。保存网址。
右键点击“训练图片(任务 3)”以获取第二个训练集的网址。保存网址。
右键点击“验证图片(所有任务)”以获取验证数据集的网址。保存网址。
如果将 ImageNet 文件下载到本地机器,则需要将本地机器上的目录复制到虚拟机实例上的相应
$IMAGENET_HOME
目录。将 ImageNet 数据集从本地主机复制到虚拟机实例大约需要 13 个小时。在将 ImageNet 数据集复制到 TPU 虚拟机之前,您需要确定 TPU 虚拟机实例的名称。为此,请使用 SSH 连接到 TPU 虚拟机。虚拟机实例名称会显示在命令提示符中的
@
符号后面。使用以下命令将本地机器上 ~/imagenet 目录下的文件复制到虚拟机上的
$IMAGENET_HOME
。gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
在
$IMAGENET_HOME
中,使用保存的网址下载“训练图片(任务 1 和 2)”文件。“训练图片(任务 1 和 2)”文件是大型训练集。大小为 138 GB,如果您使用 Cloud Shell 将其下载到 TPU 虚拟机,则下载时间大约为 40 个小时。如果 Cloud Shell 与虚拟机的连接中断,您可以在命令前面添加
nohup
或使用筛选。cd $IMAGENET_HOME \ nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar
将该网址替换为您之前为“训练图片(任务 1 和 2)”保存的网址,因为该网址可能已更改。
使用以下命令将各个训练目录提取到
$IMAGENET_HOME/train
目录中。提取过程需要 1 到 3 小时。tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train
提取位于
$IMAGENET_HOME/train
目录中的各个训练 tar 文件,如以下脚本所示:cd `$IMAGENET_HOME/train` for f in *.tar; do d=`basename $f .tar` mkdir $d tar xf $f -C $d done
提取 tar 文件后,请删除这些文件以释放磁盘空间。
在
$IMAGENET_HOME
中,使用保存的网址下载“训练图片(任务 3)”文件。“训练图片(任务 3)”文件为 728 MB,下载只需几分钟时间,因此您无需采取预防措施以避免中断 Cloud Shell 连接。
wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar
将该网址替换为您之前为“训练图片(任务 3)”保存的网址,因为该网址可能已更改。
使用以下命令将各个训练目录提取到
$IMAGENET_HOME/train
目录中。tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train
提取位于
$IMAGENET_HOME/train
目录中的各个训练 tar 文件,如以下脚本所示:cd `$IMAGENET_HOME/train` for f in *.tar; do d=`basename $f .tar` mkdir $d tar xf $f -C $d done
提取 tar 文件后,请删除这些文件以释放磁盘空间。
在
$IMAGENET_HOME
中,使用保存的网址下载“验证图片(所有任务)”文件。下载“验证图片(所有任务)”文件时,您的 Cloud Shell 可能会断开连接。您可以使用
nohup
或 screen 来防止 Cloud Shell 断开连接。wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar
将该网址替换为您之前为“验证图片(所有任务)”保存的网址,因为该网址可能已更改。
此下载过程大约需要 30 分钟。
使用以下命令将各个验证文件解压缩到
$IMAGENET_HOME/validation
目录中。tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation
如果已将验证文件下载到本地机器,则需要将本地机器上的
$IMAGENET_HOME/validation
目录复制到虚拟机实例上的$IMAGENET_HOME/validation
目录。此复制操作大约需要 30 分钟。下载标签文件。
wget -O $IMAGENET_HOME/synset_labels.txt \ https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt
如果已将标签文件下载到本地机器,则需要将其复制到本地机器上的
$IMAGENET_HOME
目录,然后复制到虚拟机实例上的$IMAGENET_HOME
目录。此复制操作需要几秒钟的时间。训练子目录名称(例如,n03062245)是“WordNet ID”(wnid)。ImageNet API 在
synset_labels.txt
文件中显示了 WordNet ID 与其相关联的验证标签之间的映射。此上下文中的同义词集是视觉上类似的一组图片。
处理 Imagenet 数据集,并视情况将其上传到 Cloud Storage
从 GitHub 下载
imagenet_to_gcs.py
脚本:wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
如果要将数据集上传到 Cloud Storage,请指定存储桶位置来上传 ImageNet 数据集:
export STORAGE_BUCKET=gs://bucket-name
如果要将数据集上传到本地机器或虚拟机,请指定一个数据目录来保存数据集:
(vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
在您的机器或虚拟环境中安装以下库:
pip3 install google-cloud-storage pip3 install tensorflow
运行脚本,将原始数据集作为 TFRecord 进行预处理,并使用下列命令将其上传到 Cloud Storage:
python3 imagenet_to_gcs.py \ --project=$PROJECT \ --gcs_output_path=$STORAGE_BUCKET \ --raw_data_dir=$IMAGENET_HOME \ --local_scratch_dir=$IMAGENET_HOME/tf_records
该脚本会生成一组以下形式的目录(用于存储训练和验证数据):
${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024
和
${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128
将数据上传到您的 Cloud 存储桶后,请运行模型并设置 --data_dir=${DATA_DIR}
。