作者: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
编辑:西柚媛
本文来自程序媛驿站,未经授权不得转载.