在《深度學習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.