在《深度学习caffe–手写字体识别例程(一)》中,我们进行了手写字体识别例程的演练,其中第一步就是用get_mnist.sh脚本文件来获取mnist数据集,这篇文章我们来研究一下这个脚本文件到底做了什么。我们在caffe根目录下的data/mnist/目录下可以找到这个脚本文件,源码如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1#!/usr/bin/env sh
2# This scripts downloads the mnist data and unzips it.
3
4DIR="$( cd "$(dirname "$0")" ; pwd -P )"
5cd "$DIR"
6
7echo "Downloading..."
8
9for fname in train-images-idx3-ubyte train-labels-idx1-ubyte t10k-images-idx3-ubyte t10k-labels-idx1-ubyte
10do
11 if [ ! -e $fname ]; then
12 wget --no-check-certificate http://yann.lecun.com/exdb/mnist/${fname}.gz
13 gunzip ${fname}.gz
14 fi
15done
16
1、在文件的第一行指定的是脚本的解释程序,第二行是对这个脚步文件的功能的注释。
2、DIR="$( cd "$(dirname "$0")" ; pwd -P )" 这一句比较复杂,我们由内而外进行分析。
首先来看$0,它表示的是第一个参数,相当于c语言中的argv[0],这里实际上就是脚本文件的名字。所以dirname "$0"就等价于dirname get_mnist.sh。
dirname的作用是取文件所在的路径,dirname get_mnist.sh的作用就是取get_mnist.sh所在的路径。前面的$表示返回命令的结果。
cd "$(dirname "$0")" 这一句的含义就是进入get_mnist.sh所在的目录。
在继续往外层分析,cd "$(dirname "$0")" ; pwd -P表示进入到get_mnist.sh所在的目录后,执行pwd -P命令。
pwd -P的作用是返回当前目录,目录是链接时,显示出实际路径,而非使用连接(link)路径。
在我的计算机中,get_mnist.sh所在的路径为
1
2 1/home/bigmarshal/Documents/deep_learning/caffe/data/mnist
2
因此最终DIR=/home/bigmarshal/Documents/deep_learning/caffe/data/mnist
3、cd "$DIR"的作用就是进入到DIR指定的路径内,然后echo "Downloading…"在终端上打印Downloading…
4、脚本文件余下的部分是一个for循环,在循环中检查train-images-idx3-ubyte、train-labels-idx1-ubyte、t10k-images-idx3-ubyte、t10k-labels-idx1-ubyte这四个文件在当前路径下是否存在,如果不存在,则从网址http://yann.lecun.com/exdb/mnist/ 下载扩展名为.gz的相应文件,其中-e的作用是判断文件是否存在。下载之后,将文件解压到当前文件夹。
通过这个脚本,就可以将实例中用到的四个数据集文件下载到相应文件夹了。