MNIST
The MNIST dataset comprises 60,000 training examples and 10,000 test examples of the handwritten digits 0–9, formatted as 28x28-pixel monochrome images.
我们所说的MNIST就是一个手写数字图片的数据库,里面有60,000个训练样本和10,000个测试样本,每个样本是28x28像素的黑白图片。
更详细介绍:http://yann.lecun.com/exdb/mnist/
在这个例子中我发现加载MNIST数据库用了tensorflow里面的一个API:
mnist = tf.contrib.learn.datasets.load_dataset("mnist")
于是我试着尝试加载,结果出错了:
看Traceback似乎是链接超时,也就是tensorflow会去下载数据库,但是网络环境原因,这个不多说…
好吧,直觉告诉我,tensorflow应该可以加载已经下载好的数据。为什么?如果是我,我也会这么设计,不可能每次加载数据都要去服务器下载数据。
带着问题,我就看了下出错的文件:
File "D:\Python\Python36\lib\site-packages\tensorflow\contrib\learn\python\learn\datasets\mnist.py", line 280, in load_mnist
return read_data_sets(train_dir)
在280行,看到了函数的调用,默认读取文件夹’MNIST-data’
def load_mnist(train_dir='MNIST-data'):
return read_data_sets(train_dir)
在read_data_sets函数中调用了base.maybe_download
def maybe_download(filename, work_directory, source_url):
"""Download the data from source url, unless it's already here.
Args:
filename: string, name of the file in the directory.
work_directory: string, path to working directory.
source_url: url to download from if file doesn't exist.
Returns:
Path to resulting file.
"""
if not gfile.Exists(work_directory):
gfile.MakeDirs(work_directory)
filepath = os.path.join(work_directory, filename)
if not gfile.Exists(filepath):
temp_file_name, _ = urlretrieve_with_retry(source_url)
gfile.Copy(temp_file_name, filepath)
with gfile.GFile(filepath) as f:
size = f.size()
print('Successfully downloaded', filename, size, 'bytes.')
return filepath
maybe_download先判断本地数据库是否存在,若不存在则去下载
而下载地址则是mnist.py中定义的
DEFAULT_SOURCE_URL = ‘https://storage.googleapis.com/cvdf-datasets/mnist/’
所以,网络原因会导致下载不了。
到官网http://yann.lecun.com/exdb/mnist/把下面数据库的四个压缩档都下载下来,放到MNIST-data文件夹,MNIST-data放在python执行路径下,即可。
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
看到下面打印,证明数据库加载完成。
小结
本文以数据加载所遇到的问题为案例,展示了解决问题的思路。
当我们遇到阻碍,先要理清楚出现问题的原因,才可做到对症下药。