在《深度学习caffe--手写字体识别例程(一)》中,我们进行了手写字体识别例程的演练,在获取了数据集后,需要将数据集转换为caffe需要的LMDB格式的文件,使用create_mnist.sh脚本文件进行转换,这篇文章我们来研究一下这个脚本文件到底做了什么。我们在caffe根目录下的examples/mnist/目录下可以找到这个脚本文件,源码如下所示。
#!/usr/bin/env sh
# This script converts the mnist data into lmdb/leveldb format,
# depending on the value assigned to $BACKEND.
set -e
EXAMPLE=examples/mnist
DATA=data/mnist
BUILD=build/examples/mnist
BACKEND="lmdb"
echo "Creating ${BACKEND}..."
rm -rf $EXAMPLE/mnist_train_${BACKEND}
rm -rf $EXAMPLE/mnist_test_${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
echo "Done."
1、在文件的第一行指定的是脚本的解释程序,第二行和第三行是对这个脚步文件的功能的注释。
2、set -e的作用是在接下来执行的命令中,如果命令的返回值不为0,那么会使所在的进程或shell退出。
3、接下来三行代码
EXAMPLE=examples/mnist
DATA=data/mnist
BUILD=build/examples/mnist
定义了3个变量EXAMPLE、DATA、BUILD,它们分别表示三个路径。
4、BACKEND="lmdb"定义了另一个变量为LMDB尾缀。
5、echo "Creating ${BACKEND}..."的作用是在终端上打印Creating lmdb... ,其中${BACKEND}表示BACKEND的取值,即lmdb。
6、
rm -rf $EXAMPLE/mnist_train_${BACKEND}
rm -rf $EXAMPLE/mnist_test_${BACKEND}
这两行代码的作用是删除EXAMPLE目录下的mnist_train_lmdb和mnist_test_lmdb文件或目录。它们是将以前的痕迹清楚掉,避免与新生成的数据产生混乱。
7、接下来的命令
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
它的作用是调用BUILD目录下的convert_mnist_data.bin可执行文件来进行数据转换,$DATA/train-images-idx3-ubyte和$DATA/train-labels-idx1-ubyte为DATA目录下的转换前的图片文件和标签文件,也就是转换的原料,$EXAMPLE/mnist_train_${BACKEND}为转换完的文件保存的路径,--backend=${BACKEND}表示生成的文件类型。这两行代码最终会将我们下载的mnist训练数据集转换为lmdb格式的文件。关于convert_mnist_data.bin的作用,我们将在下一篇文章中进行详解。
8、接下来的两行
$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
它与7中的两行代码的作用是相似的,只不过这两行转换的是测试数据集。
9、最后一行
echo "Done."
它的作用是转换完成后,在终端中打印Done.
作者:fxfreefly