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