前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次GAN项目背景下的tensorflow_datasets的mnist数据集的下载笔记

一次GAN项目背景下的tensorflow_datasets的mnist数据集的下载笔记

作者头像
用户3946442
发布2022-04-11 18:19:51
7240
发布2022-04-11 18:19:51
举报
文章被收录于专栏:程序媛驿站

作者:codebrid

原文链接:

https://blog.csdn.net/ccbrid/article/details/103491467

起因:帮我可爱的妹子跑一个GAN的代码(已有,github),这回是在我自己实验室的服务器上

我的背景:第一次 | 正式使用tensorflow | 要开始排坑了 | 我爱Pytorch | 用之前碎碎念

项目地址:https://github.com/google/compare_gan(很基础的一个GAN代码,谷歌大佬发布的)

项目论文:https://arxiv.org/pdf/1406.2661.pdf

一、TF环境安装

1. 建立虚拟环境:conda create -n GAN python=3.6

2. 进入虚拟环境:source activate GAN

3. 确认本地Linux版本是否支持cuda:uname -m && cat /etc/*release

【得到反馈 CentOS Linux release 7.3.1611 (Core)】

4. 检查本地gcc是否安装:gcc --version

【得到反馈 gcc (GCC) 4.8.5】

5. 开始安装tensorflow:pip install tensorflow-gpu==1.15

【得到反馈如下】

代码语言:javascript
复制
ERROR: matplotlib 2.1.2 requires cycler>=0.10, which is not installed.
ERROR: matplotlib 2.1.2 requires pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1, which is not installed.
ERROR: matplotlib 2.1.2 requires pytz, which is not installed.
Installing collected packages: six, google-pasta, astor, numpy, h5py, keras-applications, markdown, absl-py, werkzeug, protobuf, grpcio, tensorboard, tensorflow-estimator, keras-preprocessing, gast, opt-einsum, termcolor, wrapt, tensorflow-gpu
Successfully installed absl-py-0.8.1 astor-0.8.1 gast-0.2.2 google-pasta-0.1.8 grpcio-1.25.0 h5py-2.10.0 keras-applications-1.0.8 keras-preprocessing-1.1.0 markdown-3.1.1 numpy-1.17.4 opt-einsum-3.1.0 protobuf-3.11.1 six-1.13.0 tensorboard-1.15.0 tensorflow-estimator-1.15.1 tensorflow-gpu-1.15.0 termcolor-1.1.0 werkzeug-0.16.0 wrapt-1.11.2

6. 意思是缺少cycler、pyparsing、pytz所以没安成matplotlib,于是:pip install matplotlib

【得到反馈 安装成功】

二、安装项目要求环境

1. 按照项目网址提供的方式:https://github.com/google/compare_gan,运行安装setup.py下的依赖

代码语言:javascript
复制
(GAN) $ pip install -e .

2. 检查TF环境是否装好

代码语言:javascript
复制
(GAN) $ python
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('HELLO!')
>>> with tf.Session() as sess:
...     print(sess.run(hello))
b'HELLO!'

没问题,安装成功。

3. 检查 tensorflow_datasets 是否安装成功,并输出tfds都包含了哪些数据集:

代码语言:javascript
复制
>>> import tensorflow_datasets as tfds
>>> print(tfds.list_builders())
['bair_robot_pushing_small', 'cats_vs_dogs', 'celeb_a', 'celeb_a_hq', 'cifar10', 'cifar100', 'coco2014', 'diabetic_retinopathy_detection', 'dummy_dataset_shared_generator', 'dummy_mnist', 'fashion_mnist', 'image_label_folder', 'imagenet2012', 'imdb_reviews', 'lm1b', 'lsun', 'mnist', 'moving_mnist', 'nsynth', 'omniglot', 'open_images_v4', 'quickdraw_bitmap', 'squad', 'starcraft_video', 'svhn_cropped', 'tf_flowers', 'wmt_translate_ende', 'wmt_translate_enfr']

没问题,安装成功。

三、尝试运行

1. 初次运行 项目代码

代码语言:javascript
复制
python main.py --model_dir try --gin_config ../example_configs/mnist.gin

报错:

代码语言:javascript
复制
requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.17.228.3', port=8081): Max retries exceeded with url: /IXCa9bee7c9d834e0e4d14e3b433c66e97e/exdb/mnist/train-images-idx3-ubyte.gz (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe51008c2e8>: Failed to establish a new connection: [Errno 113] No route to host',))

2. 怀疑是数据集下载问题

3. 检查 tensorflow_datasets 是否可以使用:

【用tfds.load执行一系列的批量示例、转换操作,然后再调用】

代码语言:javascript
复制
>>> ds_train = tfds.load(name="mnist", split="train")

报错:

代码语言:javascript
复制
requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.17.228.3', port=8081): Max retries exceeded with url: /IXCa9bee7c9d834e0e4d14e3b433c66e97e/exdb/mnist/train-images-idx3-ubyte.gz (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe51008c2e8>: Failed to establish a new connection: [Errno 113] No route to host',))

4. 尝试一下另一种方法:【DatasetBuilder直接实例化或者用tfds.builder字符串读取】【这份其实是上面tfds.load的源码】

代码语言:javascript
复制
# Fetch the dataset directly
mnist = tfds.image.MNIST()
# or by string name
mnist = tfds.builder('mnist')
mnist.download_and_prepare()

仍然报同一个错误:

代码语言:javascript
复制
requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.17.228.3', port=8081): Max retries exceeded with url: /IXCa9bee7c9d834e0e4d14e3b433c66e97e/exdb/mnist/train-images-idx3-ubyte.gz (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe510110d68>: Failed to establish a new connection: [Errno 113] No route to host',))

mnist有四个文件,train-img,train-label,t10k-img,t10k-label

检查了一下到底有没有成功下载:

发现指定下载目录下成功下载了两个(两个label文件,所以初步怀疑报错是因为两个大文件太大下载不成功)

并带上了他们的info文件(dict形式,写着名称,下载地址等)

代码语言:javascript
复制
yann.lecu.com_exdb_mnis_t10k-labe-idx1-ubytlX-SfSvqLNNrV7AqoACgdSrEYP_4wsDz4T_rhacyC0o.gz       
yann.lecu.com_exdb_mnis_trai-labe-idx1-ubyt7cc_IeM51G_ngIY2ORleKjMjLVCXd-TCUHlYvEiRiKI.gz
yann.lecu.com_exdb_mnis_t10k-labe-idx1-ubytlX-SfSvqLNNrV7AqoACgdSrEYP_4wsDz4T_rhacyC0o.gz.INFO  
yann.lecu.com_exdb_mnis_trai-labe-idx1-ubyt7cc_IeM51G_ngIY2ORleKjMjLVCXd-TCUHlYvEiRiKI.gz.INFO

但是另外两个image文件并没有下载成功,上面的错误正是报在image文件无法下载这个问题上。

5. tensorflow_datasets 为什么安装成功但是不能使用?

参考博客:

代码语言:javascript
复制
https://blog.csdn.net/i8088/article/details/79126150
https://blog.csdn.net/abc13526222160/article/details/85109498
https://blog.csdn.net/jiaoyangwm/article/details/79254667

能查到的问题都是在解决input_data(如下)无法自动下载mnist文件的问题。

代码语言:javascript
复制
from tensorflow.examples.tutorials.mnist import input_data #这是TensorFlow 为了教学Mnist而提前设计好的程序
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) #TensorFlow 会检测数据是否存在。当数据不存在时,系统会自动,在当前代码py文件位置,自动创建MNIST_data文件夹,并将数据下载到该件夹内。当执行完语句后,读者可以自行前往MNIST_data/文件夹下查看上述4 个文件是否已经被正确地下载
#若因网络问题无法正常下载,可以前往MNIST官网http://yann.lecun.com/exdb/mnist/使用下载工具下载上述4 个文件, 并将它们复制到MNIST_data/文件夹中。

而我们的代码使用的不是input_data,而是tfds。

所以我们面临的是tfds无法自动下载mnist文件的问题。

我们的这个问题无法查到。

能查到的博客上说的都是同一个方法:自己手动下载数据 。

o好8,那就下载一个。

6. 手动下载数据集

在自己电脑上从网址 http://yann.lecun.com/exdb/mnist/ 手动下载数据集(四个,上文有提到)

这个时候需要注意⚠️,有些浏览器下载压缩包会自动给解压。

我的电脑就自动给解压了,并且在浏览器里没有找到 [不要解压] 的选项。

于是换一种下载方法:

在数据集处右键获得数据集链接,直接在命令行输入 [wget + 链接] 下载未解压版本。

此处也可以直接使用上面的代码来下载未解压文件:

代码语言:javascript
复制
from tensorflow.examples.tutorials.mnist import input_data #这是TensorFlow 为了教学Mnist而提前设计好的程序
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) #TensorFlow 会检测数据是否存在。当数据不存在时,系统会自动,在当前代码py文件位置,自动创建MNIST_data文件夹,并将数据下载到该件夹内。当执行完语句后,读者可以自行前往MNIST_data/文件夹下查看上述4 个文件是否已经被正确地下载
#若因网络问题无法正常下载,可以前往MNIST官网http://yann.lecun.com/exdb/mnist/使用下载工具下载上述4 个文件, 并将它们复制到MNIST_data/文件夹中。

7. 数据集放到指定位置

仔细观察步骤4的报错信息,发现其自动下载数据集的存放地址为 [~/tensorflow_datasets/mnist/1.0.0]

于是新建一个文件夹,把刚刚下载好的未解压的文件放到这里。

再次运行步骤4的tfds.load('mnist')的代码

手动下载数据集并放到正确位置后,url错误消失,但出现新的错误,仍然无法成功load数据集:

代码语言:javascript
复制
tensorflow.python.framework.errors_impl.NotFoundError: /users4/zsun/tensorflow_datasets/mnist/1.0.0/dataset_info.json; No such file or directory

报错内容:

tensorflow_datasets/mnist/1.0.0/dataset_info.json; No such file or directory

8. 这个 [dataset_info.json] 是什么?

官网只提供了四个数据文件,并没有这个json文件。

但想要成功运行tfds.load 或者 mnist.download_and_prepare(),看起来必须要这个文件。

那么找一下

查看tensorflow源码(根据tensorflow_datasets.core相关的报错位置查看源码)

代码语言:javascript
复制
https://github.com/tensorflow/datasets/blob/master/tensorflow_datasets/core/dataset_info.py
https://github.com/tensorflow/datasets/blob/v1.3.0/tensorflow_datasets/core/dataset_builder.py#L236-L308

查看tensorflow官方文档

代码语言:javascript
复制
https://tensorflow.google.cn/datasets/api_docs/python/tfds/core/DatasetInfo

其中有关于数据集dataset的info文件,诶,会不会是他呢?

于是查找到dataset.info的输出方式,输出看看,嗯,格式差不多。。。

那我们把它存成这个json文件试一下。

在https://www.tensorflow.org/datasets/api_docs/python/tfds/core/DatasetInfo找到了DatasetInfo有转为json的属性

当然直接用啊!

转为json之后,写到文件里,整体代码如下

代码语言:javascript
复制
>>> mnist = tfds.image.MNIST()
>>> mnist.info
<tensorflow_datasets.core.dataset_info.DatasetInfo object at 0x7fd6945811d0>
>>> print(mnist.info)
tfds.core.DatasetInfo(
    name='mnist',
    version=1.0.0,
    description='The MNIST database of handwritten digits.',
    urls=['http://yann.lecun.com/exdb/mnist/'],
    features=FeaturesDict({
        'image': Image(shape=(28, 28, 1), dtype=tf.uint8),
        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10)
    },
    total_num_examples=0,
    splits={

    },
    supervised_keys=('image', 'label'),
    citation='"""
        @article{lecun2010mnist,
          title={MNIST handwritten digit database},
          author={LeCun, Yann and Cortes, Corinna and Burges, CJ},
          journal={ATT Labs [Online]. Available: http://yann. lecun. com/exdb/mnist},
          volume={2},
          year={2010}
        }
    """',
)

>>> print(mnist.info.as_json)
{
  "citation": "@article{lecun2010mnist,\n  title={MNIST handwritten digit database},\n  author={LeCun, Yann and Cortes, Corinna and Burges, CJ},\n  journal={ATT Labs [Online]. Available: http://yann. lecun. com/exdb/mnist},\n  volume={2},\n  year={2010}\n}\n",
  "description": "The MNIST database of handwritten digits.",
  "location": {
    "urls": [
      "http://yann.lecun.com/exdb/mnist/"
    ]
  },
  "name": "mnist",
  "supervisedKeys": {
    "input": "image",
    "output": "label"
  },
  "version": "1.0.0"
}
>>>
>>> import json
>>> with open('/users4/zsun/tensorflow_datasets/mnist/1.0.0/dataset_info.json', 'w') as f:
>>>     json.dump(mnist.info.as_json, f)


  File "/users4/zsun/anaconda3/envs/GAN/lib/python3.6/site-packages/tensorflow_datasets/core/dataset_info.py", line 546, in read_from_json
    dataset_info_pb2.DatasetInfo())
  File "/users4/zsun/anaconda3/envs/GAN/lib/python3.6/site-packages/google/protobuf/json_format.py", line 430, in Parse
    return ParseDict(js, message, ignore_unknown_fields, descriptor_pool)
  File "/users4/zsun/anaconda3/envs/GAN/lib/python3.6/site-packages/google/protobuf/json_format.py", line 450, in ParseDict
    parser.ConvertMessage(js_dict, message)
  File "/users4/zsun/anaconda3/envs/GAN/lib/python3.6/site-packages/google/protobuf/json_format.py", line 481, in ConvertMessage
    self._ConvertFieldValuePair(value, message)
  File "/users4/zsun/anaconda3/envs/GAN/lib/python3.6/site-packages/google/protobuf/json_format.py", line 592, in _ConvertFieldValuePair
    raise ParseError(str(e))
google.protobuf.json_format.ParseError: Message type "tensorflow_datasets.DatasetInfo" has no field named "{".
 Available Fields(except extensions): ['name', 'description', 'version', 'citation', 'sizeInBytes', 'location', 'downloadChecksums', 'schema', 'splits', 'supervisedKeys']

依旧有问题,说明自己建json文件不可行。

怀疑input_data与tfds所需要的数据集格式不同,inputdata的解决方案并不适用。

9. 本地使用tfds下载安装数据集

之前报url的错误是是服务器上,由于服务器无法访问国外网站,又无法保证链接稳定;

目前来看其他方法也行不通。

所以最后一个办法。

本地电脑安装tensorflow==1.15 tensorflow_dataset==1.0.1

然后本地运行某一种方法:

代码语言:javascript
复制
mnist = tfds.builder('mnist')
mnist.download_and_prepare()

成功下载并处理。

查看处理后的文件样式:

果然和input_data.py相差十万八千里

(input_data.py只需要四个未解压文件)

再次运行

python main.py --model_dir try --gin_config ../example_configs/mnist.gin

不再出现数据集的问题。

成功!!!

总结:

input_data 和 tfds 的数据集调用方式和问题解决方式不一样,目前来看,input_data如果出现无法下载数据集的问题可以用手动下载来解决,tfds上如果出现无法下载数据集的问题只有换电脑这一种解决方式。

作者:codebrid

编辑:西柚媛

本文来自程序媛驿站,未经授权不得转载.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序媛驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档