diff --git a/.gitignore b/.gitignore index 07af1379280..3997e463cdb 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,5 @@ data/* examples/* # Don't version the generated documentation -docs/_site \ No newline at end of file +docs/_site +_site diff --git a/Makefile b/Makefile index e5cf929d0df..e42c75ee1e8 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,9 @@ HXX_SRCS := $(shell find include/$(PROJECT) ! -name "*.hpp") # CU_SRCS are the cuda source files CU_SRCS := $(shell find src/$(PROJECT) -name "*.cu") # TEST_SRCS are the test source files +TEST_MAIN_SRC := src/$(PROJECT)/test/test_caffe_main.cpp TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp") +TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS)) GTEST_SRC := src/gtest/gtest-all.cpp # TEST_HDRS are the test header files TEST_HDRS := $(shell find src/$(PROJECT) -name "test_*.hpp") @@ -32,9 +34,21 @@ TOOL_SRCS := $(shell find tools -name "*.cpp") EXAMPLE_SRCS := $(shell find examples -name "*.cpp") # PROTO_SRCS are the protocol buffer definitions PROTO_SRCS := $(wildcard src/$(PROJECT)/proto/*.proto) +# NONGEN_CXX_SRCS includes all source/header files except those generated +# automatically (e.g., by proto). +NONGEN_CXX_SRCS := $(shell find \ + src/$(PROJECT) \ + include/$(PROJECT) \ + python/$(PROJECT) \ + matlab/$(PROJECT) \ + examples \ + tools \ + -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") +LINT_REPORT := $(BUILD_DIR)/cpp_lint.log +FAILED_LINT_REPORT := $(BUILD_DIR)/cpp_lint.error_log # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT) -PY$(PROJECT)_SRC := python/$(PROJECT)/py$(PROJECT).cpp -PY$(PROJECT)_SO := python/$(PROJECT)/py$(PROJECT).so +PY$(PROJECT)_SRC := python/$(PROJECT)/_$(PROJECT).cpp +PY$(PROJECT)_SO := python/$(PROJECT)/_$(PROJECT).so # MAT$(PROJECT)_SRC is the matlab wrapper for $(PROJECT) MAT$(PROJECT)_SRC := matlab/$(PROJECT)/mat$(PROJECT).cpp MAT$(PROJECT)_SO := matlab/$(PROJECT)/$(PROJECT) @@ -62,6 +76,7 @@ GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o}) TOOL_BINS := ${TOOL_OBJS:.o=.bin} EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} TEST_BINS := ${TEST_OBJS:.o=.testbin} +TEST_ALL_BIN := $(BUILD_DIR)/src/$(PROJECT)/test/test_all.testbin ############################## # Derive include and lib directories @@ -73,8 +88,13 @@ MKL_LIB_DIR := $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64 INCLUDE_DIRS += ./src ./include $(CUDA_INCLUDE_DIR) $(MKL_INCLUDE_DIR) LIBRARY_DIRS += $(CUDA_LIB_DIR) $(MKL_LIB_DIR) -LIBRARIES := cudart cublas curand mkl_rt pthread \ - glog protobuf leveldb snappy boost_system \ +LIBRARIES := cudart cublas curand \ + mkl_rt \ + pthread \ + glog protobuf leveldb \ + snappy \ + boost_system \ + hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall @@ -90,7 +110,8 @@ PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) ############################## # Define build targets ############################## -.PHONY: all init test clean linecount tools examples py mat distribute py$(PROJECT) mat$(PROJECT) proto +.PHONY: all init test clean linecount lint tools examples py mat distribute \ + py$(PROJECT) mat$(PROJECT) proto runtest all: init $(NAME) $(STATIC_NAME) tools examples @echo $(CXX_OBJS) @@ -105,7 +126,18 @@ init: linecount: clean cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/ -test: init $(TEST_BINS) +lint: $(LINT_REPORT) + +$(LINT_REPORT): $(NONGEN_CXX_SRCS) + @ mkdir -p $(BUILD_DIR) + @ (python ./scripts/cpp_lint.py $(NONGEN_CXX_SRCS) > $(LINT_REPORT) 2>&1 \ + && (rm -f $(FAILED_LINT_REPORT); echo "No lint errors!")) || ( \ + mv $(LINT_REPORT) $(FAILED_LINT_REPORT); \ + grep -v "^Done processing " $(FAILED_LINT_REPORT); \ + echo "Found 1 or more lint errors; see log at $(FAILED_LINT_REPORT)"; \ + exit 1) + +test: init $(TEST_BINS) $(TEST_ALL_BIN) tools: init $(TOOL_BINS) @@ -135,11 +167,14 @@ $(STATIC_NAME): init $(PROTO_OBJS) $(OBJS) ar rcs $(STATIC_NAME) $(PROTO_OBJS) $(OBJS) @echo -runtest: test - for testbin in $(TEST_BINS); do $$testbin $(TEST_GPUID); done +runtest: $(TEST_ALL_BIN) + $(TEST_ALL_BIN) $(TEST_GPUID) $(TEST_BINS): %.testbin : %.o $(GTEST_OBJ) $(STATIC_NAME) $(TEST_HDRS) - $(CXX) $< $(GTEST_OBJ) $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + +$(TEST_ALL_BIN): $(GTEST_OBJ) $(STATIC_NAME) $(TEST_OBJS) + $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) -o $(TEST_ALL_BIN) $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) $(TOOL_BINS): %.bin : %.o $(STATIC_NAME) $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) diff --git a/README.md b/README.md index e92ce8bb1b7..b97185951bd 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ line of code: `Caffe::set_mode(Caffe::CPU)`. Even in CPU mode, computing predictions on an image takes only 20 ms when images are processed in batch mode. +* [Caffe introductory presentation](https://www.dropbox.com/s/10fx16yp5etb8dv/caffe-presentation.pdf) * [Installation instructions](http://caffe.berkeleyvision.org/installation.html) -* [Caffe presentation](https://docs.google.com/presentation/d/1lzyXMRQFlOYE2Jy0lCNaqltpcCIKuRzKJxQ7vCuPRc8/edit?usp=sharing) at the Berkeley Vision Group meeting \* When measured with the [SuperVision](http://www.image-net.org/challenges/LSVRC/2012/supervision.pdf) model that won the ImageNet Large Scale Visual Recognition Challenge 2012. diff --git a/docs/cifar10.md b/docs/cifar10.md new file mode 100644 index 00000000000..eb45e644eca --- /dev/null +++ b/docs/cifar10.md @@ -0,0 +1,95 @@ +--- +layout: default +title: Caffe +--- + +Alex's CIFAR-10 tutorial, Caffe style +===================================== + +Alex Krizhevsky's [cuda-convnet](https://code.google.com/p/cuda-convnet/) details the model definitions, parameters, and training procedure for good performance on CIFAR-10. This example reproduces his results in Caffe. + +We will assume that you have Caffe successfully compiled. If not, please refer to the [Installation page](installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. + +We thank @chyojn for the pull request that defined the model schemas and solver configurations. + +*This example is a work-in-progress. It would be nice to further explain details of the network and training choices and benchmark the full training.* + +Prepare the Dataset +------------------- + +You will first need to download and convert the data format from the [CIFAR-10 website](http://www.cs.toronto.edu/~kriz/cifar.html). To do this, simply run the following commands: + + cd $CAFFE_ROOT/data/cifar10 + ./get_cifar10.sh + cd $CAFFE_ROOT/examples/cifar10 + ./create_cifar10.sh + +If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be the dataset, `./cifar10-leveldb`, and the data set image mean `./mean.binaryproto`. + +The Model +--------- + +The CIFAR-10 model is a CNN that composes layers of convolution, pooling, rectified linear unit (ReLU) nonlinearities, and local contrast normalization with a linear classifier on top of it all. We have defined the model in the `CAFFE_ROOT/examples/cifar10` directory's `cifar10_quick_train.prototxt`. + +Training and Testing the "Quick" Model +-------------------------------------- + +Training the model is simple after you have written the network definition protobuf and solver protobuf files. Simply run `train_quick.sh`, or the following command directly: + + cd $CAFFE_ROOT/examples/cifar10 + ./train_quick.sh + +`train_quick.sh` is a simple script, so have a look inside. `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `train_net.bin`, with the solver protobuf text file as its argument. + +When you run the code, you will see a lot of messages flying by like this: + + I0317 21:52:48.945710 2008298256 net.cpp:74] Creating Layer conv1 + I0317 21:52:48.945716 2008298256 net.cpp:84] conv1 <- data + I0317 21:52:48.945725 2008298256 net.cpp:110] conv1 -> conv1 + I0317 21:52:49.298691 2008298256 net.cpp:125] Top shape: 100 32 32 32 (3276800) + I0317 21:52:49.298719 2008298256 net.cpp:151] conv1 needs backward computation. + +These messages tell you the details about each layer, its connections and its output shape, which may be helpful in debugging. After the initialization, the training will start: + + I0317 21:52:49.309370 2008298256 net.cpp:166] Network initialization done. + I0317 21:52:49.309376 2008298256 net.cpp:167] Memory required for Data 23790808 + I0317 21:52:49.309422 2008298256 solver.cpp:36] Solver scaffolding done. + I0317 21:52:49.309447 2008298256 solver.cpp:47] Solving CIFAR10_quick_train + +Based on the solver setting, we will print the training loss function every 100 iterations, and test the network every 500 iterations. You will see messages like this: + + I0317 21:53:12.179772 2008298256 solver.cpp:208] Iteration 100, lr = 0.001 + I0317 21:53:12.185698 2008298256 solver.cpp:65] Iteration 100, loss = 1.73643 + ... + I0317 21:54:41.150030 2008298256 solver.cpp:87] Iteration 500, Testing net + I0317 21:54:47.129461 2008298256 solver.cpp:114] Test score #0: 0.5504 + I0317 21:54:47.129500 2008298256 solver.cpp:114] Test score #1: 1.27805 + +For each training iteration, `lr` is the learning rate of that iteration, and `loss` is the training function. For the output of the testing phase, **score 0 is the accuracy**, and **score 1 is the testing loss function**. + +And after making yourself a cup of coffee, you are done! + + I0317 22:12:19.666914 2008298256 solver.cpp:87] Iteration 5000, Testing net + I0317 22:12:25.580330 2008298256 solver.cpp:114] Test score #0: 0.7533 + I0317 22:12:25.580379 2008298256 solver.cpp:114] Test score #1: 0.739837 + I0317 22:12:25.587262 2008298256 solver.cpp:130] Snapshotting to cifar10_quick_iter_5000 + I0317 22:12:25.590215 2008298256 solver.cpp:137] Snapshotting solver state to cifar10_quick_iter_5000.solverstate + I0317 22:12:25.592813 2008298256 solver.cpp:81] Optimization Done. + +Our model achieved ~75% test accuracy. The model parameters are stored in binary protobuf format in + + cifar10_quick_iter_5000 + +which is ready-to-deploy in CPU or GPU mode! Refer to the `CAFFE_ROOT/examples/cifar10/cifar10_quick.prototxt` for the deployment model definition that can be called on new data. + +Why train on a GPU? +------------------- + +CIFAR-10, while still small, has enough data to make GPU training attractive. + +To compare CPU vs. GPU training speed, simply change one line in all the `cifar*solver.prototxt`: + + # solver mode: 0 for CPU and 1 for GPU + solver_mode: 0 + +and you will be using CPU for training. diff --git a/docs/development.md b/docs/development.md index 459e1d652d6..86e771d511e 100644 --- a/docs/development.md +++ b/docs/development.md @@ -9,7 +9,7 @@ Developing & Contributing Caffe is developed with active participation of the community by the [Berkeley Vision and Learning Center](http://bvlc.eecs.berkeley.edu/). We welcome all contributions! -The [contributing workflow](https://github.com/BVLC/caffe#contributing) is explained in the README. These guidelines cover development practices in Caffe. This is a work-in-progress. +The [contributing workflow](https://github.com/BVLC/caffe#development) is explained in the README. These guidelines cover development practices in Caffe. This is a work-in-progress. **Development Flow** @@ -36,6 +36,18 @@ We'd appreciate your contribution to the documentation effort! **Testing**: run `make runtest` to check the project tests. New code requires new tests. Pull requests that fail tests will not be accepted. +The `googletest` framework we use provides many additional options, which you can access by running the test binaries directly. One of the more useful options is `--gtest_filter`, which allows you to filter tests by name: + + # run all tests with CPU in the name + build/src/caffe/test/test_all.testbin --gtest_filter='*CPU*' + + # run all tests without GPU in the name (note the leading minus sign) + build/src/caffe/test/test_all.testbin --gtest_filter=-'*GPU*' + +To get a list of all options `googletest` provides, simply pass the `--help` flag: + + build/src/caffe/test/test_all.testbin --help + **Style** - Follow [Google C++ style](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml) and [Google python style](http://google-styleguide.googlecode.com/svn/trunk/pyguide.html) + [PEP 8](http://legacy.python.org/dev/peps/pep-0008/). diff --git a/docs/getting_pretrained_models.md b/docs/getting_pretrained_models.md new file mode 100644 index 00000000000..56a6445709c --- /dev/null +++ b/docs/getting_pretrained_models.md @@ -0,0 +1,17 @@ +--- +layout: default +--- + +# Pre-trained models + +[BVLC](http://bvlc.eecs.berkeley.edu) aims to provide a variety of high quality pre-trained models. +Note that unlike Caffe itself, these models are licensed for **academic research / non-commercial use only**. +If you have any questions, please get in touch with us. + +This page will be updated as more models become available. + +### ImageNet + +Our reference implementation of the AlexNet model trained on ILSVRC-2012 can be downloaded (232.57MB) by running `examples/imagenet/get_caffe_reference_imagenet_model.sh` from the Caffe root directory. + +Additionally, you will probably eventually need some auxiliary data (mean image, synset list, etc.): run `data/ilsvrc12/get_ilsvrc_aux.sh` from the root directory to obtain it. diff --git a/docs/imagenet_detection.md b/docs/imagenet_detection.md deleted file mode 100644 index 8896814bac4..00000000000 --- a/docs/imagenet_detection.md +++ /dev/null @@ -1,477 +0,0 @@ ---- -layout: default -title: Caffe ---- - -Running Windowed Detection with Caffe -===================================== - -[View this page as an IPython Notebook](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/selective_search_demo.ipynb) (highly recommended!) - ---- - -This approach follows ideas described in Ross Girshick, Jeff Donahue, Trevor -Darrell, Jitendra Malik. *Rich feature hierarchies for accurate object detection -and semantic segmentation*. [Arxiv 2013](http://arxiv.org/abs/1311.2524). - -First of all, we'll need a little [Python -script](https://github.com/sergeyk/selective_search_ijcv_with_python) to run the -Matlab Selective Search code. - -Let's run detection on an image of a couple of cats frolicking (one of the -ImageNet detection challenge pictures), which we will download from the web. -You'll need a prototxt specifying the network, and a trained model. - -We will use `models/imagenet.prototxt` and the caffe_reference_imagenet_model -which you can download by `models/get_caffe_reference_imagenet_model.sh`. The -learned model should be at `models/caffe_reference_imagenet_model`. - - - !mkdir _temp - !curl http://farm1.static.flickr.com/220/512450093_7717fb8ce8.jpg > _temp/cat.jpg - !echo `pwd`/_temp/cat.jpg > _temp/cat.txt - !python ../python/caffe/detection/detector.py --crop_mode=selective_search --pretrained_model=../models/caffe_reference_imagenet_model --model_def=../models/imagenet.prototxt _temp/cat.txt _temp/cat.h5 - - - Loading Caffe model. - WARNING: Logging before InitGoogleLogging() is written to STDERR - I0213 01:19:34.836383 1959801216 net.cpp:66] Creating Layer conv1 - I0213 01:19:34.836407 1959801216 net.cpp:76] conv1 <- data - I0213 01:19:34.836422 1959801216 net.cpp:101] conv1 -> conv1 - I0213 01:19:36.050011 1959801216 net.cpp:116] Top shape: 96 55 55 - I0213 01:19:36.050045 1959801216 net.cpp:133] conv1 needs backward computation. - I0213 01:19:36.050055 1959801216 net.cpp:66] Creating Layer relu1 - I0213 01:19:36.050060 1959801216 net.cpp:76] relu1 <- conv1 - I0213 01:19:36.050066 1959801216 net.cpp:90] relu1 -> conv1 (in-place) - I0213 01:19:36.050075 1959801216 net.cpp:116] Top shape: 96 55 55 - I0213 01:19:36.050079 1959801216 net.cpp:133] relu1 needs backward computation. - I0213 01:19:36.050084 1959801216 net.cpp:66] Creating Layer pool1 - I0213 01:19:36.050088 1959801216 net.cpp:76] pool1 <- conv1 - I0213 01:19:36.050093 1959801216 net.cpp:101] pool1 -> pool1 - I0213 01:19:36.050101 1959801216 net.cpp:116] Top shape: 96 27 27 - I0213 01:19:36.050107 1959801216 net.cpp:133] pool1 needs backward computation. - I0213 01:19:36.050111 1959801216 net.cpp:66] Creating Layer norm1 - I0213 01:19:36.050115 1959801216 net.cpp:76] norm1 <- pool1 - I0213 01:19:36.050119 1959801216 net.cpp:101] norm1 -> norm1 - I0213 01:19:36.050127 1959801216 net.cpp:116] Top shape: 96 27 27 - I0213 01:19:36.050132 1959801216 net.cpp:133] norm1 needs backward computation. - I0213 01:19:36.050137 1959801216 net.cpp:66] Creating Layer pad2 - I0213 01:19:36.050142 1959801216 net.cpp:76] pad2 <- norm1 - I0213 01:19:36.050145 1959801216 net.cpp:101] pad2 -> pad2 - I0213 01:19:36.050151 1959801216 net.cpp:116] Top shape: 96 31 31 - I0213 01:19:36.050155 1959801216 net.cpp:133] pad2 needs backward computation. - I0213 01:19:36.050170 1959801216 net.cpp:66] Creating Layer conv2 - I0213 01:19:36.050174 1959801216 net.cpp:76] conv2 <- pad2 - I0213 01:19:36.050375 1959801216 net.cpp:101] conv2 -> conv2 - I0213 01:19:36.052516 1959801216 net.cpp:116] Top shape: 256 27 27 - I0213 01:19:36.052526 1959801216 net.cpp:133] conv2 needs backward computation. - I0213 01:19:36.052533 1959801216 net.cpp:66] Creating Layer relu2 - I0213 01:19:36.052538 1959801216 net.cpp:76] relu2 <- conv2 - I0213 01:19:36.052543 1959801216 net.cpp:90] relu2 -> conv2 (in-place) - I0213 01:19:36.052548 1959801216 net.cpp:116] Top shape: 256 27 27 - I0213 01:19:36.052552 1959801216 net.cpp:133] relu2 needs backward computation. - I0213 01:19:36.052557 1959801216 net.cpp:66] Creating Layer pool2 - I0213 01:19:36.052561 1959801216 net.cpp:76] pool2 <- conv2 - I0213 01:19:36.052567 1959801216 net.cpp:101] pool2 -> pool2 - I0213 01:19:36.052572 1959801216 net.cpp:116] Top shape: 256 13 13 - I0213 01:19:36.052577 1959801216 net.cpp:133] pool2 needs backward computation. - I0213 01:19:36.052583 1959801216 net.cpp:66] Creating Layer norm2 - I0213 01:19:36.052587 1959801216 net.cpp:76] norm2 <- pool2 - I0213 01:19:36.052592 1959801216 net.cpp:101] norm2 -> norm2 - I0213 01:19:36.052597 1959801216 net.cpp:116] Top shape: 256 13 13 - I0213 01:19:36.052602 1959801216 net.cpp:133] norm2 needs backward computation. - I0213 01:19:36.052608 1959801216 net.cpp:66] Creating Layer pad3 - I0213 01:19:36.052613 1959801216 net.cpp:76] pad3 <- norm2 - I0213 01:19:36.052618 1959801216 net.cpp:101] pad3 -> pad3 - I0213 01:19:36.052623 1959801216 net.cpp:116] Top shape: 256 15 15 - I0213 01:19:36.052628 1959801216 net.cpp:133] pad3 needs backward computation. - I0213 01:19:36.052633 1959801216 net.cpp:66] Creating Layer conv3 - I0213 01:19:36.052636 1959801216 net.cpp:76] conv3 <- pad3 - I0213 01:19:36.052641 1959801216 net.cpp:101] conv3 -> conv3 - I0213 01:19:36.058481 1959801216 net.cpp:116] Top shape: 384 13 13 - I0213 01:19:36.058501 1959801216 net.cpp:133] conv3 needs backward computation. - I0213 01:19:36.058508 1959801216 net.cpp:66] Creating Layer relu3 - I0213 01:19:36.058513 1959801216 net.cpp:76] relu3 <- conv3 - I0213 01:19:36.058521 1959801216 net.cpp:90] relu3 -> conv3 (in-place) - I0213 01:19:36.058526 1959801216 net.cpp:116] Top shape: 384 13 13 - I0213 01:19:36.058529 1959801216 net.cpp:133] relu3 needs backward computation. - I0213 01:19:36.058534 1959801216 net.cpp:66] Creating Layer pad4 - I0213 01:19:36.058538 1959801216 net.cpp:76] pad4 <- conv3 - I0213 01:19:36.058543 1959801216 net.cpp:101] pad4 -> pad4 - I0213 01:19:36.058554 1959801216 net.cpp:116] Top shape: 384 15 15 - I0213 01:19:36.058559 1959801216 net.cpp:133] pad4 needs backward computation. - I0213 01:19:36.058564 1959801216 net.cpp:66] Creating Layer conv4 - I0213 01:19:36.058568 1959801216 net.cpp:76] conv4 <- pad4 - I0213 01:19:36.058573 1959801216 net.cpp:101] conv4 -> conv4 - I0213 01:19:36.063360 1959801216 net.cpp:116] Top shape: 384 13 13 - I0213 01:19:36.063379 1959801216 net.cpp:133] conv4 needs backward computation. - I0213 01:19:36.063385 1959801216 net.cpp:66] Creating Layer relu4 - I0213 01:19:36.063391 1959801216 net.cpp:76] relu4 <- conv4 - I0213 01:19:36.063397 1959801216 net.cpp:90] relu4 -> conv4 (in-place) - I0213 01:19:36.063402 1959801216 net.cpp:116] Top shape: 384 13 13 - I0213 01:19:36.063406 1959801216 net.cpp:133] relu4 needs backward computation. - I0213 01:19:36.063411 1959801216 net.cpp:66] Creating Layer pad5 - I0213 01:19:36.063416 1959801216 net.cpp:76] pad5 <- conv4 - I0213 01:19:36.063421 1959801216 net.cpp:101] pad5 -> pad5 - I0213 01:19:36.063426 1959801216 net.cpp:116] Top shape: 384 15 15 - I0213 01:19:36.063431 1959801216 net.cpp:133] pad5 needs backward computation. - I0213 01:19:36.063441 1959801216 net.cpp:66] Creating Layer conv5 - I0213 01:19:36.063444 1959801216 net.cpp:76] conv5 <- pad5 - I0213 01:19:36.063449 1959801216 net.cpp:101] conv5 -> conv5 - I0213 01:19:36.066474 1959801216 net.cpp:116] Top shape: 256 13 13 - I0213 01:19:36.066490 1959801216 net.cpp:133] conv5 needs backward computation. - I0213 01:19:36.066496 1959801216 net.cpp:66] Creating Layer relu5 - I0213 01:19:36.066501 1959801216 net.cpp:76] relu5 <- conv5 - I0213 01:19:36.066508 1959801216 net.cpp:90] relu5 -> conv5 (in-place) - I0213 01:19:36.066512 1959801216 net.cpp:116] Top shape: 256 13 13 - I0213 01:19:36.066516 1959801216 net.cpp:133] relu5 needs backward computation. - I0213 01:19:36.066520 1959801216 net.cpp:66] Creating Layer pool5 - I0213 01:19:36.066525 1959801216 net.cpp:76] pool5 <- conv5 - I0213 01:19:36.066529 1959801216 net.cpp:101] pool5 -> pool5 - I0213 01:19:36.066535 1959801216 net.cpp:116] Top shape: 256 6 6 - I0213 01:19:36.066540 1959801216 net.cpp:133] pool5 needs backward computation. - I0213 01:19:36.066545 1959801216 net.cpp:66] Creating Layer fc6 - I0213 01:19:36.066550 1959801216 net.cpp:76] fc6 <- pool5 - I0213 01:19:36.066558 1959801216 net.cpp:101] fc6 -> fc6 - I0213 01:19:36.333488 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.333513 1959801216 net.cpp:133] fc6 needs backward computation. - I0213 01:19:36.333521 1959801216 net.cpp:66] Creating Layer relu6 - I0213 01:19:36.333528 1959801216 net.cpp:76] relu6 <- fc6 - I0213 01:19:36.333535 1959801216 net.cpp:90] relu6 -> fc6 (in-place) - I0213 01:19:36.333541 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.333546 1959801216 net.cpp:133] relu6 needs backward computation. - I0213 01:19:36.333551 1959801216 net.cpp:66] Creating Layer drop6 - I0213 01:19:36.333556 1959801216 net.cpp:76] drop6 <- fc6 - I0213 01:19:36.333560 1959801216 net.cpp:90] drop6 -> fc6 (in-place) - I0213 01:19:36.333566 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.333570 1959801216 net.cpp:133] drop6 needs backward computation. - I0213 01:19:36.333575 1959801216 net.cpp:66] Creating Layer fc7 - I0213 01:19:36.333580 1959801216 net.cpp:76] fc7 <- fc6 - I0213 01:19:36.333585 1959801216 net.cpp:101] fc7 -> fc7 - I0213 01:19:36.450057 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.450075 1959801216 net.cpp:133] fc7 needs backward computation. - I0213 01:19:36.450083 1959801216 net.cpp:66] Creating Layer relu7 - I0213 01:19:36.450089 1959801216 net.cpp:76] relu7 <- fc7 - I0213 01:19:36.450095 1959801216 net.cpp:90] relu7 -> fc7 (in-place) - I0213 01:19:36.450101 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.450105 1959801216 net.cpp:133] relu7 needs backward computation. - I0213 01:19:36.450114 1959801216 net.cpp:66] Creating Layer drop7 - I0213 01:19:36.450117 1959801216 net.cpp:76] drop7 <- fc7 - I0213 01:19:36.450121 1959801216 net.cpp:90] drop7 -> fc7 (in-place) - I0213 01:19:36.450127 1959801216 net.cpp:116] Top shape: 4096 1 1 - I0213 01:19:36.450131 1959801216 net.cpp:133] drop7 needs backward computation. - I0213 01:19:36.450136 1959801216 net.cpp:66] Creating Layer fc8 - I0213 01:19:36.450140 1959801216 net.cpp:76] fc8 <- fc7 - I0213 01:19:36.450145 1959801216 net.cpp:101] fc8 -> fc8 - I0213 01:19:36.478497 1959801216 net.cpp:116] Top shape: 1000 1 1 - I0213 01:19:36.478538 1959801216 net.cpp:133] fc8 needs backward computation. - I0213 01:19:36.478549 1959801216 net.cpp:66] Creating Layer prob - I0213 01:19:36.478555 1959801216 net.cpp:76] prob <- fc8 - I0213 01:19:36.478567 1959801216 net.cpp:101] prob -> prob - I0213 01:19:36.478581 1959801216 net.cpp:116] Top shape: 1000 1 1 - I0213 01:19:36.478585 1959801216 net.cpp:133] prob needs backward computation. - I0213 01:19:36.478590 1959801216 net.cpp:144] This network produces output prob - I0213 01:19:36.478602 1959801216 net.cpp:154] Collecting Learning Rate and Weight Decay. - I0213 01:19:36.478628 1959801216 net.cpp:148] Network initialization done. - Caffe model loaded in 2.581 s - Loading input and assembling batches... - selective_search({'/Users/karayev/work/caffe-bvlc/examples/_temp/cat.jpg'}, '/var/folders/4q/vm1lt3t91p9gl06nz6s1dzzw0000gn/T/tmpt2_xYx.mat') - 23 batches assembled in 3.691 s - Processing 1 files in 23 batches - ...on batch 0/23, elapsed time: 0.000 s - ...on batch 10/23, elapsed time: 2.928 s - ...on batch 20/23, elapsed time: 5.803 s - Processing complete after 6.722 s. - /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: - your performance may suffer as PyTables will pickle object types that it cannot - map directly to c-types [inferred_type->mixed,key->block1_values] [items->['feat']] - - warnings.warn(ws, PerformanceWarning) - Done. Saving to _temp/cat.h5 took 0.066 s. - - -Running this outputs a DataFrame with the filenames, selected windows, and their -ImageNet scores to an HDF5 file. -(We only ran on one image, so the filenames will all be the same.) - - - import pandas as pd - - df = pd.read_hdf('_temp/cat.h5', 'df') - print(df.shape) - print(df.iloc[0]) - - (223, 5) - feat [6.90396e-06, 1.27811e-06, 1.82159e-06, 1.1020... - ymin 0 - xmin 0 - ymax 500 - xmax 496 - Name: /Users/karayev/work/caffe-bvlc/examples/_temp/cat.jpg, dtype: object - - -In general, `detector.py` is most efficient when running on a lot of images: it -first extracts window proposals for all of them, batches the windows for -efficient GPU processing, and then outputs the results. -Simply list an image per line in the `images_file`, and it will process all of -them. - -Although this guide gives an example of ImageNet detection, `detector.py` is -clever enough to adapt to different Caffe models’ input dimensions, batch size, -and output categories. -Refer to `python detector.py --help` and the `images_dim` and `images_mean_file` -parameters to describe your data set. -No need for hardcoding. - -Anyway, let's now load ImageNet class names and make a DataFrame of the -features. Note you'll need the auxiliary ilsvrc2012 data fetched by -`data/ilsvrc12/get_ilsvrc12_aux.sh`. - - - with open('../data/ilsvrc12/synset_words.txt') as f: - labels_df = pd.DataFrame([ - { - 'synset_id': l.strip().split(' ')[0], - 'name': ' '.join(l.strip().split(' ')[1:]).split(',')[0] - } - for l in f.readlines() - ]) - labels_df.sort('synset_id') - feats_df = pd.DataFrame(np.vstack(df.feat.values), columns=labels_df['name']) - print(feats_df.iloc[0]) - - name - tench 0.000007 - goldfish 0.000001 - great white shark 0.000002 - tiger shark 0.000001 - hammerhead 0.000007 - electric ray 0.000004 - stingray 0.000007 - cock 0.000060 - hen 0.003055 - ostrich 0.000010 - brambling 0.000004 - goldfinch 0.000001 - house finch 0.000004 - junco 0.000002 - indigo bunting 0.000001 - ... - daisy 0.000002 - yellow lady's slipper 0.000002 - corn 0.000020 - acorn 0.000011 - hip 0.000003 - buckeye 0.000010 - coral fungus 0.000005 - agaric 0.000019 - gyromitra 0.000039 - stinkhorn 0.000002 - earthstar 0.000025 - hen-of-the-woods 0.000035 - bolete 0.000037 - ear 0.000008 - toilet tissue 0.000019 - Name: 0, Length: 1000, dtype: float32 - - -Let's look at the activations. - - - gray() - matshow(feats_df.values) - xlabel('Classes') - ylabel('Windows') - - - - - - - - - - - - - -![png](selective_search_demo_files/selective_search_demo_7_2.png) - - -Now let's take max across all windows and plot the top classes. - - - max_s = feats_df.max(0) - max_s.sort(ascending=False) - print(max_s[:10]) - - name - proboscis monkey 0.923392 - tiger cat 0.918685 - milk can 0.783663 - American black bear 0.637560 - broccoli 0.612832 - tiger 0.515798 - platypus 0.514660 - dhole 0.509583 - lion 0.496187 - dingo 0.482885 - dtype: float32 - - -Okay, there are indeed cats in there (and some nonsense). -Picking good localizations is work in progress; manually, we see that the third -and thirteenth top detections correspond to the two cats. - - - # Find, print, and display max detection. - window_order = pd.Series(feats_df.values.max(1)).order(ascending=False) - - i = window_order.index[3] - j = window_order.index[13] - - # Show top predictions for top detection. - f = pd.Series(df['feat'].iloc[i], index=labels_df['name']) - print('Top detection:') - print(f.order(ascending=False)[:5]) - print('') - - # Show top predictions for 10th top detection. - f = pd.Series(df['feat'].iloc[j], index=labels_df['name']) - print('10th detection:') - print(f.order(ascending=False)[:5]) - - # Show top detection in red, 10th top detection in blue. - im = imread('_temp/cat.jpg') - imshow(im) - currentAxis = plt.gca() - - det = df.iloc[i] - coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin'] - currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='r', linewidth=5)) - - det = df.iloc[j] - coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin'] - currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='b', linewidth=5)) - - Top detection: - name - tiger cat 0.882021 - tiger 0.075015 - tabby 0.024404 - lynx 0.012947 - Egyptian cat 0.004409 - dtype: float32 - - 10th detection: - name - tiger cat 0.681169 - Pembroke 0.063924 - dingo 0.050501 - golden retriever 0.027614 - tabby 0.021413 - dtype: float32 - - - - - - - - - - -![png](selective_search_demo_files/selective_search_demo_11_2.png) - - -That's cool. Both of these detections are tiger cats. Let's take all 'tiger cat' -detections and NMS them to get rid of overlapping windows. - - - def nms_detections(dets, overlap=0.5): - """ - Non-maximum suppression: Greedily select high-scoring detections and - skip detections that are significantly covered by a previously - selected detection. - - This version is translated from Matlab code by Tomasz Malisiewicz, - who sped up Pedro Felzenszwalb's code. - - Parameters - ---------- - dets: ndarray - each row is ['xmin', 'ymin', 'xmax', 'ymax', 'score'] - overlap: float - minimum overlap ratio (0.5 default) - - Output - ------ - dets: ndarray - remaining after suppression. - """ - if np.shape(dets)[0] < 1: - return dets - - x1 = dets[:, 0] - y1 = dets[:, 1] - x2 = dets[:, 2] - y2 = dets[:, 3] - - w = x2 - x1 - h = y2 - y1 - area = w * h - - s = dets[:, 4] - ind = np.argsort(s) - - pick = [] - counter = 0 - while len(ind) > 0: - last = len(ind) - 1 - i = ind[last] - pick.append(i) - counter += 1 - - xx1 = np.maximum(x1[i], x1[ind[:last]]) - yy1 = np.maximum(y1[i], y1[ind[:last]]) - xx2 = np.minimum(x2[i], x2[ind[:last]]) - yy2 = np.minimum(y2[i], y2[ind[:last]]) - - w = np.maximum(0., xx2 - xx1 + 1) - h = np.maximum(0., yy2 - yy1 + 1) - - o = w * h / area[ind[:last]] - - to_delete = np.concatenate( - (np.nonzero(o > overlap)[0], np.array([last]))) - ind = np.delete(ind, to_delete) - - return dets[pick, :] - - - scores = feats_df['tiger cat'] - windows = df[['xmin', 'ymin', 'xmax', 'ymax']].values - dets = np.hstack((windows, scores[:, np.newaxis])) - nms_dets = nms_detections(dets) - -Show top 3 NMS'd detections for 'tiger cat' in the image. - - - imshow(im) - currentAxis = plt.gca() - colors = ['r', 'b', 'y'] - for c, det in zip(colors, nms_dets[:3]): - currentAxis.add_patch( - Rectangle((det[0], det[1]), det[2], det[3], - fill=False, edgecolor=c, linewidth=5) - ) - - -![png](selective_search_demo_files/selective_search_demo_16_0.png) - - -Remove the temp directory to clean up. - - - import shutil - shutil.rmtree('_temp') diff --git a/docs/imagenet_pretrained.md b/docs/imagenet_pretrained.md deleted file mode 100644 index 1737b810a64..00000000000 --- a/docs/imagenet_pretrained.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -layout: default -title: Caffe ---- - -Running Pretrained ImageNet -=========================== - -[View this page as an IPython Notebook](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/imagenet_pretrained.ipynb) - -For easier use of pretrained models, we provide a wrapper specifically written for the case of ImageNet, so one can take an image and directly compute features or predictions from them. Both Python and Matlab wrappers are provided. We will describe the use of the Python wrapper here, and the Matlab wrapper usage is very similar. - -We assume that you have successfully compiled Caffe and set the correct `PYTHONPATH`. If not, please refer to the [installation instructions](installation.html). You will use our pre-trained imagenet model, which you can download (232.57MB) by running `models/get_caffe_reference_imagenet_model.sh`.Note that this pre-trained model is licensed for academic research / non-commercial use only. - -Ready? Let's start. - - - from caffe import imagenet - from matplotlib import pyplot - - # Set the right path to your model file, pretrained model, - # and the image you would like to classify. - MODEL_FILE = 'models/imagenet.prototxt' - PRETRAINED = 'models/caffe_reference_imagenet_model' - IMAGE_FILE = '/path/to/lena.png' - -Loading a network is easy. imagenet.ImagenetClassifier wraps everything. In -default, the classifier will crop the center and corners of an image, as well as -their mirrored versions, thus creating a batch of 10 images. If you look at the -provided MODEL_FILE you can actually see that we are defining the input batch -size to be 10. - -If you would like to just do the center, you need to specify center_only=1, and -also change the batch size from 10 to 1 in the prototxt. - - - net = imagenet.ImageNetClassifier( - MODEL_FILE, PRETRAINED) - -We will set the phase to test since we are doing testing, and will first use CPU -for the computation. - - - net.caffenet.set_phase_test() - net.caffenet.set_mode_cpu() - -So now, we can do a prediction. Let's show some output as well: - - - prediction = net.predict(IMAGE_FILE) - print 'prediction shape:', prediction.shape - pyplot.plot(prediction) - - prediction shape: (1000,) - [] - -![png](imagenet_pretrained_files/imagenet_pretrained_7_2.png) - - -You can see that the prediction is 1000-dimensional, and is pretty sparse. Our -pretrained model uses the alphabetical order for the synsets, and if you look at -the index that maximizes the prediction score, it is "sombrero". Reasonable -prediction, right? - -Now, why don't we see how long it takes to perform the classification end to -end? This result is run from an Intel i5 CPU, so you may observe some -performance differences with different machines. - - - %timeit net.predict(IMAGE_FILE) - - 1 loops, best of 3: 194 ms per loop - - -It may look a little slow, but note that it also includes image loading, -cropping, and python interfacing time, and the convnet is working on 10 images due to that. As a -performance note, if you really want to make prediction fast, you can -optionally write things in C and also pipeline the image loading part. But for -most applications, the current speed might be fine I guess? - -OK, so how about GPU? it is actually pretty easy: - - - net.caffenet.set_mode_gpu() - -Voila! Now we are in GPU mode. Let's see if the code gives the same result: - - - prediction = net.predict(IMAGE_FILE) - print 'prediction shape:', prediction.shape - pyplot.plot(prediction) - - prediction shape: (1000,) - [] - -![png](imagenet_pretrained_files/imagenet_pretrained_13_2.png) - - -Good, everything is the same. And how about time consumption? The following -benchmark is obtained on the same machine with a K20 GPU: - - - %timeit net.predict(IMAGE_FILE) - - 10 loops, best of 3: 50 ms per loop - - -Pretty fast right? Not as fast as you expected? Indeed, in this python demo you -are seeing only 4 times speedup. But remember - the GPU code is actually very -fast, and the data loading, transformation and interfacing actually start to -take **more** time than the actual convnet computation itself! - -To fully utilize the power of GPUs, you really want to use one of these ideas: -* Use larger batches, and minimize python call and data transfer overheads. -* Pipeline data load operations, like using a subprocess. -* Code in C++. A little inconvenient, but maybe worth it if your dataset is -really, really large. - -Parting Words -------------- - -So this is python! We hope the interface is easy enough for one to use. The -python wrapper is interfaced with boost::python, and source code can be found at -`python/caffe/imagenet`. If you would like to achieve some custom functions, you -are more than welcome to look at them! diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_13_0.text b/docs/imagenet_pretrained_files/imagenet_pretrained_13_0.text deleted file mode 100644 index 370b230b1da..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_13_0.text +++ /dev/null @@ -1 +0,0 @@ -prediction shape: (1000,) diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_13_1.text b/docs/imagenet_pretrained_files/imagenet_pretrained_13_1.text deleted file mode 100644 index 01ef4eda21f..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_13_1.text +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.png b/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.png deleted file mode 100644 index 88ed305b35d..00000000000 Binary files a/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.png and /dev/null differ diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.text b/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.text deleted file mode 100644 index 61cbdb0b223..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_13_2.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_15_0.text b/docs/imagenet_pretrained_files/imagenet_pretrained_15_0.text deleted file mode 100644 index 6edc34136a6..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_15_0.text +++ /dev/null @@ -1 +0,0 @@ -10 loops, best of 3: 50 ms per loop diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_7_0.text b/docs/imagenet_pretrained_files/imagenet_pretrained_7_0.text deleted file mode 100644 index 370b230b1da..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_7_0.text +++ /dev/null @@ -1 +0,0 @@ -prediction shape: (1000,) diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_7_1.text b/docs/imagenet_pretrained_files/imagenet_pretrained_7_1.text deleted file mode 100644 index d7fb0ea80d0..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_7_1.text +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.png b/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.png deleted file mode 100644 index df847c0c681..00000000000 Binary files a/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.png and /dev/null differ diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.text b/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.text deleted file mode 100644 index 89a19a62117..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_7_2.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/imagenet_pretrained_files/imagenet_pretrained_9_0.text b/docs/imagenet_pretrained_files/imagenet_pretrained_9_0.text deleted file mode 100644 index b0e8e68f926..00000000000 --- a/docs/imagenet_pretrained_files/imagenet_pretrained_9_0.text +++ /dev/null @@ -1 +0,0 @@ -1 loops, best of 3: 194 ms per loop diff --git a/docs/imagenet_training.md b/docs/imagenet_training.md index 140ee68d4c9..a1553dd6719 100644 --- a/docs/imagenet_training.md +++ b/docs/imagenet_training.md @@ -52,7 +52,7 @@ which will make `data/ilsvrc12/imagenet_mean.binaryproto`. Network Definition ------------------ -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet.prototxt`. Note that the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: +The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: source: "ilvsrc12_train_leveldb" meanfile: "../../data/ilsvrc12/imagenet_mean.binaryproto" diff --git a/docs/images/arrow-down.png b/docs/images/arrow-down.png deleted file mode 100644 index 585b0bddba8..00000000000 Binary files a/docs/images/arrow-down.png and /dev/null differ diff --git a/docs/images/octocat-small.png b/docs/images/octocat-small.png deleted file mode 100644 index 66c25398dd9..00000000000 Binary files a/docs/images/octocat-small.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md index dd38ac9e9c1..98282b1c0ae 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,46 +1,47 @@ --- layout: default -title: Caffe --- - -Welcome to Caffe -================ +# Welcome to Caffe Caffe is a framework for convolutional neural network algorithms, developed with speed in mind. -It was created by [Yangqing Jia](http://www.eecs.berkeley.edu/~jiayq/) as a replacement of [decaf](http://decaf.berkeleyvision.org/), Yangqing's earlier Python implementation of CNNs. -It is maintained by the [Berkeley Vision and Learning Center](http://bvlc.eecs.berkeley.edu) and several Berkeley vision group members are actively contributing to the codebase. - -Caffe is released under [the BSD 2-Clause license](license.html). +It was created by [Yangqing Jia](http://daggerfs.com), and is in active development by the [Berkeley Vision and Learning Center](http://bvlc.eecs.berkeley.edu). +Caffe is released under [the BSD 2-Clause license](https://github.com/BVLC/caffe/blob/master/LICENSE). -Decaf, the big brother of Caffe, has a cool [demo](http://decaf.berkeleyvision.org). Caffe's own demo will come soon. + -Why Caffe? ----------- +## Why Caffe? -Caffe aims to provide computer vision scientists with a **clean, modifiable implementation** of state-of-the-art deep learning algorithms. +Caffe aims to provide computer vision scientists and practitioners with a **clean and modifiable implementation** of state-of-the-art deep learning algorithms. For example, network structure is easily specified in separate config files, with no mess of hard-coded parameters in the code. -At the same time, Caffe fits industry needs, with blazing fast C++/Cuda code for GPU computation. +At the same time, Caffe fits industry needs, with blazing fast C++/CUDA code for GPU computation. Caffe is currently the fastest GPU CNN implementation publicly available, and is able to process more than **20 million images per day** on a single Tesla K20 machine \*. Caffe also provides **seamless switching between CPU and GPU**, which allows one to train models with fast GPUs and then deploy them on non-GPU clusters with one line of code: `Caffe::set_mode(Caffe::CPU)`. - Even in CPU mode, computing predictions on an image takes only 20 ms when images are processed in batch mode. -Quick Links ------------ +## Documentation + +* [Introductory slides](https://www.dropbox.com/s/10fx16yp5etb8dv/caffe-presentation.pdf): slides about the Caffe architecture, *updated 03/14*. +* [Installation](/installation.html): Instructions on installing Caffe (works on Ubuntu, Red Hat, OS X). +* [Pre-trained models](/getting_pretrained_models.html): BVLC provides some pre-trained models for academic / non-commercial use. +* [Development](/development.html): Guidelines for development and contributing to Caffe. + +### Examples + +* [LeNet / MNIST Demo](/mnist.html): end-to-end training and testing of LeNet on MNIST. +* [CIFAR-10 Demo](/cifar10.html): training and testing on the CIFAR-10 data. +* [Training ImageNet](/imagenet_training.html): end-to-end training of an ImageNet classifier. +* [Running Pretrained ImageNet \[notebook\]][pretrained_imagenet]: run classification with the pretrained ImageNet model using the Python interface. +* [Running Detection \[notebook\]][imagenet_detection]: run a pretrained model as a detector. +* [Visualizing Features and Filters \[notebook\]][visualizing_filters]: trained filters and an example image, viewed layer-by-layer. -* [Presentation](caffe-presentation.pdf): The Caffe presentation, *updated 03/14*. -* [Installation](installation.html): Instructions on installing Caffe (tested on Ubuntu 12.04, but works on Red Hat, OS X, etc.). -* [Development](development.html): Guidelines for development and contributing to Caffe. -* [MNIST Demo](mnist.html): example of end-to-end training and testing on the MNIST data. -* [Training ImageNet](imagenet_training.html): tutorial on end-to-end training of an ImageNet classifier. -* [Running Pretrained ImageNet](imagenet_pretrained.html): simply runs in Python! -* [Running Detection](imagenet_detection.html): run a pretrained model as a detector. +[pretrained_imagenet]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/imagenet_pretrained.ipynb +[imagenet_detection]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/selective_search_demo.ipynb +[visualizing_filters]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb +## Citing Caffe -Citing Caffe ------------- Please kindly cite Caffe in your publications if it helps your research: @misc{Jia13caffe, @@ -52,7 +53,7 @@ Please kindly cite Caffe in your publications if it helps your research: ### Acknowledgements -Yangqing would like to thank the NVidia Academic program for providing a K20 GPU. +Yangqing would like to thank the NVidia Academic program for providing K20 GPUs. The Caffe Matlab wrapper is courtesy of [Dr. Ross Girshick](http://www.cs.berkeley.edu/~rbg/). The detection module (`power_wrapper`) is courtesy of [Sergey Karayev](http://sergeykarayev.com/). Our thanks also go to [Jeff Donahue](http://jeffdonahue.com/) and [Oriol Vinyals](http://www1.icsi.berkeley.edu/~vinyals/) for various discussions along the journey. @@ -60,4 +61,3 @@ Our thanks also go to [Jeff Donahue](http://jeffdonahue.com/) and [Oriol Vinyals --- \*: When measured with the [SuperVision](http://www.image-net.org/challenges/LSVRC/2012/supervision.pdf) model that won the ImageNet Large Scale Visual Recognition Challenge 2012. -More benchmarks coming soon. diff --git a/docs/installation.md b/docs/installation.md index 7883daae1ff..04c57b82d41 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -31,7 +31,7 @@ The following sections detail prerequisites and installation on Ubuntu. For OS X * Boost * MKL (but see the [boost-eigen branch](https://github.com/BVLC/caffe/tree/boost-eigen) for a boost/Eigen3 port) * OpenCV -* glog, gflags, protobuf, leveldb, snappy +* glog, gflags, protobuf, leveldb, snappy, hdf5 * For the Python wrapper: python, numpy (>= 1.7 preferred), and boost_python * For the Matlab wrapper: Matlab with mex @@ -43,7 +43,7 @@ Caffe also needs Intel MKL as the backend of its matrix computation and vectoriz You will also need other packages, most of which can be installed via apt-get using: - sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev + sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev The only exception being the google logging library, which does not exist in the Ubuntu 12.04 repository. To install it, do: @@ -85,6 +85,7 @@ Install [homebrew](http://brew.sh/) to install most of the prerequisites. Starti brew install --build-from-source boost brew install snappy leveldb protobuf gflags glog brew tap homebrew/science + brew install homebrew/science/hdf5 brew install homebrew/science/opencv Building boost from source is needed to link against your local python. diff --git a/docs/license.md b/docs/license.md deleted file mode 100644 index 935072f229f..00000000000 --- a/docs/license.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: default -title: Caffe ---- - -License -================ - -[Return](index.html) - -Copyright (c) 2014, The Regents of the University of California (Regents) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/mnist.md b/docs/mnist.md index d23c263d04c..c97f3cfe9e1 100644 --- a/docs/mnist.md +++ b/docs/mnist.md @@ -18,7 +18,7 @@ You will first need to download and convert the data format from the MNIST websi cd $CAFFE_ROOT/examples/lenet ./create_mnist.sh -If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be two datasets, `CAFFE_ROOT/data/mnist-train-leveldb`, and `CAFFE_ROOT/data/mnist-test-leveldb`. +If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be two datasets, `mnist-train-leveldb`, and `mnist-test-leveldb`. LeNet: the MNIST Classification Model ------------------------------------- diff --git a/docs/selective_search_demo_files/selective_search_demo_11_0.text b/docs/selective_search_demo_files/selective_search_demo_11_0.text deleted file mode 100644 index 4a3d909d248..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_11_0.text +++ /dev/null @@ -1,17 +0,0 @@ -Top detection: -name -tiger cat 0.882021 -tiger 0.075015 -tabby 0.024404 -lynx 0.012947 -Egyptian cat 0.004409 -dtype: float32 - -10th detection: -name -tiger cat 0.681169 -Pembroke 0.063924 -dingo 0.050501 -golden retriever 0.027614 -tabby 0.021413 -dtype: float32 diff --git a/docs/selective_search_demo_files/selective_search_demo_11_1.text b/docs/selective_search_demo_files/selective_search_demo_11_1.text deleted file mode 100644 index 6a948db6dda..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_11_1.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_11_2.png b/docs/selective_search_demo_files/selective_search_demo_11_2.png deleted file mode 100644 index 076f6e508a6..00000000000 Binary files a/docs/selective_search_demo_files/selective_search_demo_11_2.png and /dev/null differ diff --git a/docs/selective_search_demo_files/selective_search_demo_11_2.text b/docs/selective_search_demo_files/selective_search_demo_11_2.text deleted file mode 100644 index 768fa0f1432..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_11_2.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_16_0.png b/docs/selective_search_demo_files/selective_search_demo_16_0.png deleted file mode 100644 index 7694f1cd22e..00000000000 Binary files a/docs/selective_search_demo_files/selective_search_demo_16_0.png and /dev/null differ diff --git a/docs/selective_search_demo_files/selective_search_demo_16_0.text b/docs/selective_search_demo_files/selective_search_demo_16_0.text deleted file mode 100644 index d1df298520c..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_16_0.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_1_0.text b/docs/selective_search_demo_files/selective_search_demo_1_0.text deleted file mode 100644 index 3431df784ac..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_1_0.text +++ /dev/null @@ -1,158 +0,0 @@ - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 212k 100 212k 0 0 166k 0 0:00:01 0:00:01 --:--:-- 267k -Loading Caffe model. -WARNING: Logging before InitGoogleLogging() is written to STDERR -I0213 01:19:34.836383 1959801216 net.cpp:66] Creating Layer conv1 -I0213 01:19:34.836407 1959801216 net.cpp:76] conv1 <- data -I0213 01:19:34.836422 1959801216 net.cpp:101] conv1 -> conv1 -I0213 01:19:36.050011 1959801216 net.cpp:116] Top shape: 96 55 55 -I0213 01:19:36.050045 1959801216 net.cpp:133] conv1 needs backward computation. -I0213 01:19:36.050055 1959801216 net.cpp:66] Creating Layer relu1 -I0213 01:19:36.050060 1959801216 net.cpp:76] relu1 <- conv1 -I0213 01:19:36.050066 1959801216 net.cpp:90] relu1 -> conv1 (in-place) -I0213 01:19:36.050075 1959801216 net.cpp:116] Top shape: 96 55 55 -I0213 01:19:36.050079 1959801216 net.cpp:133] relu1 needs backward computation. -I0213 01:19:36.050084 1959801216 net.cpp:66] Creating Layer pool1 -I0213 01:19:36.050088 1959801216 net.cpp:76] pool1 <- conv1 -I0213 01:19:36.050093 1959801216 net.cpp:101] pool1 -> pool1 -I0213 01:19:36.050101 1959801216 net.cpp:116] Top shape: 96 27 27 -I0213 01:19:36.050107 1959801216 net.cpp:133] pool1 needs backward computation. -I0213 01:19:36.050111 1959801216 net.cpp:66] Creating Layer norm1 -I0213 01:19:36.050115 1959801216 net.cpp:76] norm1 <- pool1 -I0213 01:19:36.050119 1959801216 net.cpp:101] norm1 -> norm1 -I0213 01:19:36.050127 1959801216 net.cpp:116] Top shape: 96 27 27 -I0213 01:19:36.050132 1959801216 net.cpp:133] norm1 needs backward computation. -I0213 01:19:36.050137 1959801216 net.cpp:66] Creating Layer pad2 -I0213 01:19:36.050142 1959801216 net.cpp:76] pad2 <- norm1 -I0213 01:19:36.050145 1959801216 net.cpp:101] pad2 -> pad2 -I0213 01:19:36.050151 1959801216 net.cpp:116] Top shape: 96 31 31 -I0213 01:19:36.050155 1959801216 net.cpp:133] pad2 needs backward computation. -I0213 01:19:36.050170 1959801216 net.cpp:66] Creating Layer conv2 -I0213 01:19:36.050174 1959801216 net.cpp:76] conv2 <- pad2 -I0213 01:19:36.050375 1959801216 net.cpp:101] conv2 -> conv2 -I0213 01:19:36.052516 1959801216 net.cpp:116] Top shape: 256 27 27 -I0213 01:19:36.052526 1959801216 net.cpp:133] conv2 needs backward computation. -I0213 01:19:36.052533 1959801216 net.cpp:66] Creating Layer relu2 -I0213 01:19:36.052538 1959801216 net.cpp:76] relu2 <- conv2 -I0213 01:19:36.052543 1959801216 net.cpp:90] relu2 -> conv2 (in-place) -I0213 01:19:36.052548 1959801216 net.cpp:116] Top shape: 256 27 27 -I0213 01:19:36.052552 1959801216 net.cpp:133] relu2 needs backward computation. -I0213 01:19:36.052557 1959801216 net.cpp:66] Creating Layer pool2 -I0213 01:19:36.052561 1959801216 net.cpp:76] pool2 <- conv2 -I0213 01:19:36.052567 1959801216 net.cpp:101] pool2 -> pool2 -I0213 01:19:36.052572 1959801216 net.cpp:116] Top shape: 256 13 13 -I0213 01:19:36.052577 1959801216 net.cpp:133] pool2 needs backward computation. -I0213 01:19:36.052583 1959801216 net.cpp:66] Creating Layer norm2 -I0213 01:19:36.052587 1959801216 net.cpp:76] norm2 <- pool2 -I0213 01:19:36.052592 1959801216 net.cpp:101] norm2 -> norm2 -I0213 01:19:36.052597 1959801216 net.cpp:116] Top shape: 256 13 13 -I0213 01:19:36.052602 1959801216 net.cpp:133] norm2 needs backward computation. -I0213 01:19:36.052608 1959801216 net.cpp:66] Creating Layer pad3 -I0213 01:19:36.052613 1959801216 net.cpp:76] pad3 <- norm2 -I0213 01:19:36.052618 1959801216 net.cpp:101] pad3 -> pad3 -I0213 01:19:36.052623 1959801216 net.cpp:116] Top shape: 256 15 15 -I0213 01:19:36.052628 1959801216 net.cpp:133] pad3 needs backward computation. -I0213 01:19:36.052633 1959801216 net.cpp:66] Creating Layer conv3 -I0213 01:19:36.052636 1959801216 net.cpp:76] conv3 <- pad3 -I0213 01:19:36.052641 1959801216 net.cpp:101] conv3 -> conv3 -I0213 01:19:36.058481 1959801216 net.cpp:116] Top shape: 384 13 13 -I0213 01:19:36.058501 1959801216 net.cpp:133] conv3 needs backward computation. -I0213 01:19:36.058508 1959801216 net.cpp:66] Creating Layer relu3 -I0213 01:19:36.058513 1959801216 net.cpp:76] relu3 <- conv3 -I0213 01:19:36.058521 1959801216 net.cpp:90] relu3 -> conv3 (in-place) -I0213 01:19:36.058526 1959801216 net.cpp:116] Top shape: 384 13 13 -I0213 01:19:36.058529 1959801216 net.cpp:133] relu3 needs backward computation. -I0213 01:19:36.058534 1959801216 net.cpp:66] Creating Layer pad4 -I0213 01:19:36.058538 1959801216 net.cpp:76] pad4 <- conv3 -I0213 01:19:36.058543 1959801216 net.cpp:101] pad4 -> pad4 -I0213 01:19:36.058554 1959801216 net.cpp:116] Top shape: 384 15 15 -I0213 01:19:36.058559 1959801216 net.cpp:133] pad4 needs backward computation. -I0213 01:19:36.058564 1959801216 net.cpp:66] Creating Layer conv4 -I0213 01:19:36.058568 1959801216 net.cpp:76] conv4 <- pad4 -I0213 01:19:36.058573 1959801216 net.cpp:101] conv4 -> conv4 -I0213 01:19:36.063360 1959801216 net.cpp:116] Top shape: 384 13 13 -I0213 01:19:36.063379 1959801216 net.cpp:133] conv4 needs backward computation. -I0213 01:19:36.063385 1959801216 net.cpp:66] Creating Layer relu4 -I0213 01:19:36.063391 1959801216 net.cpp:76] relu4 <- conv4 -I0213 01:19:36.063397 1959801216 net.cpp:90] relu4 -> conv4 (in-place) -I0213 01:19:36.063402 1959801216 net.cpp:116] Top shape: 384 13 13 -I0213 01:19:36.063406 1959801216 net.cpp:133] relu4 needs backward computation. -I0213 01:19:36.063411 1959801216 net.cpp:66] Creating Layer pad5 -I0213 01:19:36.063416 1959801216 net.cpp:76] pad5 <- conv4 -I0213 01:19:36.063421 1959801216 net.cpp:101] pad5 -> pad5 -I0213 01:19:36.063426 1959801216 net.cpp:116] Top shape: 384 15 15 -I0213 01:19:36.063431 1959801216 net.cpp:133] pad5 needs backward computation. -I0213 01:19:36.063441 1959801216 net.cpp:66] Creating Layer conv5 -I0213 01:19:36.063444 1959801216 net.cpp:76] conv5 <- pad5 -I0213 01:19:36.063449 1959801216 net.cpp:101] conv5 -> conv5 -I0213 01:19:36.066474 1959801216 net.cpp:116] Top shape: 256 13 13 -I0213 01:19:36.066490 1959801216 net.cpp:133] conv5 needs backward computation. -I0213 01:19:36.066496 1959801216 net.cpp:66] Creating Layer relu5 -I0213 01:19:36.066501 1959801216 net.cpp:76] relu5 <- conv5 -I0213 01:19:36.066508 1959801216 net.cpp:90] relu5 -> conv5 (in-place) -I0213 01:19:36.066512 1959801216 net.cpp:116] Top shape: 256 13 13 -I0213 01:19:36.066516 1959801216 net.cpp:133] relu5 needs backward computation. -I0213 01:19:36.066520 1959801216 net.cpp:66] Creating Layer pool5 -I0213 01:19:36.066525 1959801216 net.cpp:76] pool5 <- conv5 -I0213 01:19:36.066529 1959801216 net.cpp:101] pool5 -> pool5 -I0213 01:19:36.066535 1959801216 net.cpp:116] Top shape: 256 6 6 -I0213 01:19:36.066540 1959801216 net.cpp:133] pool5 needs backward computation. -I0213 01:19:36.066545 1959801216 net.cpp:66] Creating Layer fc6 -I0213 01:19:36.066550 1959801216 net.cpp:76] fc6 <- pool5 -I0213 01:19:36.066558 1959801216 net.cpp:101] fc6 -> fc6 -I0213 01:19:36.333488 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.333513 1959801216 net.cpp:133] fc6 needs backward computation. -I0213 01:19:36.333521 1959801216 net.cpp:66] Creating Layer relu6 -I0213 01:19:36.333528 1959801216 net.cpp:76] relu6 <- fc6 -I0213 01:19:36.333535 1959801216 net.cpp:90] relu6 -> fc6 (in-place) -I0213 01:19:36.333541 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.333546 1959801216 net.cpp:133] relu6 needs backward computation. -I0213 01:19:36.333551 1959801216 net.cpp:66] Creating Layer drop6 -I0213 01:19:36.333556 1959801216 net.cpp:76] drop6 <- fc6 -I0213 01:19:36.333560 1959801216 net.cpp:90] drop6 -> fc6 (in-place) -I0213 01:19:36.333566 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.333570 1959801216 net.cpp:133] drop6 needs backward computation. -I0213 01:19:36.333575 1959801216 net.cpp:66] Creating Layer fc7 -I0213 01:19:36.333580 1959801216 net.cpp:76] fc7 <- fc6 -I0213 01:19:36.333585 1959801216 net.cpp:101] fc7 -> fc7 -I0213 01:19:36.450057 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.450075 1959801216 net.cpp:133] fc7 needs backward computation. -I0213 01:19:36.450083 1959801216 net.cpp:66] Creating Layer relu7 -I0213 01:19:36.450089 1959801216 net.cpp:76] relu7 <- fc7 -I0213 01:19:36.450095 1959801216 net.cpp:90] relu7 -> fc7 (in-place) -I0213 01:19:36.450101 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.450105 1959801216 net.cpp:133] relu7 needs backward computation. -I0213 01:19:36.450114 1959801216 net.cpp:66] Creating Layer drop7 -I0213 01:19:36.450117 1959801216 net.cpp:76] drop7 <- fc7 -I0213 01:19:36.450121 1959801216 net.cpp:90] drop7 -> fc7 (in-place) -I0213 01:19:36.450127 1959801216 net.cpp:116] Top shape: 4096 1 1 -I0213 01:19:36.450131 1959801216 net.cpp:133] drop7 needs backward computation. -I0213 01:19:36.450136 1959801216 net.cpp:66] Creating Layer fc8 -I0213 01:19:36.450140 1959801216 net.cpp:76] fc8 <- fc7 -I0213 01:19:36.450145 1959801216 net.cpp:101] fc8 -> fc8 -I0213 01:19:36.478497 1959801216 net.cpp:116] Top shape: 1000 1 1 -I0213 01:19:36.478538 1959801216 net.cpp:133] fc8 needs backward computation. -I0213 01:19:36.478549 1959801216 net.cpp:66] Creating Layer prob -I0213 01:19:36.478555 1959801216 net.cpp:76] prob <- fc8 -I0213 01:19:36.478567 1959801216 net.cpp:101] prob -> prob -I0213 01:19:36.478581 1959801216 net.cpp:116] Top shape: 1000 1 1 -I0213 01:19:36.478585 1959801216 net.cpp:133] prob needs backward computation. -I0213 01:19:36.478590 1959801216 net.cpp:144] This network produces output prob -I0213 01:19:36.478602 1959801216 net.cpp:154] Collecting Learning Rate and Weight Decay. -I0213 01:19:36.478628 1959801216 net.cpp:148] Network initialization done. -Caffe model loaded in 2.581 s -Loading input and assembling batches... -selective_search({'/Users/karayev/work/caffe-bvlc/examples/_temp/cat.jpg'}, '/var/folders/4q/vm1lt3t91p9gl06nz6s1dzzw0000gn/T/tmpt2_xYx.mat') -23 batches assembled in 3.691 s -Processing 1 files in 23 batches -...on batch 0/23, elapsed time: 0.000 s -...on batch 10/23, elapsed time: 2.928 s -...on batch 20/23, elapsed time: 5.803 s -Processing complete after 6.722 s. -/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: -your performance may suffer as PyTables will pickle object types that it cannot -map directly to c-types [inferred_type->mixed,key->block1_values] [items->['feat']] - - warnings.warn(ws, PerformanceWarning) -Done. Saving to _temp/cat.h5 took 0.066 s. diff --git a/docs/selective_search_demo_files/selective_search_demo_3_0.text b/docs/selective_search_demo_files/selective_search_demo_3_0.text deleted file mode 100644 index 3781b70248f..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_3_0.text +++ /dev/null @@ -1,7 +0,0 @@ -(223, 5) -feat [6.90396e-06, 1.27811e-06, 1.82159e-06, 1.1020... -ymin 0 -xmin 0 -ymax 500 -xmax 496 -Name: /Users/karayev/work/caffe-bvlc/examples/_temp/cat.jpg, dtype: object diff --git a/docs/selective_search_demo_files/selective_search_demo_5_0.text b/docs/selective_search_demo_files/selective_search_demo_5_0.text deleted file mode 100644 index 2c3243098b3..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_5_0.text +++ /dev/null @@ -1,33 +0,0 @@ -name -tench 0.000007 -goldfish 0.000001 -great white shark 0.000002 -tiger shark 0.000001 -hammerhead 0.000007 -electric ray 0.000004 -stingray 0.000007 -cock 0.000060 -hen 0.003055 -ostrich 0.000010 -brambling 0.000004 -goldfinch 0.000001 -house finch 0.000004 -junco 0.000002 -indigo bunting 0.000001 -... -daisy 0.000002 -yellow lady's slipper 0.000002 -corn 0.000020 -acorn 0.000011 -hip 0.000003 -buckeye 0.000010 -coral fungus 0.000005 -agaric 0.000019 -gyromitra 0.000039 -stinkhorn 0.000002 -earthstar 0.000025 -hen-of-the-woods 0.000035 -bolete 0.000037 -ear 0.000008 -toilet tissue 0.000019 -Name: 0, Length: 1000, dtype: float32 diff --git a/docs/selective_search_demo_files/selective_search_demo_7_0.text b/docs/selective_search_demo_files/selective_search_demo_7_0.text deleted file mode 100644 index 2bb93ff920a..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_7_0.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_7_1.text b/docs/selective_search_demo_files/selective_search_demo_7_1.text deleted file mode 100644 index 1997d863257..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_7_1.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_7_2.png b/docs/selective_search_demo_files/selective_search_demo_7_2.png deleted file mode 100644 index 8f00131e3e0..00000000000 Binary files a/docs/selective_search_demo_files/selective_search_demo_7_2.png and /dev/null differ diff --git a/docs/selective_search_demo_files/selective_search_demo_7_2.text b/docs/selective_search_demo_files/selective_search_demo_7_2.text deleted file mode 100644 index db4d8cea43f..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_7_2.text +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/selective_search_demo_files/selective_search_demo_9_0.text b/docs/selective_search_demo_files/selective_search_demo_9_0.text deleted file mode 100644 index 416ec2b5d9f..00000000000 --- a/docs/selective_search_demo_files/selective_search_demo_9_0.text +++ /dev/null @@ -1,12 +0,0 @@ -name -proboscis monkey 0.923392 -tiger cat 0.918685 -milk can 0.783663 -American black bear 0.637560 -broccoli 0.612832 -tiger 0.515798 -platypus 0.514660 -dhole 0.509583 -lion 0.496187 -dingo 0.482885 -dtype: float32 diff --git a/examples/cifar/TODO.md b/examples/cifar/TODO.md deleted file mode 100644 index 5e8dd277907..00000000000 --- a/examples/cifar/TODO.md +++ /dev/null @@ -1,4 +0,0 @@ -# CIFAR-10 - -Contributing a CIFAR-10 example would be welcome! A benchmark against -cuda-convnet could be interesting too. diff --git a/examples/cifar10/cifar10_full.prototxt b/examples/cifar10/cifar10_full.prototxt new file mode 100644 index 00000000000..64fb2a8de85 --- /dev/null +++ b/examples/cifar10/cifar10_full.prototxt @@ -0,0 +1,153 @@ +name: "CIFAR10_full_deploy" +# N.B. input image must be in CIFAR-10 format +# as described at http://www.cs.toronto.edu/~kriz/cifar.html +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 32 +input_dim: 32 +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +layers { + layer { + name: "norm1" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool1" + top: "norm1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "norm1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +layers { + layer { + name: "norm2" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool2" + top: "norm2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + } + bottom: "norm2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 10 + blobs_lr: 1. + blobs_lr: 2. + weight_decay: 250. + weight_decay: 0. + } + bottom: "pool3" + top: "ip1" +} +#-----------------------output------------------------ +layers { + layer { + name: "prob" + type: "softmax" + } + bottom: "ip1" + top: "prob" +} diff --git a/examples/cifar10/cifar10_full_solver.prototxt b/examples/cifar10/cifar10_full_solver.prototxt new file mode 100644 index 00000000000..b985b65d9da --- /dev/null +++ b/examples/cifar10/cifar10_full_solver.prototxt @@ -0,0 +1,28 @@ +# reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 +# then another factor of 10 after 10 more epochs (5000 iters) + +# The training protocol buffer definition +train_net: "cifar10_full_train.prototxt" +# The testing protocol buffer definition +test_net: "cifar10_full_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of CIFAR10, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 1000 training iterations. +test_interval: 1000 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.001 +momentum: 0.9 +weight_decay: 0.004 +# The learning rate policy +lr_policy: "fixed" +# Display every 200 iterations +display: 200 +# The maximum number of iterations +max_iter: 60000 +# snapshot intermediate results +snapshot: 10000 +snapshot_prefix: "cifar10_full" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 diff --git a/examples/cifar10/cifar10_full_solver_lr1.prototxt b/examples/cifar10/cifar10_full_solver_lr1.prototxt new file mode 100644 index 00000000000..9f5f466f501 --- /dev/null +++ b/examples/cifar10/cifar10_full_solver_lr1.prototxt @@ -0,0 +1,28 @@ +# reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 +# then another factor of 10 after 10 more epochs (5000 iters) + +# The training protocol buffer definition +train_net: "cifar10_full_train.prototxt" +# The testing protocol buffer definition +test_net: "cifar10_full_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of CIFAR10, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 1000 training iterations. +test_interval: 1000 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.0001 +momentum: 0.9 +weight_decay: 0.004 +# The learning rate policy +lr_policy: "fixed" +# Display every 200 iterations +display: 200 +# The maximum number of iterations +max_iter: 65000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "cifar10_full" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 diff --git a/examples/cifar10/cifar10_full_solver_lr2.prototxt b/examples/cifar10/cifar10_full_solver_lr2.prototxt new file mode 100644 index 00000000000..785dffe0359 --- /dev/null +++ b/examples/cifar10/cifar10_full_solver_lr2.prototxt @@ -0,0 +1,28 @@ +# reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 +# then another factor of 10 after 10 more epochs (5000 iters) + +# The training protocol buffer definition +train_net: "cifar10_full_train.prototxt" +# The testing protocol buffer definition +test_net: "cifar10_full_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of CIFAR10, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 1000 training iterations. +test_interval: 1000 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.00001 +momentum: 0.9 +weight_decay: 0.004 +# The learning rate policy +lr_policy: "fixed" +# Display every 200 iterations +display: 200 +# The maximum number of iterations +max_iter: 70000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "cifar10_full" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 diff --git a/examples/cifar10/cifar10_full_test.prototxt b/examples/cifar10/cifar10_full_test.prototxt new file mode 100644 index 00000000000..a77c7d268da --- /dev/null +++ b/examples/cifar10/cifar10_full_test.prototxt @@ -0,0 +1,194 @@ +name: "CIFAR10_full_test" +layers { + layer { + name: "cifar" + type: "data" + source: "cifar10-leveldb/cifar-test-leveldb" + meanfile: "mean.binaryproto" + batchsize: 100 + } + top: "data" + top: "label" +} +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.0001 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +layers { + layer { + name: "norm1" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool1" + top: "norm1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "norm1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +layers { + layer { + name: "norm2" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool2" + top: "norm2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } + bottom: "norm2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + weight_decay: 250. + weight_decay: 0. + } + bottom: "pool3" + top: "ip1" +} +#-----------------------output------------------------ +layers { + layer { + name: "prob" + type: "softmax" + } + bottom: "ip1" + top: "prob" +} +layers { + layer { + name: "accuracy" + type: "accuracy" + } + bottom: "prob" + bottom: "label" + top: "accuracy" +} diff --git a/examples/cifar10/cifar10_full_train.prototxt b/examples/cifar10/cifar10_full_train.prototxt new file mode 100644 index 00000000000..28e4612c04e --- /dev/null +++ b/examples/cifar10/cifar10_full_train.prototxt @@ -0,0 +1,185 @@ +name: "CIFAR10_full_train" +layers { + layer { + name: "cifar" + type: "data" + source: "cifar10-leveldb/cifar-train-leveldb" + meanfile: "mean.binaryproto" + batchsize: 100 + } + top: "data" + top: "label" +} +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.0001 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +layers { + layer { + name: "norm1" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool1" + top: "norm1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "norm1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +layers { + layer { + name: "norm2" + type: "lrn" + local_size: 3 + alpha: 0.00005 + beta: 0.75 + } + bottom: "pool2" + top: "norm2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } + bottom: "norm2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + weight_decay: 250. + weight_decay: 0. + } + bottom: "pool3" + top: "ip1" +} +#-----------------------output------------------------ +layers { + layer { + name: "loss" + type: "softmax_loss" + } + bottom: "ip1" + bottom: "label" +} diff --git a/examples/cifar10/cifar10_quick.prototxt b/examples/cifar10/cifar10_quick.prototxt new file mode 100644 index 00000000000..6161caa10e8 --- /dev/null +++ b/examples/cifar10/cifar10_quick.prototxt @@ -0,0 +1,143 @@ +name: "CIFAR10_quick_test" +# N.B. input image must be in CIFAR-10 format +# as described at http://www.cs.toronto.edu/~kriz/cifar.html +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 32 +input_dim: 32 +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 64 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool3" + top: "ip1" +} +#--------------------------layer 5------------------------ +layers { + layer { + name: "ip2" + type: "innerproduct" + num_output: 10 + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "ip1" + top: "ip2" +} +#-----------------------output------------------------ +layers { + layer { + name: "prob" + type: "softmax" + } + bottom: "ip2" + top: "prob" +} diff --git a/examples/cifar10/cifar10_quick_solver.prototxt b/examples/cifar10/cifar10_quick_solver.prototxt new file mode 100644 index 00000000000..32ba69de49a --- /dev/null +++ b/examples/cifar10/cifar10_quick_solver.prototxt @@ -0,0 +1,27 @@ +# reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 + +# The training protocol buffer definition +train_net: "cifar10_quick_train.prototxt" +# The testing protocol buffer definition +test_net: "cifar10_quick_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.001 +momentum: 0.9 +weight_decay: 0.004 +# The learning rate policy +lr_policy: "fixed" +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 4000 +# snapshot intermediate results +snapshot: 4000 +snapshot_prefix: "cifar10_quick" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 diff --git a/examples/cifar10/cifar10_quick_solver_lr1.prototxt b/examples/cifar10/cifar10_quick_solver_lr1.prototxt new file mode 100644 index 00000000000..1f369cc2351 --- /dev/null +++ b/examples/cifar10/cifar10_quick_solver_lr1.prototxt @@ -0,0 +1,27 @@ +# reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 + +# The training protocol buffer definition +train_net: "cifar10_quick_train.prototxt" +# The testing protocol buffer definition +test_net: "cifar10_quick_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.0001 +momentum: 0.9 +weight_decay: 0.004 +# The learning rate policy +lr_policy: "fixed" +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 5000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "cifar10_quick" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 diff --git a/examples/cifar10/cifar10_quick_test.prototxt b/examples/cifar10/cifar10_quick_test.prototxt new file mode 100644 index 00000000000..a937df57d00 --- /dev/null +++ b/examples/cifar10/cifar10_quick_test.prototxt @@ -0,0 +1,192 @@ +# quick config +name: "CIFAR10_quick_test" +layers { + layer { + name: "cifar" + type: "data" + source: "cifar10-leveldb/cifar-test-leveldb" + meanfile: "mean.binaryproto" + batchsize: 100 + } + top: "data" + top: "label" +} +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.0001 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 64 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool3" + top: "ip1" +} +#--------------------------layer 5------------------------ +layers { + layer { + name: "ip2" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "ip1" + top: "ip2" +} +#-----------------------output------------------------ +layers { + layer { + name: "prob" + type: "softmax" + } + bottom: "ip2" + top: "prob" +} +layers { + layer { + name: "accuracy" + type: "accuracy" + } + bottom: "prob" + bottom: "label" + top: "accuracy" +} diff --git a/examples/cifar10/cifar10_quick_train.prototxt b/examples/cifar10/cifar10_quick_train.prototxt new file mode 100644 index 00000000000..2d3a10a6c7f --- /dev/null +++ b/examples/cifar10/cifar10_quick_train.prototxt @@ -0,0 +1,183 @@ +# quick config +name: "CIFAR10_quick_train" +layers { + layer { + name: "cifar" + type: "data" + source: "cifar10-leveldb/cifar-train-leveldb" + meanfile: "mean.binaryproto" + batchsize: 100 + } + top: "data" + top: "label" +} +# ------------------------ layer 1 ----------------------------- +layers { + layer { + name: "conv1" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.0001 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 3 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "pool1" + top: "pool1" +} +# --------------------------- layer 2 ------------------------ +layers { + layer { + name: "conv2" + type: "conv" + num_output: 32 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool1" + top: "conv2" +} +layers { + layer { + name: "relu2" + type: "relu" + } + bottom: "conv2" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv2" + top: "pool2" +} +#-----------------------layer 3------------------------- +layers { + layer { + name: "conv3" + type: "conv" + num_output: 64 + kernelsize: 5 + pad: 2 + stride: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool2" + top: "conv3" +} +layers { + layer { + name: "relu3" + type: "relu" + } + bottom: "conv3" + top: "conv3" +} +layers { + layer { + name: "pool3" + type: "pool" + kernelsize: 3 + stride: 2 + pool: AVE + } + bottom: "conv3" + top: "pool3" +} +#--------------------------layer 4------------------------ +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 64 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "pool3" + top: "ip1" +} +#--------------------------layer 5------------------------ +layers { + layer { + name: "ip2" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "gaussian" + std: 0.1 + } + bias_filler { + type: "constant" + } + blobs_lr: 1.0 + blobs_lr: 2.0 + } + bottom: "ip1" + top: "ip2" +} +#-----------------------output------------------------ +layers { + layer { + name: "loss" + type: "softmax_loss" + } + bottom: "ip2" + bottom: "label" +} diff --git a/examples/cifar/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp similarity index 70% rename from examples/cifar/convert_cifar_data.cpp rename to examples/cifar10/convert_cifar_data.cpp index 083ea9e4dc1..648dd37b792 100644 --- a/examples/cifar/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -12,25 +12,23 @@ #include #include -#include -#include +#include // NOLINT(readability/streams) #include #include "caffe/proto/caffe.pb.h" using std::string; +const int kCIFARSize = 32; +const int kCIFARImageNBytes = 3072; +const int kCIFARBatchSize = 10000; +const int kCIFARTrainBatches = 5; -const int kCIFAR_SIZE=32; -const int kCIFAR_IMAGE_NBYTES=3072; -const int kCIFAR_BATCHSIZE=10000; -const int kCIFAR_TRAIN_BATCHES=5; - -void read_image(std::ifstream& file, int* label, char* buffer) { +void read_image(std::ifstream* file, int* label, char* buffer) { char label_char; - file.read(&label_char, 1); + file->read(&label_char, 1); *label = label_char; - file.read(buffer, kCIFAR_IMAGE_NBYTES); + file->read(buffer, kCIFARImageNBytes); return; } @@ -41,12 +39,12 @@ void convert_dataset(const string& input_folder, const string& output_folder) { options.error_if_exists = true; // Data buffer int label; - char str_buffer[kCIFAR_IMAGE_NBYTES]; + char str_buffer[kCIFARImageNBytes]; string value; caffe::Datum datum; datum.set_channels(3); - datum.set_height(kCIFAR_SIZE); - datum.set_width(kCIFAR_SIZE); + datum.set_height(kCIFARSize); + datum.set_width(kCIFARSize); LOG(INFO) << "Writing Training data"; leveldb::DB* train_db; @@ -54,19 +52,20 @@ void convert_dataset(const string& input_folder, const string& output_folder) { status = leveldb::DB::Open(options, output_folder + "/cifar-train-leveldb", &train_db); CHECK(status.ok()) << "Failed to open leveldb."; - for (int fileid = 0; fileid < kCIFAR_TRAIN_BATCHES; ++fileid) { + for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) { // Open files LOG(INFO) << "Training Batch " << fileid + 1; - sprintf(str_buffer, "/data_batch_%d.bin", fileid + 1); + snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1); std::ifstream data_file((input_folder + str_buffer).c_str(), std::ios::in | std::ios::binary); CHECK(data_file) << "Unable to open train file #" << fileid + 1; - for (int itemid = 0; itemid < kCIFAR_BATCHSIZE; ++itemid) { - read_image(data_file, &label, str_buffer); + for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) { + read_image(&data_file, &label, str_buffer); datum.set_label(label); - datum.set_data(str_buffer, kCIFAR_IMAGE_NBYTES); + datum.set_data(str_buffer, kCIFARImageNBytes); datum.SerializeToString(&value); - sprintf(str_buffer, "%05d", fileid * kCIFAR_BATCHSIZE + itemid); + snprintf(str_buffer, kCIFARImageNBytes, "%05d", + fileid * kCIFARBatchSize + itemid); train_db->Put(leveldb::WriteOptions(), string(str_buffer), value); } } @@ -79,12 +78,12 @@ void convert_dataset(const string& input_folder, const string& output_folder) { std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); CHECK(data_file) << "Unable to open test file."; - for (int itemid = 0; itemid < kCIFAR_BATCHSIZE; ++itemid) { - read_image(data_file, &label, str_buffer); + for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) { + read_image(&data_file, &label, str_buffer); datum.set_label(label); - datum.set_data(str_buffer, kCIFAR_IMAGE_NBYTES); + datum.set_data(str_buffer, kCIFARImageNBytes); datum.SerializeToString(&value); - sprintf(str_buffer, "%05d", itemid); + snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); test_db->Put(leveldb::WriteOptions(), string(str_buffer), value); } @@ -92,7 +91,7 @@ void convert_dataset(const string& input_folder, const string& output_folder) { delete test_db; } -int main (int argc, char** argv) { +int main(int argc, char** argv) { if (argc != 3) { printf("This script converts the CIFAR dataset to the leveldb format used\n" "by caffe to perform classification.\n" diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh new file mode 100755 index 00000000000..2d8428b1262 --- /dev/null +++ b/examples/cifar10/create_cifar10.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env sh +# This script converts the cifar data into leveldb format. + +EXAMPLES=../../build/examples/cifar +DATA=../../data/cifar10 +TOOLS=../../build/tools + +echo "Creating leveldb..." + +rm -rf cifar10-leveldb +mkdir cifar10-leveldb + +$EXAMPLES/convert_cifar_data.bin $DATA ./cifar10-leveldb + +echo "Computing image mean..." + +$TOOLS/compute_image_mean.bin ./cifar10-leveldb/cifar-train-leveldb mean.binaryproto + +echo "Done." diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh new file mode 100755 index 00000000000..1767da6798d --- /dev/null +++ b/examples/cifar10/train_full.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +TOOLS=../../build/tools + +GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_full_solver.prototxt + +#reduce learning rate by factor of 10 +GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_full_solver_lr1.prototxt cifar10_full_iter_60000.solverstate + +#reduce learning rate by factor of 10 +GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_full_solver_lr2.prototxt cifar10_full_iter_65000.solverstate diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh new file mode 100755 index 00000000000..1d954b5935e --- /dev/null +++ b/examples/cifar10/train_quick.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +TOOLS=../../build/tools + +GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_quick_solver.prototxt + +#reduce learning rate by fctor of 10 after 8 epochs +GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_quick_solver_lr1.prototxt cifar10_quick_iter_4000.solverstate diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb new file mode 100644 index 00000000000..881f44b443b --- /dev/null +++ b/examples/filter_visualization.ipynb @@ -0,0 +1,618 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we visualize filters and outputs using the network architecture proposed by Krizhevsky et al. for ImageNet and implemented in `caffe`.\n", + "\n", + "(This page follows DeCAF visualizations originally by Yangqing Jia.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, import required modules and set plotting parameters" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "# Make sure that caffe is on the python path:\n", + "caffe_root = '../' # this file is expected to be in {caffe_root}/examples\n", + "import sys\n", + "sys.path.insert(0, caffe_root + 'python')\n", + "\n", + "import caffe\n", + "import caffe.imagenet\n", + "\n", + "plt.rcParams['figure.figsize'] = (10, 10)\n", + "plt.rcParams['image.interpolation'] = 'nearest'\n", + "plt.rcParams['image.cmap'] = 'gray'" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Follow [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the pretrained models, load the net and specify test phase and CPU mode." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "net = caffe.imagenet.ImageNetClassifier(caffe_root + 'examples/imagenet/imagenet_deploy.prototxt',\n", + " caffe_root + 'examples/imagenet/caffe_reference_imagenet_model')\n", + "net.caffenet.set_phase_test()\n", + "net.caffenet.set_mode_cpu()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run a classification pass" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "scores = net.predict(caffe_root + 'examples/images/lena.png')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The layer features and their shapes (10 is the batch size, corresponding to the the ten subcrops used by Krizhevsky et al.)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "[(k, v.data.shape) for k, v in net.caffenet.blobs.items()]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "[('data', (10, 3, 227, 227)),\n", + " ('conv1', (10, 96, 55, 55)),\n", + " ('pool1', (10, 96, 27, 27)),\n", + " ('norm1', (10, 96, 27, 27)),\n", + " ('conv2', (10, 256, 27, 27)),\n", + " ('pool2', (10, 256, 13, 13)),\n", + " ('norm2', (10, 256, 13, 13)),\n", + " ('conv3', (10, 384, 13, 13)),\n", + " ('conv4', (10, 384, 13, 13)),\n", + " ('conv5', (10, 256, 13, 13)),\n", + " ('pool5', (10, 256, 6, 6)),\n", + " ('fc6', (10, 4096, 1, 1)),\n", + " ('fc7', (10, 4096, 1, 1)),\n", + " ('fc8', (10, 1000, 1, 1)),\n", + " ('prob', (10, 1000, 1, 1))]" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The parameters and their shapes (each of these layers also has biases which are omitted here)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "[(k, v[0].data.shape) for k, v in net.caffenet.params.items()]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 5, + "text": [ + "[('conv1', (96, 3, 11, 11)),\n", + " ('conv2', (256, 48, 5, 5)),\n", + " ('conv3', (384, 256, 3, 3)),\n", + " ('conv4', (384, 192, 3, 3)),\n", + " ('conv5', (256, 192, 3, 3)),\n", + " ('fc6', (1, 1, 4096, 9216)),\n", + " ('fc7', (1, 1, 4096, 4096)),\n", + " ('fc8', (1, 1, 1000, 4096))]" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Helper functions for visualization" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# our network takes BGR images, so we need to switch color channels\n", + "def showimage(im):\n", + " if im.ndim == 3:\n", + " im = im[:, :, ::-1]\n", + " plt.imshow(im)\n", + " \n", + "# take an array of shape (n, height, width) or (n, height, width, channels)\n", + "# and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)\n", + "def vis_square(data, padsize=1, padval=0):\n", + " data -= data.min()\n", + " data /= data.max()\n", + " \n", + " # force the number of filters to be square\n", + " n = int(np.ceil(np.sqrt(data.shape[0])))\n", + " padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)\n", + " data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))\n", + " \n", + " # tile the filters into an image\n", + " data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))\n", + " data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])\n", + " \n", + " showimage(data)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The input image" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# index four is the center crop\n", + "image = net.caffenet.blobs['data'].data[4].copy()\n", + "image -= image.min()\n", + "image /= image.max()\n", + "showimage(image.transpose(1, 2, 0))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first layer filters, `conv1`" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# the parameters are a list of [weights, biases]\n", + "filters = net.caffenet.params['conv1'][0].data\n", + "vis_square(filters.transpose(0, 2, 3, 1))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nRK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first layer output, `conv1` (rectified responses of the filters above, first 36 only)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['conv1'].data[4, :36]\n", + "vis_square(feat, padval=1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The second layer filters, `conv2`\n", + "\n", + "There are 128 filters, each of which has dimension 5 x 5 x 48. We show only the first 48 filters, with each channel shown separately, so that each filter is a row." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "filters = net.caffenet.params['conv2'][0].data\n", + "vis_square(filters[:48].reshape(48**2, 5, 5))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nIqIb+upwfU7EnNLtAIqW6LIF1113XURErFy5cqB9WVKCPjkZZyGTfI6lAeuINU4nE0VjgYay6CJA\n6ygThZZ0ArQ5xmueZknv+B4hq30p/51IEmTlU2jnciyMwQ7NLphr2tGCyr7gMRo18+kkhowTXt96\n660D399xxx0H2mcJ3cbHx5s+gMeB5ozc3H///QOf22rG3ELT1ltvHX1YtmxZ853f/va3ERGx2267\nDbRx8WFbJhz+Dl+QJ3if+QhMTU018jss+auteRS3Zf49TjRz5o55RybLNco4oQGekrbA4wR8Tt/I\njR3ava623377gbGUewC8Y/xr166NiIgddthh4H0Ajxk/37/pppsiop0rgHzZgXxqaqoTuMFag054\njSx6XC4IjYbuAAhQav0REVdeeWUjg6b7wQcfjIh23bLG4LXXhdNd7LTTThHR8sX7TpkcknEwL06C\nzDOdWJU+PE4X8YU/yJn5uHHjxmb/d3ob86VMsBvRFitmzngGYH3BZwoz33jjjRERseeee3b6Ri4Y\nL+/b0uj0QrwyZx4nY4NWaGOuynQc8JS5gKY1a9ZERMQee+wx0Ld/05Fd5IbC2+6fMTHGVatWpeuf\nfXGm8mMzoVqkKioqKioqKirmiHmzSD3wwAOx9957R0TE+973voiI+Na3vhUR7ckUcArmVHv//fc3\nGgYaIchC6bNCqWha9MOzeEVbBmhFDz30UHP6tvZuWoDDfW3B4JRvDYZTva0pGzZsaPqErlWrVkVE\nN6zbPmD77bdfRET87Gc/i4iupoamhXYMzXfccUdEtFpBRDfZncPbPRfwHA0cywI8z4p5wl98Afba\na6+IaDVceFK22XbbbSMi4pWvfGVEtNoaYNwveclLIiLi0EMPjYiISy65JCIifv3rXw+0p38nSR0Z\nGen446FxMo/QmYX9k5COfvbdd9+IiMb6evvttw+0L62xaHH0TZJYYJ8IeA/PswKiWHb4PnPghI9T\nU1MdqyUyaL4gg/vss09ERLzmNa+JiIj/+q//6qWdcWKJRHavvfbaiBhMkskaYt1i3dh5550jIk/f\ngJy4LIct3ryPfEErVqZy3bEusLC/4hWviIiIK664IiK61i60ZfYVvofFzRZv7z/Im+cmop1nngEN\nzMF222030J41iMzZtw5LFkBOnv/850dExMtf/vJmfmwFQO5vueWWiGgtL/SBvAMXFGfc/H7YglWm\n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\noqKioqKiYo6YN4tUmRmcUyCnXWfw5US5YsWKiHjmZJnleXA+GPq29Qug1VvzBD6RoomvX7++sRRk\nJT9cANe5fKw1Qgsnb5dAsAaz+eabN+OxZcraS2aByIrXctr3qd95U8r3XCIkO80zDqxEAM3z1ltv\nHXjfuZ1crqK0BNm3ie+gMTEeo8wKHdHNWA3s54JcLV++PM0mj/aPVQfrEFYzwHpwpm/GaxnFQvHY\nY4+l1gmApSrLk2TrGGuNdjfffHNEtJqbLRj33Xdf8x6WZeTYFkZkE2sIMgzPSx/I8llo/ba+lhYs\n+8Ix31n5HWv7nl+vUVuJXAGhXHfInC2M0Oi9yFaQrJQScK43MD093ZlPLChY/e68886IaPlUWlYj\nutnj2ZucdR24nMno6GjHugcYP33ax8cWSdYN7W+//faIyLNvsyZHR0ebcfUVz41o93PGhdwzN7bU\n7L///hHR8hFavP5KWjILm2kp/S3L8bkMjceJfDHWvuoWe+yxx8B70M13LUPe983rrJA8a9g55Up5\ncX456EUu+ip4RLQ+kYzbmdwBc9dXLNptGT9t2bvMy2GoFqmKioqKioqKijli3ixSm2++eXOqtQ+M\nT6ScXO+5556IeOb0y4nZp3ROqS4YygnZ969Zvacsc2tZUNg1nbJTemb18WmXk7a13Cyz85NPPtmp\nsZYVI0abc/2mbLy0QwvglM9rSYstUs4Sm/lTMFeOgPP8ozXAPxfCLLUpPsOfwlEm5iHjwRrkiDrz\n0bX2wMTERMfy4uzBaL/24wO2xKCh8X0/k7GsXLmyE21ii4ELhKLloS27Jh3rBKsRcwCf+jKI4z/H\nuKDbfUMjssU6cr0uj5N+Xe+xHGtWzLxPViK6ma1Ni+HIQct6KS+ev6z4LmActuRl1QccWQTt9qWK\naP3KHKWX7XPsn2jm9nfymsZqVEbiZfsioK1rlnqfxAqKFQX+IVee09Iq4kz+XkPIPzz3nmXaoRU+\n8sre7d+XpUuXduYdntMX6MuOX9Ls3wv7Flp2S0sYvCM6j9+NzP+Kv22ZyQpFuyh4Vuw8ol0XtHFl\nC8+nrb+2uGVzCkoaskzl3I7gS5ZVH8lQLVIVFRUVFRUVFXPEvFmkFi5c2Jz+0ExcSRtgqShfs9pZ\n1s6yGkvAGizt0chMC/1PTU11NKjMquPq1lmtNecA8im/D9ak4ZH79p23eW1NCiuhtWqsAaXm7Qra\n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\niTvvvDPOOeecuOyyy+Iv//Iv48Ybb4wbb7wx7r777vjHf/zHuPvuu+OJJ56I3/qt34p77713sIDW\n/v37eyfGoRocyBExOnnOzs72rDrgE6WtHZ/yOdVyksYayKgkWuvC/bJl7boYfr9q2fne1BJZ7Z7F\nxcVe9kiWbcLnzpDK6ArsechoYIaQFeb095bNBJnGpDozrZzozNadf+uMKsbKdVCA6xS1GSSZR873\nor8uPOcsR9dy8fxp74c87RppwVyyF9i1jYAzRSeFUu7ataune9cuA4yBvWNZnST6wrzgPkNFcz0G\nHv8sg5Df8T3rw2PkdWEanzbLLys4mq1n95+9yfcEjBFj29a+yvbWrKaT23ZmmQubeh1Z9v3793dt\nZGsO2PtnWfD+IGtGig4YA2cutt9ln5uc2x485qD324z25/nnn+8VkkRXWV045g16yfZo5qYzKe35\nbuG9xW9iDM8PE1EDk8I7u7u93pRQkwqP0n/Ww6R90Zm5YGZmJt2jTfGEbC9JHakjjzwyzjzzzIh4\nwQ33qle9Kp544on44he/GO94xzsiIuId73hH/NM//VNERHzhC1+It771rTE7OxvHH398vOIVr+g4\niAqFQqFQKBT+/4YXHSP18MMPx7e+9a143eteF08//XRXOfyII47o6uM8+eST8frXv777zdatW7sq\n3cbatWt7Fib/9+nYsTQLCwspkSmnW96NU1uFOlGZNWhrkZO1ZWnpGmz5ZDVKXIMjq5fj98+O87Cn\nZseOHT1rhdO4rTGsAF7Dog+svawSNid1/qLfVu++ty1LW6DIknls7AWgfcYmI7Fsv7MllXkwHQPk\nelPZ+EPjwDzZsmVLj2aBd/605UrEWS0WrKFJljd45plnesTW9oYw99A93zP+Q9Z7xPiai+h7BcDj\njz/e8yzYYnabXO+2s/gNZCd+cahqMm23RKXt5x5/e1oZE9eIA8T9OD7S92mvsecsi08jxoX1z5gi\nQ0adZC/a6tWre3J7TvGbLGaG+c1853rG1B4JYlF5Lhx88MFp5WnqxnksaNufZ4TDQ8wG7pOJa90G\nNftM0sw+Z53TF8ekIrvXdBvPa0+U1wVtueaXK38D9iqev8wXe3pauKp+RsuU/T/z7MII4jp2zItW\nLzA2UE2e75B7ktfQzxfPRfTseTE/P9/bt6CGQsf28r7YOlIv6iC1c+fOePOb3xy33nprj6l5amrq\n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\nubnB+vXrB2vXrh0899xzSyL3iwnjxuCyyy4bXHvttb1rawz2PJ544onBvffeOxgMBoPNmzcPjjvu\nuMEDDzxQ62AvIhuDWgd7DnvVI3XPPffEunXrYs2aNTE9PR1vectb4itf+creFOGXGgPlFfzDP/xD\nvP3tb4+IiLe//e3x93//90sh1osWr33ta+OlL33pyGeZzr/yla/EW9/61pieno41a9bEunXr4p57\n7tnrMr/YMG4MIsbXg6kx2PM49NBD4/TTT4+IXZX4TzjhhNi4cWOtg72IbAwiah3sKezVg9TGjRtH\nytCvXr26qtruJUxMTMQb3vCGOPPMM+PWW2+NiF30GJARH3LIIR1dSOGFQ6bzxx9/PFavXt1dV2vj\nhcWNN94Yp512Wpx33nnda6UagxcWjzzySNx7773x6le/utbBEoExeM1rXhMRtQ72FPbqQaoqmi8d\n7r777rj33nvjzjvvjJtuuim+8Y1vjPx9YmKixmcvYyGd13i8MLjgggti/fr1cd9998Vhhx0WH/jA\nB9Jrawz2DGZmZuKNb3xjXH/99R2fHah1sHcwMzMTb3rTm+L666+Pl7zkJbUO9iD26kHqiCOOGOG2\n2rBhw8jJt/DCAYLogw46KH7/938/7rnnnjjkkEPiySefjIhdxKGQoxZeOGQ699r46U9/GkccccSS\nyPhix8EHH9w9vN/1rnd1ry1qDF4Y7NixI974xjfG2972tvi93/u9iKh1sLfBGPzhH/5hNwa1DvYc\n9upB6swzz4yHHnooHnnkkZibm4s77rgjzj333L0pwi8ltm7dGps3b46IXSzwd911V5xyyilx7rnn\nxu233x4REbfffnu3wAovHDKdn3vuufGlL30p5ubmYv369fHQQw912ZWFPYsnnnii+/+Xv/zlLqOv\nxmDPYzAYxHnnnRcnnnhiXHTRRd3ntQ72HrIxqHWwB7G3o9u/+tWvDo477rjB2rVrB5/4xCf29u1/\nKfGTn/xkcNpppw1OO+20wUknndTp/Zlnnhm8/vWvHxx77LGDs88+e7Bp06YllvTFhbe85S2Dww47\nbDA9PT1YvXr14K//+q93q/Mrr7xysHbt2sGrXvWqwde+9rUllPzFA4/BbbfdNnjb2942OOWUUwan\nnnrq4Hd/93cHTz75ZHd9jcGexTe+8Y3BxMTE4LTTThucfvrpg9NPP31w55131jrYixg3Bl/96ldr\nHexBFEVMoVAoFAqFwiJ6dsjvAAAAYElEQVRRlc0LhUKhUCgUFok6SBUKhUKhUCgsEnWQKhQKhUKh\nUFgk6iBVKBQKhUKhsEjUQapQKBQKhUJhkaiDVKFQKBQKhcIiUQepQqFQKBQKhUWiDlKFQqFQKBQK\ni8T/A2aklexSCttuAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The second layer output, `conv2` (rectified, only the first 36 of 256 channels)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['conv2'].data[4, :36]\n", + "vis_square(feat, padval=1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAJNCAYAAAARaCA+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XnMXFd9//Gvm4Ts3h473u3Hu2MbJzhOYiAQQkgoIGhQ\nUSgglRZUVW3Vqq0qUdEioKgi/adUP9HSLQIKFYRCKZsIIYGEJuCExDiO4zXe93iLs7Kl/P5APnzO\nN8+9OXPm3Jk7z/N+/XXGM8/MnTt37lyf73LG/eIXv/iFAQAAoCO/1u8NAAAAGERcRAEAAGTgIgoA\nACADF1EAAAAZuIgCAADIwEUUAABAhuIXUbfffrstW7bMFi9ebH/3d39X+ukBAABaYVzJPlHPP/+8\nLV261O68806bNWuWXXnllfa5z33OLr300lIvAQAA0ApFZ6IeeOABW7RokQ0PD9s555xjv/Vbv2Vf\n+cpXSr4EAABAK5xd8skOHjxoc+bMCbdnz55t999/f/SYcePGlXxJAACAxlx77bV29913j3hf0Yuo\nTi+Qxo8fb+eee66dd955ZmZ27NixcN+Pf/zjjl//rLPOim6fc845XT2fN2PGjDB+/vnnw/jZZ5+N\nHvf00093/Vop/P5+05veFMZf+9rXwvjiiy8OY7+tv/Zrv5qMPPM5mNW/B/0b7//+7/9qtrg3zj77\nV4e131bdZ+eee+4L/vbHP/6xnXfeefbkk08mvdbEiRPD+NSpUyO+jpnZ9OnTw/jEiRNh/LOf/Szp\ndcaCKVOmhPFTTz0V3Xf++eeHsX6Xn3vuuTCuO//MnTs3jC+55JLoPj1mjx49GsbHjx+PHqfnl9mz\nZ4fxwoULo8fp903PaRs3bowep8dBqmnTpo34OmZmjz32WNJz6L54yUte0vHf+wyQbv9j7N/HqlWr\nwli/U5s3b+7qdUrR7/wTTzzR1d+bmS1ZsiSM9+zZE8aPP/54GPt9rp+bHr967jOLz3F67ve/lRdd\ndNGIz62/c2bx74L/LRmNPvjBD5qZ2Yc//OHKxxS9iJo1a5bt378/3N6/f390svGeffbZ6IP4+c9/\n3tXr+w/c3+6Wbp9ecPTrh9B/sQ4cODDi4+ouiPQLmHrxp6+rP3xm8QlRTwLPPPNM5XOUVncc6UWV\nHh/6Nz/96U+T/t7M7A1veEPSNp08eTKMR8uFk16M6GftXXjhhWHsjwO1evXqMPbf3bvuuitnEwP9\n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\nf158+OGHw1jPuT6softdO1Xr8ebp3/iKw9Tzhj6Hno/9uSGnC31pM2fODGPt4G0Wd66vUrfP+0W3\nQX8TPD12Bq1DfkrqETNRAAAAGbiIAgAAyMBFFAAAQIa+5ESdiYH7rqSaj1SX45LTzVzj7P65Naep\nRGdZ7Y6+cOHCMPbdbbWDrOYS1MVhNb5//PjxrO3LoZ1m9XU1F8GsegV7T1c11xyG1G7ybciB6iXf\nSVf3sx4TPv+jl8dIk9auXRvGjz76aB+3JJ//bDTnSPMedeUGs7zzkH6/NCfF27x5cxj7vJa6v1Oa\nL6nng6effrrybzR3z3e71ryZus78+rr6fv25oV85Ufqd1dxE3VazODd4kDr96++Uz3XSvC/9nDSn\n12x0nMeZiQIAAMjARRQAAECGvi5A7KfyNESh0351pbJ1dEpxaGgo6XU1rOZLUf1UZBVtPaDTuBra\nM4untOumcQ8dOhTGGvLsF5261alasziUqY/zYTp971r6PWvWrOhxGzdu7G5jR4nUMGkqH1K4+eab\nw/iOO+4I46rFdJvmQ0vr1q3ry3Y0ScNlOtbFUXMNDw+HsQ9n7dy5c8S/8S1nUmmoP3XhWC2Pv/TS\nS6P7UhfX1tfSc7NfDLtJmopQ97ui+3z69OnR4wYphKfqfiu1RZG2sPALEBPOAwAAGKO4iAIAAMjQ\n13BeHc38Tw2jeRo+0+fz1X3avVmnF31IQUNSqZ1Xt2/fHsbaHdgsnu7VzstebpVgL/jQg07XavWh\n70Kst48ePRrGGg40i7s6r1+/vruNHeP++I//OIy3bt0a3fev//qvHT+fhqpzw8wrVqwIYw0JjOUw\nru5XM7MJEyaEcV2IXKvBNAXAd/Bukq8iraLn471790b3pYbzlO96rpoM72laQl3aSdWqGL2k+8iH\n0VLDalpFqvt1tFQB52AmCgAAIAMXUQAAABn6Es47M23vK7s0oz9noUJf9aDPrxUQvhqiqimcnwae\nPHlyGKcu4KqhSD/9rmG6EiE7XyHRC/4z1H2b0+Su7j3o5zvIC+g2adq0adHt97znPWH80Y9+tOhr\npYYltFLsM5/5THTfZz/72TD+l3/5l6Tn0xDvaOS/U3re0apKDdmZmT322GNhnFtp16261AtNj9Bw\nXm7lpYbI9Lyhi6A3LbVyvA2LIOtx5M+zfjH7M3wVb1014qDSSlENV6ZiJgoAACADF1EAAAAZuIgC\n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\nbIqGK/20d7/y3XRfDFqYOIeW9uoUu+92f/z48TAepEWV+xUK0jB90+G80dL9XRf11XNQapf9ttDv\nh4b2Fi9eHD1O24PkvCc9xsx+mR7TVnXtHOra7ejvVOnzse6vNixsT/96AACADFxEAQAAZOhLOG/8\n+PFm1r9wnlaXmaUvjqvT03WhMw3vaaXdtm3bkl7Hhwd1ql+rIHxn8247pafS6dlehu/qQnZjIYSn\ntLO2Tm/v3LmzH5sz0PT7tmLFijD2LVo2b94cxiWONw3r6Pdaw2P+tbR60FdoVYWF/HmhdFhNz2sa\n/tGFYs3iii09f/pzqYZoenVO8/S85hfk1qo0rTyrc6YJtdkLV7jYt29fxhb2365du8LYpxHoMVz6\n3NyGEJ5iJgoAACADF1EAAAAZuIgCAADI0JecKF+a3+vX9CWrmnOkZa6af2AW5y1oTorP7dKV6qdM\nmRLGqTlRWvrsn1/j6b5LrN/eTmmOhV8de/r06SM+rm7V9hI0D+1MLp3ZC0tvtXO6zykZJLqfNR9E\n20p0QvM3NC9j/fr1Wc9X2tDQUBhraxCfp6jtBqpKq/33JrVtQFWnal+KPnfu3DBOzYWpo2Xg+p58\nHpDmgOi5QPeXmdmSJUvCWI8Xn9Pz+OOPZ27xyHT/6edZ197lmmuuCWOfM6PnyX4tYq/ncH8c6coV\nes7dtGlT5fPp5zbI5yelv0Vn2hadob8R+ls5Wt67YiYKAAAgAxdRAAAAGbIWIO7qBWsW8gMAAGiT\nuusWZqIAAAAycBEFAACQoS/Veb7TLsrQqpEdO3aEcRv398yZM8P47W9/exivXbs2etznP//5MP7y\nl7/c/Ia9iJUrV0a3tSJHp3t9BWqTIWz9fJsOlXe70LOvoNMq0LrFTqvo+607zq+99tow9lVjjz32\nWMev2yRffXj55ZeH8YkTJ8K4bpFm3ReTJk2K7tMKZK2cqrNmzZow/uEPfxjdpxXI+rq+Yksr1LS7\nuq9u7uXxrHQ/1S2uW7Vaha+g1W3XSmr/nrTKTbvkL1u2LIw/+9nPRn+Tc07v134tTc8h/n1oxWuJ\nFVFS9hMzUQAAABm4iAIAAMjARRQAAECGvuREoRm+w3KbHTp0KIw/9rGPhbF2KDczu/3228P43e9+\ndxjfdNNNDW5dNd+VWDs0q17mHGjX5NQu3bm6XZE9d/vmzZsXxnv37u347zU/wncEbxvf1Vm7t6fu\n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\nAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The third layer output, `conv3` (rectified, all 384 channels)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['conv3'].data[4]\n", + "vis_square(feat, padval=0.5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAJOCAYAAAB8y+mTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWuwnmV1///dBrRqa1urBJogiSQkBJJQDYgHFFpCY0et\n+gKVWrWVjtPqqFhHGR11V21/odapWqpt1Y7UOh7qjMd2LIIcgzGcAiThEA5StYBaa2s9FIr8X/j/\n7DvPN3vt67oPz/NsYH3e7Nl7P899X+f7Xt9rrXXN3HffffcpSZIkSZIkac1Dpl2AJEmSJEmS+yv5\nIpUkSZIkSdKRfJFKkiRJkiTpSL5IJUmSJEmSdCRfpJIkSZIkSTqSL1JJkiRJkiQdGcuL1Je+9CWt\nXbtWq1ev1llnnTWOWyRJkiRJkkydmaHzSN17771as2aNzjvvPC1btkzHHnusPv7xj+vII48c8jZJ\nkiRJkiRTZ3BFaseOHVq1apVWrFihAw88UC984Qv1uc99bujbJEmSJEmSTJ3BX6S+9a1v6dBDD537\nffny5frWt7419G2SJEmSJEmmzgFDX3BmZmaQzyRJkiRJkiwGDjvsMH3961+f93+Dv0gtW7ZM3/jG\nN+Z+/8Y3vqHly5cPfZsqZmdnR352ZcmSJZKkhz3sYZKkH/3oR2O9X4kNGzZIkp7//OdP5H4wdP0e\n8pCfCaK//Mu/LEn6j//4D0nSox71KEnS6173unnvd/DBB0uSDjzwQEk/88uTpF/4hV+QJK1cuVKS\n9PCHP1ySdP7550uS/vu//3vecqCgvvzlLx+538///M9Lkn7lV35FkoQ74b//+7+P/M79Ix796EdL\nkv73f/9X0s/miCSddtppkqSPfOQjkqT/+7//kyR985vfHPn+z/3cz0mSfvKTnyx4nxKTGp/TvN/2\n7dsl/SzgRZJWrFghqRlrzN1f/dVfHfn9F3/xF0euddddd839vOeee+bm3FVXXTV3L0l6+9vfLkn6\n6U9/Om+ZHvnIR0qSfvjDHy5Ydsp5zz33SNKciv+YxzxGkvSqV71KkvSP//iPI/W56aabFrxuV6Y9\nVjC2WQuY83v37tUBBxww197MmRIHHXSQpGYOnnHGGSP3GzdDtydrCj+BteWkk04a9H4l+tbvl37p\nlyQ18/Huu+8e5H7Mk2h+1vKMZzxDF110UXyfXlefh02bNmnv3r36+te/rrvvvluf/OQn9ZznPGfo\n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\nTfqmSEU1ak+kU4UNZals1t+nP/1pSdJee713f0zW4zvvvCNJevvttyUVe+zFbMBuZ0kaY4wxexpW\npIwxxhhjajJQWXu94sMf/rAkadq0aZKkN998U1L9ek+tVmvC39et/wR//etfK73e9aL2DDZt2jS2\nz6LpP+6PwcF9MVi4P97DipQxA8bmzZv7fQpmJ9wfg4P7YrBwf7xH3xSpE088USeffHJPjjUyMtKT\n4+yux3vooYd61hfGGGPMnoQVKWOMMcaYmrTafUifO+mkk/Twww/3+rDGGGOMMZU58cQT9ac//WnC\nv/XlRsoYY4wxZk/Aj/aMMcYYY2riGyljjDHGmJr0/EZq9erVOvTQQzV79mxdc801vT68kTQ0NKSF\nCxdq8eLFOvLIIyW9t//eqaeeqjlz5mjZsmUd18AyE/P1r39d06ZN04IFC8Z+N1nbX3XVVZo9e7YO\nPfRQ3Xvvvf045T2aifpjZGREM2bM0OLFi7V48WKtWrVq7G/uj+6yZcsWnXzyyZo/f74OO+ww3Xjj\njZI8R/pBqi88Pyag3UPeeeed9syZM9ubNm1q79ixoz08PNxev359L0/BtNvtoaGh9uuvvz7ud9/5\nznfa11xzTbvdbrevvvrq9ne/+91+nNoezyOPPNJ+7rnn2ocddtjY71Jtv27duvbw8HB7x44d7U2b\nNrVnzpzZfvfdd/ty3nsqE/XHyMhI+7rrrtvlte6P7rNt27b2mjVr2u12u/3GG2+058yZ016/fr3n\nSB9I9YXnx670VJEaHR3VrFmzNDQ0pClTpujss8/W3Xff3ctTMP9PO+QY/P73v9f5558vSTr//PN1\n11139eO09nhOOOEE7bPPPuN+l2r7u+++W+ecc46mTJmioaEhzZo1S6Ojoz0/5z2ZifpDmngvUPdH\n99l///21aNEiSdLUqVM1d+5cbd261XOkD6T6QvL8iPT0Rmrr1q068MADx/4/Y8YMb5TbB1qtlpYu\nXaolS5bo5z//uSTptddeG9syZ9q0aXrttdf6eYrvK1Jt/8orr2jGjBljr/N86R033XSThoeHtWLF\nirHHSO6P3rJ582atWbNGRx11lOdIn6Evjj76aEmeH5Ge3kil9qQzveXxxx/XmjVrtGrVKv34xz/W\no48+Ou7vrVbLfdUncm3vfuk+F110kTZt2qS1a9dq+vTpuvTSS5OvdX90h+3bt2v58uW64YYbtPfe\ne4/7m+dIb9m+fbvOPPNM3XDDDZo6darnxwT09EbqgAMO0JYtW8b+v2XLlnF3sKY3TJ8+XZK07777\n6owzztDo6KimTZumV199VZK0bds27bfffv08xfcVqbaP8+Xll1/WAQcc0JdzfD+x3377jX1ZX3DB\nBWOPJ9wfveHtt9/W8uXLdd555+n000+X5DnSL+iLc889d6wvPD92pac3UkuWLNHGjRu1efNm7dix\nQ3fccYdOO+20Xp7C+5633npLb7zxhiTpzTff1L333qsFCxbotNNO06233ipJuvXWW8cmjek+qbY/\n7bTT9Jvf/EY7duzQpk2btHHjxrEsS9M9tm3bNvbvO++8cyyjz/3RfdrttlasWKF58+bp29/+9tjv\nPUd6T6ovPD8moNfu9nvuuac9Z86c9syZM9srV67s9eHf97z00kvt4eHh9vDwcHv+/PljffD666+3\nTznllPbs2bPbp556avs///lPn890z+Tss89uT58+vT1lypT2jBkz2rfccsukbX/llVe2Z86c2T7k\nkEPaq1ev7uOZ75nE/rj55pvb5513XnvBggXthQsXtr/4xS+2X3311bHXuz+6y6OPPtputVrt4eHh\n9qJFi9qLFi1qr1q1ynOkD0zUF/fcc4/nxwR4ixhjjDHGmJq4srkxxhhjTE18I2WMMcYYUxPfSBlj\njDHG1MQ3UsYYY4wxNfGNlDHGGGNMTXwjZYwxxhhTE99IGWOMMcbUxDdSxhhjjDE1+T+JeyU0JDHU\nvwAAAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The fourth layer output, `conv4` (rectified, all 384 channels)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['conv4'].data[4]\n", + "vis_square(feat, padval=0.5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAJOCAYAAAB8y+mTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXmwpVV1/v+0DBpNNGpkELS7kR6gaeZJaIFmUhQtrKJU\niCgiwapYRkksoybRmzLGRo2axNJoBRU1BimjgBKJIDMCzdA0U6dptSUOSBxijEMkoL8//H767fPc\nu+7e73Duufhbn39O3XvOed/97r32Pu963rXWXvCrX/3qV0qSJEmSJEla86hJNyBJkiRJkuSRSt5I\nJUmSJEmSdCRvpJIkSZIkSTqSN1JJkiRJkiQdyRupJEmSJEmSjuSNVJIkSZIkSUfGciN16aWXavny\n5VqyZInOOeeccZwiSZIkSZJk4iwYuo7Uww8/rGXLlunyyy/XLrvsooMOOkj//M//rD322GPI0yRJ\nkiRJkkycwRWptWvXavfdd9eiRYu03Xbb6SUveYkuuuiioU+TJEmSJEkycQa/kfr2t7+tpz3taVv+\n3nXXXfXtb3976NMkSZIkSZJMnG2HPuCCBQsG+UySJEmSJMl8YOHChfrGN74x43uD30jtsssu+uY3\nv7nl729+85vaddddZ/zsdtttJ0n6v//7v5H/c6PVN3xrampq5DWC8z360Y+WJD3ucY+TJP3u7/6u\nJOkXv/iFJOlb3/rWjN9/whOeIEk6++yzJUmf/OQnJUmvetWrJEnXX3+9pOY6Oe4222wjSfre974n\nSdq4caMk6X/+538kSQ899JAk6b/+679Gzvf85z9fknTAAQdIkj71qU+NXMd3v/tdSdJ///d/S5J+\n67d+S5L05Cc/WZL0wx/+UJL0s5/9bOS4u+yyy8jnfVxe8YpXSJL+8i//UlL/8XniE58oqbk+2vfY\nxz5WkvTKV75SkvSud71LkvTTn/5UkrTTTjtJavr94YcfHjnOj3/8Y0nSjjvuKEn6yU9+Ikn60Y9+\nNHJ+xmH33XeXJJ144omSpJtuukmS9JjHPEaS9B//8R8jx2F86F/aBXvttZekZnyYfCizv/zlLyVJ\nL3vZyyRJF154oSTpBz/4gSTp+9//vh772MduaddTn/pUSdLmzZslSbfffrtmgv7jOE7tfHDoZ/od\nOy3R9Xw77LCDJOlJT3qSJOnf//3fZ/0cdvra175WH/vYxyQpXPBK/M7v/I6kZg1gLjlc09vf/nZJ\n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\nTdPnPve5fp/eSJo6darmzJmjefPm6eijj5b0RjX5pUuXavr06Tr11FP1H//xHwO+yrcml1xyifbf\nf//RKvzSxG1/zTXXaNq0aTr88MO1du3aQVzyW5rx+mNkZEQHH3yw5s2bp3nz5mnNmjWjP3N/9Jbd\nu3dr8eLFmjlzpmbNmqUvfOELkjxHBkGqLzw/xqHVR/73f/+3deihh7Z27drVev3111vDw8Ot7du3\n9/MSTKvVmjp1auvHP/5x2//94R/+Yetzn/tcq9VqtT772c+2/viP/3gQl/aW59FHH21t2bKlNWvW\nrNH/S7X9s88+2xoeHm69/vrrrV27drUOPfTQ1v/93/8N5LrfqozXHyMjI63Pf/7zY37X/dF7Xnnl\nldbWrVtbrVar9dprr7WmT5/e2r59u+fIAEj1hefHWPqqSG3atEmHHXaYpk6dqilTpuijH/2oVq9e\n3c9LMP+fVsgx+Na3vqWLL75YknTxxRfrzjvvHMRlveVZuHDh6N6KkGr71atX6/zzz9eUKVM0depU\nHXbYYdq0aVPfr/mtzHj9IY2dH5L7ox8ccMABmjt3rqQ39l6dMWOGXnrpJc+RAZDqC8nzI9LXB6mX\nXnppdCNe6Y1NiOkY0z+Ghoa0ZMkSzZ8/X1/5ylckSa+++qr2339/SdL++++vV199dZCX+LYi1fYv\nv/zy6EbdkudLP/niF7+o4eFhrVixYvQ1kvujv7zwwgvaunWrjjnmGM+RAUNfLFiwQJLnR6SvD1Ls\n9WYGy8aNG7V161atWbNGX/rSl7Rhw4a2nw8NDbmvBkSu7d0vvefjH/+4du3ape985zs68MADddll\nlyV/1/3RG/bs2aNzzz1X1157rd75zne2/cxzpL/s2bNHy5cv17XXXqt9993X82Mc+vogddBBB2n3\n7t2j3+/evbvtCdb0hwMPPFCStN9++2nZsmXatGmT9t9/f/3whz+UJL3yyit6z3veM8hLfFuRavs4\nX1588UUddNBBA7nGtxPvec97Rj+sL7300tHXE+6P/vDTn/5U5557ri666KLR7b48RwYDfXHhhReO\n9oXnx1j6+iA1f/587dy5Uy+88IJef/113XrrrTr77LP7eQlve/7rv/5Lr732miTpP//zP7V27VrN\nnj1bZ599tm688UZJ0o033jhmv0LTO1Jtf/bZZ+uWW27R66+/rl27dmnnzp2jWZamd7zyyiuj/77j\njjtGM/rcH72n1WppxYoVOuKII/SpT31q9P89R/pPqi88P8ah3+72e++9tzV9+vTWoYce2rr66qv7\nffq3Pc8//3xreHi4NTw83Jo5c+ZoH/z4xz9unXLKKa1p06a1li5d2vrJT34y4Ct9a/LRj360deCB\nB7amTJnSOvjgg1s33HDDhG3/l3/5l61DDz209YEPfKB13333DfDK35rE/rj++utbF110UWv27Nmt\nOXPmtD70oQ+1fvjDH47+vvujt2zYsKE1NDTUGh4ebs2dO7c1d+7c1po1azxHBsB4fXHvvfd6foyD\nt4gxxhhjjGmIK5sbY4wxxjTED1LGGGOMMQ3xg5QxxhhjTEP8IGWMMcYY0xA/SBljjDHGNMQPUsYY\nY4wxDfGDlDHGGGNMQ/wgZYwxxhjTkP8HvQcADfhQYrQAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The fifth layer output, `conv5` (rectified, all 256 channels)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['conv5'].data[4]\n", + "vis_square(feat, padval=0.5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n2N3pAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The fifth layer after pooling, `pool5`" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['pool5'].data[4]\n", + "vis_square(feat, padval=1)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAJMCAYAAADaNPObAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtwHuV1+PHntSTrbsmy7pZs4YssSwbbxIADJMihgiEF\nSgkhIS3xkDSdTtppkmYGMmn/gHYSm8mkDbl0OpOhGU8y5TKZKXEIdaiD5XIzhhoDvl9ly7rf73e9\nvz/S+If9HJujZ/fdXUnfz0xn6pPn3T3a3ffVYXX2vLF4PB43AAAAmJEFYScAAAAwG1FEAQAAOKCI\nAgAAcEARBQAA4IAiCgAAwAFFFAAAgAPfi6hdu3aZqqoqs3r1avPkk0/6vXkAAIBIiPk5J2pqasqs\nWbPG7N692yxdutTccMMN5plnnjFr1671axcAAACRkOznxvbv329WrVplKioqjDHGfP7znze/+tWv\nLimiYrGYn7sEAABImNtuu83U19eL/5uvRVRTU5MpLy+/+O+ysjLz1ltv+bkLZ9INtwUL7L9m3nLL\nLVYsNzdXtY8XX3zROZewissP5/L444+bxx9/PBK5/EFxcbEVa2trCyWXKB2X+Z6LlMeSJUusWHd3\ntxWT3vfS9lasWHHJdvLy8szp06dVr43S+UlLS7Ni+fn5qpjkgw8+UK2bmpqyYn4fl6ysLCuWnp5u\nxdrb233NRdpHdXW1FTt27JgVGxwctGKpqalWbHx83DE7vahfu0HksmjRIivW19enzsPXIoq7TAAA\nYDarr6+/4p2ny/laRC1dutQ0NjZe/HdjY6MpKyvzcxcAAAAJU1tba2pray/++4knnrjiWl+LqE2b\nNpmTJ0+ahoYGU1paap577jnzzDPP+LkLX0m3D0+cOGHFampqgkjHkpSUZMWk28jSOulW8MjIyFX3\n9+GLRkP6s4hkenp6Rtv9sCD+dMcd1LlB+tOdRHs9Xv6nu56eHvWfvKJkbGzMijU1NaliWgsXLnRe\n5+XPVtKfxqSY36Rj+u6771qxqqoq1faC+NMdEsPXIio5Odn8+Mc/NnfeeaeZmpoyX/7yl3kybxaZ\naREFAMB85msRZYwxd911l7nrrrv83iwAAECkMLEcAADAAUUUAACAA9//nDcXHT582Ip1dXUlfL85\nOTmqdcPDwwnOxJjNmzer1knzWM6cOeN3Ooi4NWvWqNZduHDBig0NDfmdjm+kWVTQN0ZnZ2dbMemz\nVHrYo7S01IpJDd6dnZ2qXLSkB2g++clPql7b0dGR8Fyk2OTkpK/7ncv6+/s9vZ47UQAAAA4oogAA\nABxQRAEAADigiAIAAHAwrxvLk5PtH19qjA6L1FwpTVkfHR31db9FRUXOr43S8dOSjimCEUYTeUpK\nimrdxMSEFZMao+eKIL6BQEubi8TvbyB4+OGHrVheXp4VO3r0qBUL4vqeb03k0pc1Sw8YBIU7UQAA\nAA4oogAAABxQRAEAADigiAIAAHAwrxvL09PTrdjAwEAImciCmIoukRozm5ubrdj58+eDSAez0MmT\nJ61YEA3JGmlpaVZMO3Hb74c4oiSI86P9TJuamrJiTU1Nqtd6aUqXHjaSdHd3W7HXX3/divl9TKPy\nHgpTmE3kEu5EAQAAOKCIAgAAcEARBQAA4IAiCgAAwEEkGsulRsAgGuiWLFlixaLUWB6Wm266SbUu\niMby8vJyK9bY2Kh67Y033qhat3///hnl9FGkqdaDg4NWbC5PSo9yA+zNN99sxaQp/fv27bNihw4d\nSkhOLpKSkhK+j4ULF6rWaRvzvcjJybFifX19Vkw7kV4iTf+WmuELCgqs2MaNG63Y//zP/zjngtmB\nO1EAAAAOKKIAAAAcUEQBAAA4oIgCAABwEIsH3N0ai8XmdEMtAACYO65Wt3AnCgAAwAFFFAAAgAOK\nKAAAAAcUUQAAAA5CmVgei8UC36fUFCZNwO3v7/d1v/n5+Vaso6PDimmnXEukqcLSBOGamhorJk1g\nXrx4sRXr7e1V5SJJTU1VrRsdHbViYVwrxsjXyw033GDF3nnnHSsmTZL+2Mc+ZsWkSf3SxOS3337b\ninm5XryQjot0fqemplQxrcuPlbQt6VrJy8uzYtL5kSZfa6dwS8ckiOs2LS3Nio2MjFixwsJCKyZ9\nBvktrOMikXK5//77rdjp06etWGtrqxUbGxuzYtLng/StDsePH7di0nFJT0+3YtI0dumcT0xMWDFJ\n1M9RlHK5Eu5EAQAAOKCIAgAAcEARBQAA4IAiCgAAwEEoE8s1brrpJismNfMdPHhQtb2oN615yWXL\nli1WTGqolY7fr3/9aysmNQprm2y9iPo5Kisrs2JNTU2+7regoMCKtbe3W7FVq1ZZMe2xamlpsWJD\nQ0Oq12rP0ZIlS6yY9ADEwMCAFZMa5DMzMz9yjfbnlx72kHR2dqrWRf26DSIX6TND+6BIRkaGantS\ns7R0TQ0PD1sxqfl6+fLlVqy7u9uKSbw8xKE9R9XV1artSQ8JaB8ciPq1KzXSSw/fJDoXJpYDAAD4\njCIKAADAAUUUAACAA4ooAAAAB6FMLL9cVVWVFZMabC9cuBBEOnOWttlQ20QunaOlS5dasenpaSv2\n/vvvq/YxV1RWVqrW9fT0qNatXr3aip06dWpGOX0UaaK6RJr8L01Ul5qApXUnTpywYlKzsCvp55Ku\n0flGehhAasKXHgbo6upy3q/2veH39S01vvs99b+iosLX7Um8fBMAvONOFAAAgAOKKAAAAAcUUQAA\nAA4oogAAAByE0li+YcOGj1xz8uRJK3b8+PFEpBMJSUlJVkzbMLhnzx4rJjV9+02aqFtcXGzFWltb\nE56LltTcrOV306mkqKjI+bV+N95qJSfbHyN+N2prvlihpqZGta2zZ89aMT8b12erG2+80YpJ75f3\n3nvPiknfhiCRHiTQ8vv9p33QRtscfu7cOQ/Z2I4cOaJal56eropJU9ujLojp5F5xJwoAAMABRRQA\nAIADiigAAAAHFFEAAAAOQmks7+zs/Mg18206uaZx9kqkCcy9vb1WbGJiwnkfEqmRWZq43dTU5Ot+\nvdBOY5f09fU5v1aawi259dZbVev27dvnnIvfMjMzrVhjY6MVk67xRYsWqWL9/f2O2dm0TeRSU7WX\n60dqwJeE1UyrnZbf0NDg636lc6v5HeFVYWGhFWtra3PeXiwWs2JB/ByLFy9WrZuNjeWzAXeiAAAA\nHFBEAQAAOKCIAgAAcEARBQAA4CCUxvL51DSem5urWqed8Cw18V5zzTWq13Z3d6vWSVOzpYZLqWFc\n20Qu/Rxa5eXlqnVSc7MXeXl5Vkw6pjk5OVZMOr8bN260Yps3b1blIj04IFmzZo1qnfRtAF6mjksP\nO0gT+LUN48uWLfvINVKDbViTyKUmcumzICsry4r53bidkpJixaSHTM6cOWPFMjIyrJh0fWsb7gcG\nBlSxIOTn51sxadL36tWrVduTzpt2yrrU5N7e3q56bXNzs2qd9LPBO+5EAQAAOKCIAgAAcEARBQAA\n4IAiCgAAwEEs7mVUtssOYzFP07kBAACCcrW6hTtRAAAADiiiAAAAHFBEAQAAOKCIAgAAcBDKxPLL\nJ6eOjo4mfJ9SU5g0LVgiTfyVaKdIS7ksXbrUikmTyKWpzNLxe/vtt63YwoULrZg0FTc7O9uKaY9V\na2urap1EOi6xWMyKSdOwJV4mbmtzCYI2F2mStKSvr8/XXKRJyF7e09LPceutt17y7xdffNFaoz0/\n0vtAIk3hliZLS9P8o36teCEdA8lcOS7S5432s0X6doXz58875+K32fg5J03+l6bPS9s7ffq0cy5X\nwp0oAAAABxRRAAAADiiiAAAAHFBEAQAAOAilsTyIRnKNoaEhK5aUlGTFpMby5GT70EkNq1JzqqS5\nudmKSQ3ePT09Vkz6OSSdnZ2qdYODg1ZseHjYinlp3PYirP36TXtdaU1OTlox6Xr2cp1KtI3GUkOt\nRGp8/81vfvORr8vMzFRtX2pWlc6F1OAuPYjhRRAPA8CbqH/eSNfQyMiIFfPyHpdI7zepCV/a79jY\nmGof0nu1qKhI9Vrp8zARuBMFAADggCIKAADAAUUUAACAA4ooAAAAB6E0lkfZ1NSUFdNOIpdkZGQ4\nv/b48eOqdampqVZM27in5aWJUGpyhDETExOqmFZZWZlqnfQQg99Np1EhNeoPDAxYMak510uTv9Zs\nbBj3u7l+LmtsbHR+7bp166yY9B7v7u62YgcPHnTer0R6yEn6lg3J2bNnnfernToeVBO5hDtRAAAA\nDiiiAAAAHFBEAQAAOKCIAgAAcEBj+RygnVQtNc1LpCZC7ZTrIJrIpZ8tKytL9drZ2Mir1dTUpFon\nTaT3QjuJfNmyZb5u73LS5H6pYVyaQC1dy3P5WoExixYtUq3r7+9PcCbyQwzS55xEaiwP4kER6YGr\ntrY2KyY1h3sRZhO5hDtRAAAADiiiAAAAHFBEAQAAOKCIAgAAcEBjeYINDw8nfB/aSdXnzp1TrUtJ\nSbFiUnOgNPk5CNoG+fnG74Zxv+Xl5anWuTaWS7TN4VJTOvSkh1GgJz24Mzo6asV++9vfWjG/G7cl\nUqN6WJ//UcOdKAAAAAcUUQAAAA4oogAAABxQRAEAADiYk43lmZmZvm4vNTXViknNzUFMUpUm23Z1\ndaleu27dOtW6T3ziE6p1b775phVrb29XvVZLey7nynRp6VqLuoKCAivW0dFhxQ4ePGjFMjIyrFh+\nfr4V01y70nRyv6+LWCzm6/Zmo9zcXCs2G4+L1JAd1gMG0gNIra2tViyIJnLJ2NiYr9urqanxdXth\n4k4UAACAA4ooAAAABxRRAAAADpyKqMbGRrNlyxZTU1Nj1q1bZ374wx8aY37/bdJ1dXWmsrLS3HHH\nHeK3PAMAAMwFsbhDp1pra6tpbW01GzZsMIODg+ZjH/uYeeGFF8zPfvYzk5+fbx599FHz5JNPmp6e\nHrN9+/ZLdxiLhdYcBwAAMBNXq1uc7kQVFxebDRs2GGOMycrKMmvXrjVNTU1m586dZuvWrcYYY7Zu\n3WpeeOEFx5QBAACizelO1Ic1NDSY2267zRw6dMgsW7bM9PT0GGN+/yhmXl7exX9f3CF3ogAAwCxx\ntbrF05yowcFB85nPfMY89dRT1hdQxmKxK84Oefzxxy/+/7W1taa2ttZLGgAAAL6or6839fX1qrXO\nd6ImJibM3Xffbe666y7z9a9/3RhjTFVVlamvrzfFxcWmpaXFbNmyxRw7duzSHXInCgAAzBK+34mK\nx+Pmy1/+sqmurr5YQBljzL333mt27NhhHnvsMbNjxw5z3333XTGhoEkHIKwpu2HlsmrVKit28uTJ\nUHIpKiqyYtKE3iBykSYwX/5naGOM+du//VsrdujQISt2+vRpKyZNJNZOwm9pabFiQRyXtLQ0KzYy\nMhJKLpeT3kNf+9rXrJg0zX/fvn1WTHpvlJaWqrb3q1/9yoqtXLnSiknHbtGiRVZMIk2Mll773nvv\nWbGNGzdaMenc9vf3W7EjR46o8pOE9Tm3YIHd6iu9r2bj539FRYVqXUNDgxUrKSmxYs3Nzc65+M3v\n62Xz5s2qddPT01bsrbfeUu/HqYh6/fXXzS9+8Qtz3XXXXXyDbtu2zXzrW98yDz74oHn66adNRUWF\nef755102DwAAEHlORdStt94qVm/GGLN7925PCQEAAMwGTCwHAABwQBEFAADgwPOcqBnvcBY2rSUn\n23/1nJyc9DWXwsJCK9bR0eG8Dy+5zMZz5Dcpl5qaGismNWZKTbsSqZG+srLSih0/ftyKRem4RKWx\nvKyszIo1NTX5ul/pZ5VaGzIzM1WvHRoasmJSw/jChQutWHp6uhU7f/68FauqqrJiBQUFVkzy2muv\nqdZJonKtGEMuxsgPO5w6dSqUXCR+HxfpAQOpMT8/P9+KXd5Y7vvEcgAAgPmOIgoAAMABRRQAAIAD\niigAAAAHnr47D7NLUlJS2CnMatL05uXLl1uxlJQUKzY4OKjaR3d398wTgzFGnjwfRGO5RGo2Hx0d\n9TWXK83qu5w0KT3qtJO5pYcz/D7Oc4U0kX4uk94fZ86cUcVmgjtRAAAADiiiAAAAHFBEAQAAOKCI\nAgAAcBCJxnJpGu/4+HgImci8TCfXCmI6eXZ2dsL3MZd97nOfU63bt2+fFZMaYCWdnZ0zygn/39TU\nlGpdSUmJal1LS4sV0zZzS59p2obnIBqA3333XSumPX5BCOshGL+/nSJKgvgdExZper8kEQ9ZcCcK\nAADAAUUUAACAA4ooAAAABxRRAAAADiLRWA7MBmvWrFGt++Uvf6lal5qaasXGxsZmlBNmLohGYenc\nStPO4/G4FUtLS7Ni+fn5VkzbJNvT02PFhoaGVK/1mzRVvre314qdPn064blI3yyQmZlpxaT85hs+\nq66MO1EAAAAOKKIAAAAcUEQBAAA4oIgCAABwEInGcr+nk2dkZPi6vahbvHixap3UYBoEafqwNNFZ\nEqUJwh//+MdV6z75yU9asddee82KSY2ZUvOxVmlpqRWTphRPTEw47yPK2traVOu8TG7WfrZ0dXVZ\nMamJXGrYXbVqlWof2qneAwMDqnVB2LhxoxWTmtwbGxutmDRB3gvpfRClqe1eaD9ftbw0kUvXqfRe\n0NJ+44D07QLr16933u+VcCcKAADAAUUUAACAA4ooAAAABxRRAAAADmJxLx1eLjuMxTw1lQEAAATl\nanULd6IAAAAcUEQBAAA4oIgCAABwQBEFAADgIJSJ5UuWLLnk393d3b5uv6qqyoodPXrUitXW1lqx\nt99+24oNDw9bMWmSdlpamhUbHBy0YlKDmnZS9aJFi1Tr+vv7Veu85OK3qOeSlZVlxaRpy5df31ci\nTbXW5hKl4xJELtddd90l/37vvfesNcXFxVasr69Ptf3R0VHVOmnCuPTa/Px81fa010BhYaEVq6ys\ntGKvvvqqFZuN14p0/DIzM63YuXPnEp6L38hFnmIufROFlIv0zQzSuvb2dium/baGmTz8xp0oAAAA\nBxRRAAAADiiiAAAAHFBEAQAAOAilsfzyRnKpYVdqyNY6duyYal1RUZEV0zaeSU1wXnKejdLT01Xr\nRkZGEpxJMKQmci2pIVlqkGxubnbex1z2/vvvf+Sajo4OKzY9Pe1rHmNjY6p1XhrLpQcTNm7cqNqe\nF34/tDJXLFy40IpJn/9+X2uS5cuXWzHpwSfpvRAlU1NTzq+VPiOlh8mys7OtmLY2mAnuRAEAADig\niAIAAHBAEQUAAOCAIgoAAMBBKI3ll5vJdNDL5ebm+phJ9EWpqTOIRsrZSGoWlprIJStXrvQ7nchI\nSUlRrdM+3HG5KF2PXhpnJU1NTVbMS/Ow9I0LUiOuJIjPoM7OTlXMb1ITuTQNe8EC+/6D39ffihUr\nrJiUn9RYPpdJx0D6tpCgcCcKAADAAUUUAACAA4ooAAAABxRRAAAADiLRWC5NAZaaxzIyMqyYNGX3\n/Pnzqv1euHDBirk2tV7J+vXrfd1elGinN0M/iXzLli0JziQ8fr+3ouzUqVNWTPqskmLSgwlSzG/S\n+9nLQz9aUpO2JIgHB6QHlXp7e62YNLHci+uvv96KlZSUWLHDhw9bsahPJw/CiRMnrFhQDffciQIA\nAHBAEQUAAOCAIgoAAMABRRQAAICDSDSWSw3jkszMTF/329DQoFqXk5Njxfr6+nzNBZhLUlNTrZi2\ngXhkZMRpn0lJSVbM78nhc4XUGB3ERHBJVlaWFRscHAwhE9n4+HjC9yE1zUtT6rW/s+Yy6XwEcY6u\nhDtRAAAADiiiAAAAHFBEAQAAOKCIAgAAcBBKY/nljYRSw6k0Jba/v9/XPAoLC62YNFl61apVqu1J\nzebt7e0zTwxzTn5+vmrdmTNnVOuSk+23rt9TlL3we5p9ZWXlR66JehO5l88v6aGauTLd3u/PdS/C\n+rxevny5FUtPT7di0kMXx48fT0hO0OFOFAAAgAOKKAAAAAcUUQAAAA4oogAAABzE4vF4PNAdxmIm\n4F0CAAA4uVrdwp0oAAAABxRRAAAADiiiAAAAHFBEAQAAOAhlYnksFgt8n1JTWBh5GBNMLkuXLlWt\nu3DhQsJz0ZKOizS1d2Jiwop5mVZdU1NjxQ4dOmTFonRc5nsuUcnDGDmXJUuWWLFFixZZsdTUVCsm\nXcunTp1yzkU6LtJ+JV4mz0f9HEU9l4KCAtX2Ojo6Ep5LEKRcpEnuubm5Vmx8fNyKDQ0NWbHGxkbn\nXK6EO1EAAAAOKKIAAAAcUEQBAAA4oIgCAABwEMrE8jBEvYHO71yysrJU6wYGBhKei5b2uFRUVKi2\n19DQkPBcguAlF6mZWdLf35/wXPwUlTyMkXMpKipSvba9vd2KFRcXq17b2tqqykU6LtLnw+LFi62Y\ndF309fWp8vNyjrwcA79zKSkpUa1raWnxNZfs7GzV9qQG6unpaV9zkWjzk37HeMmlqqpKtb3R0VHV\nOun3xOW5MLEcAADAZxRRAAAADiiiAAAAHFBEAQAAOAhlYnmU5eXlqdZJk3ylBr+wSBNcpdhs1NXV\nZcW0TYRz2aZNm1TrBgcHrZi2sdxvGRkZqnXDw8O+7bO0tFS1rrm52XkfYR1PLemBg6SkpBAy0Tco\nB0H7QE4QkpPtX8/SOYrS750gnD59WrVO+60dy5Yt85IOd6IAAABcUEQBAAA4oIgCAABwQBEFAADg\nYF43lqekpFgxqbG8u7vbikWpmW/Lli2qdXv27ElwJv6TzpF07BcsSPx/DxQUFKjWdXR0JDgTYxYu\nXOj82mPHjvmYCSReHnTQTuH2QvvgiTTFXIp5+XYAifQe106+1srNzVWtkx5q0E5t15I+v7QPU2in\nk/vN7/Mhka61np4e1Wula1L6faJ90ORKuBMFAADggCIKAADAAUUUAACAA4ooAAAAB/O6sTwtLc2K\nSdOcpcZyREsQzZXSBOGwZGZmWrGWlhYr1tTUFEQ6zvycRK7lZRL5XNHZ2alaF8QE7yAalL3wu4lc\nIjWWx+NxKzZXvnUiLJOTk1ZM+p0/E9yJAgAAcEARBQAA4MBTETU1NWU2btxo7rnnHmPM7//sVVdX\nZyorK80dd9xhent7fUkSAAAgajwVUU899ZSprq42sVjMGGPM9u3bTV1dnTlx4oS5/fbbzfbt231J\nEgAAIGqcO2UvXLhgXnrpJfP3f//35p//+Z+NMcbs3LnT7N271xhjzNatW01tbW2kC6lPfepTViwj\nI8OKffDBB1bs0KFDqn0EMUlbanwvKSmxYuXl5QnPRUtq6pdMTU1ZMb+byLXnSJpmL5EavP0mTe3V\nTvL1W05OjmpdEA26UfGH/7D8MKlRWHpAQCI1xI6NjaleK32jQVFRkRU7cuSIFXv//fdV+9BO/46S\nIP5Skp2drVq3atUq1bq58m0D2gcW/P5Mk96DXV1dnrbp/Bv+G9/4hvne9753yS+gtra2i2/OoqIi\n09bW5ik5AACAqHIqol588UVTWFhoNm7cKFZ2xvz+v8Sk/xoDAACYC5z+nPfGG2+YnTt3mpdeesmM\njo6a/v5+8/DDD5uioiLT2tpqiouLTUtLiyksLPQ7XwAAgISpr6839fX1qrVOd6K++93vmsbGRnP2\n7Fnz7LPPmk996lPm5z//ubn33nvNjh07jDHG7Nixw9x3330umwcAAAhFbW2tefzxxy/+39XE4lf6\ne5zS3r17zfe//32zc+dO093dbR588EFz/vx5U1FRYZ5//nmr4TAWi13xT4AAAABRcrW6xXMR5Wcy\nAAAAUXK1uoWJ5QAAAA4oogAAABxQRAEAADhwnljuRRjzo6S/Z4Y1xyrquSQn25eFNDlcsnDhQiv2\n8Y9/3IpJ05bffPNNKxbEcZGmp4+MjKhykSbvbt68WbVfabL54cOHrZh0jtauXWvF+vv7rdjw8LAV\n8zKpWcpl8eLFViw/P1+1vaamJismHXtNHtJ06ImJCVUe0vVYUFBgxTo6OlS5ROn9PBtz0a7T9tdK\n65YtW2bFpGuourraih08eNCKbdiwwYpJn6XPPPOMFYvSOZI+04aGhlTbk14rfQatW7fOir333ntW\nLIjjkpKSYsXGx8fVr+dOFAAAgAOKKAAAAAcUUQAAAA4oogAAAByEMmwzDNomx4qKCiuWkZFhxU6f\nPm3FpOZUL7lIgmi4XL58uRU7f/68antezJWm2PLyciu2ZMkSKyY1PWsby6N+XLSN5VLDqmtjudTU\nKr13JVLDuNRYnp6ebsXOnTtnxbTnR9qeRHNMjJmd14oX2vMrXWdBHBfpoYvu7m5VLn5/1mtfG8Rx\nKSkpsWLNzc2+5nL5t6UYI7+PpN/blx8Xhm0CAAD4jCIKAADAAUUUAACAA4ooAAAAB6FMLI+yBQuo\nK6WmvyAay6OutLTUii1atMiKSU3KjY2NCckpqqSG6aSkJCvW2dmp2l5OTs5HrpGah7WTliVSI6m2\nkVlL2zAOmTQNOwjSZ4EkrPMrfS5J778gSL9TpW9r8Jv07RmJOB9UDAAAAA4oogAAABxQRAEAADig\niAIAAHAwrxvLU1NTrVh7e7sVk5oXp6enE5LTRwliwLyXfUjNfBJpmqxE2ww5NTWlWudFYWGhal1X\nV1eCM9H7q7/6K9W6l156yYpduHBB9dqysjLVukSfI+la0e5TahiX3veDg4MzTwyzmnaqvKS/v9/5\ntQF/mciMSQ3j0u/FsH5XSr/LE4E7UQAAAA4oogAAABxQRAEAADigiAIAAHAwrxvLJRMTE1YsrMa4\nsJw7d875tePj4z5mop8gH0RjudQwrp24Pd9ITbHaRnWpkbevr89zTn9w2223qdZJ74OGhgbf8kC4\n8vPzrZj0fl69erVqe6dOnbJifn8uaR+A8NLQLn1jhTRhfL79XrwS7kQBAAA4oIgCAABwQBEFAADg\ngCIKAADAwbxuLB8bGws7hUBpJ263tbU57yMWi6nWZWdnq9ZlZWVZMalpube3V7U9LxobGxO+D7+9\n+OKLVmzVqlVWLCUlxYppG0eTk+2PEe2kecnIyIjT67QTnqWfVSL9/NKxC0taWlrYKURSaWmpal1R\nUZEVkxoBr9PXAAAgAElEQVTLpevgE5/4hBW75ZZbrNjvfvc7VS6SnJwc59dKtO9J6cGLAwcOWLET\nJ06otrd06VIrtmTJEtVrvZB+XulbSlw/b/6AO1EAAAAOKKIAAAAcUEQBAAA4oIgCAABwEItruzH9\n2mEspm4ABQAACNPV6hbuRAEAADigiAIAAHBAEQUAAOCAIgoAAMBBKBPLNVOttZOvtU3q0jrtPqSJ\nzJOTk6rXanORJuBKOjo6rFh7e7sV6+npcc5FOi7SdOR169ap9vHOO+8455Kenm7FpGPv5Xxoc9Fe\nL36bK7ksX77ciknn99ixYwnNw29SLtdee60VO3XqlOq10vtK2l5XV5cV27lzpxWTPr8k0iT3NWvW\nWLHMzEwrduHCBSt27tw5Kxalc7Ro0SIrNjAw4LyPxYsXWzHpc7O5udmKScde2t7KlStVuezbt0+1\nTvs+WrhwoRWTvnVC2l53d7evuUjHdHR0VLUPrZk8/MadKAAAAAcUUQAAAA4oogAAABxQRAEAADgI\npbFcI0pTzf1uWpZIDeOS/v5+531IjYBaGRkZVmxkZET1WqkpcXx8XPVaqWFQasKUYhMTE6p9aFVV\nVVmxs2fPWrGxsTFf9zvf5OXlWTFtc6qGdK1IvFw/UoNyUlKSFZM+5/73f/9XFSsrK3PMztv7JScn\nx4pJjeV+0/68bW1tqnVemsgl2od5grB06VIrpj0uEunzure314rl5+dbsaKiIl9z8buJ3CvuRAEA\nADigiAIAAHBAEQUAAOCAIgoAAMBBZBvLo0TbkO2lUVFq0tNub3h42IpJU4VXr14988T+j9REfuTI\nESumbdr1wu+GcQRDmmCdmppqxaanpxOah3T9+H3dXnfddVbslVdeUb1W20AtNfFKSktLrZj0sEdf\nX58Vk6asv/fee6r9euHlIZggSA8/SLQPREgPL0nN3EePHrViCxbo7oX4/YDU1NSUr9ubrbgTBQAA\n4IAiCgAAwAFFFAAAgAOKKAAAAAc0lkeENIVVahgPi3Y6uXYS+Wx07NixhO9DarT28tqoT0+PSnNq\nEA8rDA0NWbHa2lrVa/ft22fF1q5d6zWlS0gN/VLOYZEa3/2eOq4VpfdVlCale5lEPltxJwoAAMAB\nRRQAAIADiigAAAAHFFEAAAAOaCxXCKJ5UWqalBQUFFixjo4OKyY1hEpT0QH47+TJk75uT3rwRKu1\ntdWK+d1IX1xc7Ov2wmoYl9x6662qda+99przPgoLC1Xr2tvbnfcBWSwW8/R67kQBAAA4oIgCAABw\nQBEFAADggCIKAADAQSiN5YsWLbrk3/39/dYabbNXPB63YitXrnRLzBizYIFdVyYn24fJ78nc6enp\nVkyaEr5+/XrV9t544w0r1tDQMOO8EkU6plG3cOFCK6a9DpYvX27FsrOzrdihQ4dmntj/idIUZa3J\nycmwU0iI5uZm1bq77rrLin384x+3YkeOHLFi//AP/zDzxHywZMkSK1ZUVBRCJsHo7OxUrcvPz3d+\nbWVlpWqd1HCv/TYJyKQaYia4EwUAAOCAIgoAAMABRRQAAIADiigAAAAHsbjXrqqZ7jAW89zIBQAA\nEISr1S3ciQIAAHBAEQUAAOCAIgoAAMABRRQAAICDSEwsl6awSlNxe3p6rNj09LRqn1JTmHYqut+k\nXG655RYrJk0d96K4uNiKtbS0WLGkpCQrpj3OmzdvtmJZWVmq2H/+539aMekcpaamWjEv07ql7Y2O\njlox6fi1tbU571crrGtXmqju5dsF/KQ9JuvWrVNtz8uk+LDOjzT1f2Jiwoo9/PDDqu39x3/8h2rd\nXPnMjVIuixcvtmK9vb2q7Uk/h7QP6TNX+t2rPS7S7wnpM0P6ObZs2WLFXnnlFedc/DaTh9+4EwUA\nAOCAIgoAAMABRRQAAIADiigAAAAHoTSWS81sl+vq6gogk+hobm72dXsLFy60Yjk5OarXahtHJadO\nnbJiUnNgZWWl8z6khw78Pn6SIJrIo0TzPo26Y8eOWbHJyckQMvGf3z+Hl/c9vNE2kUu0TdCDg4PO\n+5BMTU1ZMe3PcfDgQV9zCRN3ogAAABxQRAEAADigiAIAAHAQSk/UbCP14CxYYNef0sBHaTihpKGh\nwYplZmaqXjs0NGTFxsfHrdjIyIhqe14sXbpUte7111933ofUYyUNfpP+Zi+ZyWA1PxUVFVkxbU+B\ndE3Otz5CjbnS/+TFvn37wk5h1khJSbFiUq+Y9rPFb+np6ap1QXzWeyENzp6tuBMFAADggCIKAADA\nAUUUAACAA4ooAAAAB7F4wF21sVjMGgQpNUH7Tfst3nl5eap15eXlVmx4eNiKnThxQpWL1BgtrdOe\nLunnkEjNyF6+OTs3N9eKSYM/29vbrZj2HEnN61JTf2dn5xXz/ChR/9b3tLQ0K6bNb3R01Ndcwjgu\nUcnDmNmZi/SelHj5bPb7uKxfv96KScNUpc8CKZe7777biu3Zs8eKSZ/rXki5SIOQtQ8l+Z2LdI6y\nsrKsWGlpqRWTft95yUU7INrvY3V5LrFY7Iq/e7kTBQAA4IAiCgAAwAFFFAAAgAPnIqq3t9c88MAD\nZu3ataa6utq89dZbpru729TV1ZnKykpzxx13ePpSRQAAgChznlj+ta99zXz60582v/zlL83k5KQZ\nGhoy3/nOd0xdXZ159NFHzZNPPmm2b99utm/f7luyUiNbc3Oz8/a0TY5S87XfzfCLFy9W7Veru7vb\nigXR7BpE4ez3t5F7oT2mfj+/ITXPSg8naFVUVHjIJrpWrVplxS5cuGDFvDTbw3/S56H0XpPeB1qf\n/exnrZg03d3vxvIgaJvDvfDyu1dL+mYQaYJ8mJzuRPX19ZlXX33VfOlLXzLGGJOcnGxycnLMzp07\nzdatW40xxmzdutW88MIL/mUKAAAQIU5F1NmzZ01BQYF55JFHzPXXX2++8pWvmKGhIdPW1nbx+8CK\niopMW1ubr8kCAABEhdOf8yYnJ82BAwfMj3/8Y3PDDTeYr3/969af7WKx2BX/1PHhLwWVbtcBAACE\nob6+3tTX16vWOhVRZWVlpqyszNxwww3GGGMeeOABs23bNlNcXGxaW1tNcXGxaWlpMYWFhfJOk51b\nsQAAABKmtrbW1NbWXvz3E088ccW1TtVMcXGxKS8vNydOnDCVlZVm9+7dpqamxtTU1JgdO3aYxx57\nzOzYscPcd9994uunpqY+ch+ZmZlWTDtlV0tq9pUasiUDAwMJz0WyfPlyK3bu3DnVa6VmTYlU/H74\n7uEfLFu2zIpt3LhRtY/du3er1kn6+vqsmDQpXYrl5+c771cS8MD/q9K8r2ZCOn5zwVz5j7iUlBTn\n13p5MKakpMSK+X3t9fT0qGJeSMdv7dq1Vuy1115z3of2YQ+//yKzYsUKX7enfZgnPT1dtU76xg+J\nNIk8ao3lzp8mP/rRj8yf/dmfmfHxcbNy5Urzs5/9zExNTZkHH3zQPP3006aiosI8//zzfuYKAAAQ\nGc5F1Pr1683bb79txb3cYQAAAJgt6OoGAABwQBEFAADgIBYPuDM2FotFqhkXAADgSq5Wt3AnCgAA\nwAFFFAAAgAOKKAAAAAcUUQAAAA5CGd37hy8pvpr29nbn7VdUVFixs2fPWrGqqirVOi/TfSVSg9qV\nvmfQT9I02eHhYVUu0nTy8+fPW7ENGzZYMemLqFtaWqyYl+Oind48MTFhxdatW2fFPvjgA1UuWVlZ\nVkyarC9N4Jc0NjZasbCuF0lYuSxatOiSf0tT66N0TC7P1xhjNm3aZMWkSdUHDhywYtJEcOma7+zs\ntGJROi7Se0N6T2pJ0+elb1eI+nsoOzvbiv3ha9U+yp49e3zNRfqsevDBB61YR0eHFfvNb36j2q90\n3qTrIErn6Eq4EwUAAOCAIgoAAMABRRQAAIADiigAAAAHoTSWa3hpFG5oaFC99vjx41ZManycK0ZG\nRlTrpCby3NxcKyY1lodl5cqVqnXHjh2zYocOHXLe7+DgoGqdtrEcsry8PN+2JV3L2u2fOXNGtU5q\niJUacaUm6J6eHtU+ZqMlS5ZYsdbWVuftScfPb9K59PtbN6RG6+bmZis2OjpqxaQHhiTaz3/J888/\nb8Wkh5KipLi42Irl5+dbMS/XnzHciQIAAHBCEQUAAOCAIgoAAMABRRQAAICDUBrLL2+cjFLTrd/T\nybWWLl2qWtfU1JTgTLw5ePBgwveRk5OT8H34TZpEDr3S0lKn191yyy1WTGri9fv89Pf3WzEvDzDM\nFStWrLBiXht7/ZSWlmbFpMZtv5v/e3t7rVhYv4ukhvHbbrtN9dq9e/eq1mkfBAqC14cEuBMFAADg\ngCIKAADAAUUUAACAA4ooAAAAB5GdWC5NIvebNJm7ra3Nio2NjSU8F+nnDWIar0SaRC5NWw5Lamqq\nFevs7FTF5rKioiIrJl3Ps9H09LRv25LeV9pJ5Frahx/6+vp83W/URamJXCJ9Dgfxu0gS1kTwm266\nyYpJk9Lfeust531MTU05v1ZLutakBz68HmfuRAEAADigiAIAAHBAEQUAAOCAIgoAAMBBKI3llzfq\nSdNagyBNpw2iiVwiTVH20hi9adMmK+alQXJkZMT5tUHwcqxisZiPmchuvvlmKyY1fZ8+fdp5H2E9\niFBTU2PFDh8+7Lw9aUJ0e3u707Zef/115zy8uP76661YSkqKFTt37pwVO378uBXLyMiwYtJnRtT5\n3cDvtyAanqNuzZo1Vky6Jr3wMvFd+oaToaEh1WsT0azPnSgAAAAHFFEAAAAOKKIAAAAcUEQBAAA4\nmH2diZeRmlDz8/NVr/3kJz9pxU6cOGHFsrOzVdsbGBhQrZNIjaNepjRL06u1vDTuSQoLC62Ya6Ow\n19dKtNOlpUZeqZk7Ly/POZcFC9z/u6arq8v5tV6UlZVZMamxXHv8pPdbSUmJY3bhkBpns7KyVOsk\npaWlVkzbWJ6UlGTFqqqqrFhTU5MV8/uhn4997GNWTLpWpAnZCEZjY6MVk6aT5+bmWjHpWpM+l6T3\ngkT6/V5cXKx6rfSQzqpVq1SvnQnuRAEAADigiAIAAHBAEQUAAOCAIgoAAMBBLB6PxwPdYSxmAt4l\nAACAk6vVLdyJAgAAcEARBQAA4IAiCgAAwAFFFAAAgINQJpbHYrHA9yk1hUkTf2tra5338bvf/c6K\nSVNdpSnF0jGRpphLhoeHVesk0nEJ4/wYE0wu2km50vT5uXxctKKSi5c8pOnfExMTVqyjo8OKSdP8\nBwcHrZj02TI1NaXKT0uaFC9Nm5Z+XmlieUpKihVrbm62YocOHVLlF5VrxRg5l9tuu82KdXd3WzFp\n4nZbW5sVk45famqqFevr67Ni2m9N6O/vV63Tko7LkiVLrNiNN95oxTZu3Kjax/e//30rNj4+rsrF\ny/Xyuc99TrXuueeeU+VyJdyJAgAAcEARBQAA4IAiCgAAwAFFFAAAgINQGsujQmr0lJrDJYsWLbJi\nUtNyb2/vzBP7P1LDuNRsnp+fb8U6Ozud9zsbpaenW7GRkRErJjUBA5KVK1daMW3DqZcmcmm/UoNt\nU1OT8z6OHTtmxaTm+rn8OSI1aWub5iVjY2OqmDaXKNm/f78Vk3KWHrxYvXq1FTt8+LA/iV1FYWGh\nap30+3MmuBMFAADggCIKAADAAUUUAACAA4ooAAAAB/O6sdwLqXF0aGjIiknTX72QJiFDP/F9dHTU\nik1PTyckpw9LSkqyYn5PsJZIjZ4S6doNy8KFCwPfvjSpWnp4JCxpaWlWTLqmJC0tLX6n40x6T3r5\nxgUvPvjgg4TvY/PmzQnfh9+k94I04V47ZV2yfPly59dq7dmzx4qVl5f7vh/uRAEAADigiAIAAHBA\nEQUAAOCAIgoAAMBBJLqUpebXKDW6SrT5paamqtZJTaxSE2Zra6tqewiGdN6CmD5cWlqqWtfX15fg\nTPyX6EZ/6fxIDxycPn06oXlcSVj71U5ulqaYe536HIYgHuxIRCNzGKT3pBSTrt1Tp05ZsRUrVviT\n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\nAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first fully connected layer, `fc6` (rectified)\n", + "\n", + "We show the output values and the histogram of the positive values" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['fc6'].data[4]\n", + "plt.subplot(2, 1, 1)\n", + "plt.plot(feat.flat)\n", + "plt.subplot(2, 1, 2)\n", + "_ = plt.hist(feat.flat[feat.flat > 0], bins=100)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nyhnPydXq1at14okn6oQTTtDNdh8eyhNFclVuR8wdEJ2dzspz3qA9I8n8DlhYQ3LdddLLL/ceL4gD\nPbcszz8vjR5dbKyMkTtnv3eibmqinI5v14VFzttvZxzNp5CTO+NS5bhdx6U67PW2z2Qcj+n0GDOp\n3PF6xx29bxSctOHKZDKeY/J7Trj22tLlBltzlXE8psk4yi1b0G2uPvaxTNFxcsdNqePHZNOCMJKa\n5uZcNxWZovOLSw1p3HlKrg4dOqSrrrpKq1ev1saNG7Vs2TJt2rSp6PheHwuefnrx3/xm8blvRzmp\nqpXcXDAzkuy/vedH4fLefLP9XVWQPVN3dBz+d+/1EX5ylduvPv5x6e67ew6zK9PpXW7h+OefX3zc\nd97J9IrHiVzCUSrxMJlcOYnFXZmZHn8lreZK6n1M5XdKXOyxoJ/kKp+X7Vf4EewgL3J2x3ehcl+Q\n8Daf0uOF/ViwVFJZLLlatKj8vOOamPzoR7l/ZSKMojJ4Sq42bNig448/XqNGjVLfvn114YUX6sES\n3aV7rbkKUi65cvqBTrddMfzsZ+5jKpS/Xpze/fu9kNnNx64HX7ttFlWD9mKfbBgypOcwryfy9nZ3\n0znhJLkyNa9y05l4LFhKXJMrN8tbWJ6XXtGDPs/FpUYhzKQv+OSquNyxW7h/r1njfD6FSq07u2T2\nj38Mrma4XPIc9X4Wd54atO/cuVMjR47s/nvEiBF6+umni46/b1/2//kXqY6Ow20e3n7b+QUsp7C9\nRFtbz79zSVNueGH5uUc9b799eJxcmfv3Z4fl19Ts2VM8llxDzdxyOo3ZTltbzzjslGq4bPdbrnau\n8M43N/4XviCdc0727/xPiuTWw69+lf07v0GqXd8+ufm0tWUPzPz1ly9/WxWus9y0Ttit7/y4PvlJ\n6aGHDg/bs0fq8/4en9sf9u7tGc/+/YfXU255cuv0vfd672f5F93c8hZL2N999/D0uVrHwm2SX36p\nxH/vXvv1W2z63Lzt9oHcvm33mxMdHaX7etq9u+ffhcdm/nLkH6dtbfbbODddbru0t/feLvnrOn+a\nfK2t2eF2tdeFx3trq3Tkkdn9Y8+e8m+G5cstU+H5r5Tcch84kI2x8ELW3n54nefWZ259FDtX2a0D\nO7l5llPs/JSLK/d7R0fv86mUXcYjjywda26ZcsdZ/o1UW1vPv5cvl3bsKB5vuf07f1/Lj9XunNrW\ndni/zk2XG2/fvsPx5+b5zjs9y8wfRzq8DXPj5x+7ufL37Om5r7a1SZ//vPSJT/SMLf885fYll/xt\nmj+v/fuzHdBec03PbZGbT58+Uv/+7uZV6VKW5T7/vP/++7V69Wrd/f6zmN/85jd6+umntSTvK6vH\nH3+8Nm/ebC5SAACAgIwZM0avev0eUAFPNVfDhw/X9u3bu//evn27RowY0WMcUwECAAAkiac2V6ec\ncopeeeUVbdu2TQcOHNB9992nWbNmmY4NAAAgcTzVXPXp00d33HGHzjrrLB06dEjz5s3TuHHjTMcG\nAACQOJ7aXAEAAMBeID20u+lgNIlGjRqlSZMmqba2VlPe/2haa2urZsyYobFjx2rmzJlqy3sV5Kab\nbtIJJ5ygE088UQ8//HBUYbt22WWXKZ1Oa+LEid3DvCzns88+q4kTJ+qEE07Q1772tVCXwQu75V6w\nYIFGjBih2tpa1dbWatWqVd2/VcJyb9++XdOnT9f48eM1YcIE3X777ZIqf3sXW+5K39779+/X1KlT\nVVNTo5NOOknXX3+9pMrf3sWWu9K3d86hQ4dUW1urc889V1Llb++cwuUOZXtbhh08eNAaM2aMtXXr\nVuvAgQPW5MmTrY0bN5qeTaRGjRpl7d69u8ewb3zjG9bNN99sWZZlLVq0yPrmN79pWZZlvfDCC9bk\nyZOtAwcOWFu3brXGjBljHTp0KPSYvXjiiSes5557zpowYUL3MDfL2dXVZVmWZX3yk5+0nn76acuy\nLOvss8+2Vq1aFfKSuGO33AsWLLBuueWWXuNWynI3NTVZDQ0NlmVZ1t69e62xY8daGzdurPjtXWy5\nK317W5ZldXR0WJZlWZ2dndbUqVOtdevWVfz2tiz75a6G7W1ZlnXLLbdYX/rSl6xzzz3XsqzqOJ9b\nVu/lDmN7G6+5ctvBaFJZBU9TV65cqfr6eklSfX29Vrz/CfgHH3xQc+fOVd++fTVq1Cgdf/zx2rBh\nQ+jxejFt2jQNGjSoxzA3y/n000+rqalJe/fu7a7hu+SSS7qniSu75ZZ6b3OpcpZ76NChqqmpkST1\n799f48aN086dOyt+exdbbqmyt7ck9evXT5J04MABHTp0SIMGDar47S3ZL7dU+dt7x44d+uMf/6jL\nL7+8e1mrYXvbLbdlWYFvb+PJlV0Ho7mTVaVIpVI688wzdcopp3T39dXS0qJ0Oi1JSqfTamlpkSS9\n8cYbPbqpSPr6cLuchcOHDx+e2OVfsmSJJk+erHnz5nVXn1ficm/btk0NDQ2aOnVqVW3v3HKfeuqp\nkip/e3d1dammpkbpdLr70Wg1bG+75ZYqf3t//etf149+9CMdccThy341bG+75U6lUoFvb+PJVSqM\nT3dH7Mknn1RDQ4NWrVqlO++8U+vWrevxeyqVKrkeKmUdlVvOSnLFFVdo69atamxs1LBhwzR//vyo\nQwpEe3u75syZo8WLF2vAgAE9fqvk7d3e3q7zzz9fixcvVv/+/atiex9xxBFqbGzUjh079MQTT2jt\n2rU9fq/U7V243JlMpuK393/8x39oyJAhqq2tta2xkSpzexdb7jC2t/HkykkHo0k3bNgwSdJxxx2n\n8847Txs2bFA6nVZzc7MkqampSUPe/7Bd4frYsWOHhg8fHn7QhrhZzhEjRmj48OHakfdNiqQu/5Ah\nQ7pPPpdffnn3o91KWu7Ozk7NmTNHF198sWbPni2pOrZ3brkvuuii7uWuhu2d8+EPf1if//zn9eyz\nz1bF9s7JLfczzzxT8dv7T3/6k1auXKnRo0dr7ty5WrNmjS6++OKK3952y33JJZeEs72NtBbL09nZ\naX3sYx+ztm7dar333nsV16C9o6PDeueddyzLsqz29nbr05/+tPWf//mf1je+8Q1r0aJFlmVZ1k03\n3dSrYeB7771nbdmyxfrYxz7W3UAuCbZu3dqrQbvb5ZwyZYr11FNPWV1dXYlpAFm43G+88Ub3v2+9\n9VZr7ty5lmVVznJ3dXVZF198sXX11Vf3GF7p27vYclf69n7rrbesPXv2WJZlWfv27bOmTZtmPfro\noxW/vYstd1NTU/c4lbi982UyGeucc86xLKvyj+98+csdxvFtPLmyLMv64x//aI0dO9YaM2aMdeON\nNwYxi8hs2bLFmjx5sjV58mRr/Pjx3cu3e/du64wzzrBOOOEEa8aMGd0HsGVZ1g9+8ANrzJgx1sc/\n/nFr9erVUYXu2oUXXmgNGzbM6tu3rzVixAjrF7/4haflfOaZZ6wJEyZYY8aMsb761a9GsSiuFC73\nPffcY1188cXWxIkTrUmTJll///d/bzU3N3ePXwnLvW7dOiuVSlmTJ0+2ampqrJqaGmvVqlUVv73t\nlvuPf/xjxW/v559/3qqtrbUmT55sTZw40frhD39oWZa381glLHelb+98mUym+625St/e+dauXdu9\n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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The second fully connected layer, `fc7` (rectified)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['fc7'].data[4]\n", + "plt.subplot(2, 1, 1)\n", + "plt.plot(feat.flat)\n", + "plt.subplot(2, 1, 2)\n", + "_ = plt.hist(feat.flat[feat.flat > 0], bins=100)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nL+qm1rW8nGonoVdhHhGGZcu3Ui8efNDf9EnH68XLLx/43esbUsXPX3mlMDRRFH75ywMxlcd1/PHR\nLNOPKVMKzRy88No2rHR6E+d16TJKmxJU6vphxw7p1lv9lW/qLUK3bTFlSvDyojr3vLY39cNt3T/5\nSelLX/I3TxquNzaIPcGaPTvYfLa8sholG5K3am/huNVgRTnIaBhBOj+s9Zh17dp4vlGaVuxxPap9\n4LUN1j//c+W/JTlcVpCBmG04nv3EUa09ktcaLK/7yEsXJfPmSV/4Qu1leemmwcS+KH/q4KfM0rfY\nTXbTUN4OLKp73qJF1f/udn7bcK9Kg8gTrPXrzQxs+vjjhX+9HGRp3flB447isYQbtwuc3+VGFWf5\nCPRRLOfLXy6M92ijat92/Zx/mzb5a3AbV41ykOUEOTZN3ERs/PJXbV0qfXmt9BaxnzZYpaZP9z+P\nF37bn5q+NriN/+qV43h/4Sqqa6fXl1PSel9NUuQJ1ujR0rhx1afxcrLdfHPhX7/dNKTpoDAVa2k5\nCxcGL6d8e3ppg5XU9vZSCxHljc/Eeod5BPLFL3qbrtY2mDFDmjDB/W+12mBF+ajfz000yS8qUX3Z\n8dsnVa3pqs1Ta/it8s+nTq1cdqmbbvI2XSVhtutPfuKvnDjbYL3vfdGVXcnWrd6HIkvTPdQ2kSdY\nmzfXfuW10g4s7ezNz0lROu0zzxT+zXobrErGjze3HBPjZSXZBsvPjTmJWgg/Y8z94Q/epy09L0rX\nyy2Rsu34DpK8FRum+/1mHte6F69JlUTV1sxNLhe+k9ri28VRnNt+a6cqzXvZZf7mzariNhky5MBn\nQfa/jbW0NoqlDZbJC5dbWdUuWMVO/qKoHTLNtpubF2mM2Qvb1+uUU8LN7/ftuGpMbCs/36K//OXq\n7Xfc5vEy3QUXSCtXepsnyhvMd77jfXlha7DKk+5qvLa1q+Xdd6VXX/U/n5caNa/7L+iyoprP1Pxe\nlXbfEeQRoe3XR1tY8RahGz878DOfCT6vKbffXmi46XXsQDc2tMHy+wjWb7lx7ZsgF/CscquZ+//+\nP/PLCXN8FBviV1K6Dq+95v8NtFplSoVxNEtfYgi6PjZ+u6923h1UdheI+pHRTTcVkuRq5bldLyr1\nqVUpnvL1qNWYu17xiDA6vZIOwK9qHddVO1Civuh97nOFUdkXL5YmTw5WhqkDOap1NfGIMOzyvHLr\n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\nwziM499cC5rshXQIN1uyjOZeiCCIJBvMXpBoaap/oSGCpoimhiCCbK1AqAgqbIjQ5hoUDCIoCEoD\nCztDcKZzhuqO+9yH67M9y++5pocLvV8OCQQC3y5X8AMFSweQyr8in8+TzWbp7Oy0HcUplUqF1tZW\n6uvr6erqIhgM2o7kjLm5OZaWlvB4fmT1xX+vqqqK3t5ewuEwa2trtuM4JZfL4fV6SSQStLW1MT09\nTalUsh3LOclkktHRUSOzjH8FvntflogJz8/PRKNRlpeXqampsR3HKR6Ph8vLS25ubjg5OTF+dcn/\nam9vj7q6OkKhkH6F+aJ0Ok02myWVSrG6usrp6antSM54e3sjk8kwMzNDJpOhurqaxcVF27GcUi6X\n2d3dZWRkxMg84wWrqamJQqHw+7lQKODz+Uy/RuSvXl9fGR4eZmxsjKGhIdtxnFVbW8vAwAAXFxe2\nozjh7OyMnZ0dmpubicViHB0dMTExYTuWUxobGwHwer1EIhHOz88tJ3KHz+fD5/PR0dEBQDQaJZPR\n7SmfkUqlaG9vx+v1GplnvGCFw2Gur6/J5/OUy2W2t7cZHBw0/RqRP3p/f2dqaopgMMjs7KztOM65\nv7/n8fERgJeXFw4ODgiFQpZTuWFhYYFCoUAulyOZTNLd3c3GxobtWM4olUo8PT0BUCwW2d/f127q\nT2hoaMDv93N1dQV8rCVqaWmxnMotW1tbxGIxY/O+fNDoXwfqANJvicViHB8f8/DwgN/vZ35+nkQi\nYTuWM9LpNJubm7+3esPHNU79/f2Wk7nh9vaWyclJKpUKlUqF8fFxenp6bMdykpZLfM7d3R2RSAT4\n+LsrHo/T19dnOZVbVlZWiMfjlMtlAoEA6+vrtiM5o1gscnh4aHTtnw4aFRERETFMW11EREREDFPB\nEhERETFMBUtERETEMBUsEREREcNUsEREREQMU8ESERERMUwFS0RERMQwFSwRERERw34Bx7KOdHvS\nzDMAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final probability output, `prob`" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = net.caffenet.blobs['prob'].data[4]\n", + "plt.plot(feat.flat)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 18, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nbNTB34dJkv777d2brvtv/k266+uJJ9Lv2VLH1G3YEPHv//3ojx9s16502//RH0VcfXXEv/gXB7bb\nsO99L2LVqgP3h4YiTj01nV384AcP7LI+2MEzYf/jfxw4Keu3v50eH7hzZ8Sxx6Zf97e/HXHvvenX\nNeyuu9LH/uIv0vvDhxscLooPds89UXI2vFA4/DFhERGbNkX82397+PX27j0Qn08/nW774e/lsSJs\n586IT3wi/Z47EvbsqW0Gvre3fmOJGONkrS1lHsCR1Din/zu/M9rzlvqcpR978cWISZPSDT5tWvpN\n0d6efgPt2hUxYULE9OnpN/K2bekP9rnnRvzzf57+cm5pSX+YTzoprfl3f87R3i93udHeHxpKf3me\nemrE+98/+teYF889F/GDHxz+saPh/DDvvJP+0La2ptvmuOPSt08+mf6PdvbsdMp92PCPzKOPpi8m\nEyakHxu+DSv1PTPW/WrWHb42XZKkL3hJkr4gfPSjEUuXpt/zw8u+8EL6ff+zn6X/u3788TTYLroo\nfVHr7IyYODH92XnmmfQF4X//74j/9J/SXU4R6ed74YUDn+eYY9IX3NNPj7j55vTfsbMzfcH+6EfT\nF+JjjjlwIsqWlvTf+bvfTX9Op04t/jd+6630e+/tt9PtM2tWxOTJB86U//3vp8v+4z9GLFpUfE6w\noaGIvr50LA8+mN7+6389cMHh005Lt+3Bu2EP3na7d6fj/3f/Lr2cy2/8RjqW119Px/rJT6azBZMm\npTNA3/te+j3y6qvp75/jjkt/to89Nv06Xnklffyv/iqN3a1bI/7gDw59gZs3L+KMM9LdWaefnobW\nt7+dvohu354+3xlnpGN9+uk01o49Nv39d+qp6e/E005LX+y3bUvHPHFiup1nzUqD7ZRTIk44Id31\n+b73RSxenP5bPPpo+vi8eelzn3BC+jV+5CPp1xORPt8776TbYeHC9Pfn5MkHdq9GpCF30kkR/+pf\npW+/8510nQ9+MP13HN7FNXlyxG/9VvpzN3z76U/T392//GX673bGGREdHen2fuONNCZPOCHi+OPT\n5davT5+7tTXdjhddlL4dGjpwwexCIX2NSJKI//N/0u+zk08+sN3ffPPA99iECek2fOGFA7sNP/rR\n9PvgjjvS146INPj27ElD6j3vSb8vFixIP88VV0T8l/+SvuZt3Xogtt55J32dueqqdMboPe9J/z1+\n9KP0eZcsifj0pyNuuSU9e32SpNvmfe9L33/iiYj//t8jrrsu4sIL0zFFpG8nT05/tt79u2j452v4\n3/GYY9IZtD170t9d+/enPydJEvGBD6T/2fnoR4ujbd26dOaytTXdJj//efpa+973pjOff//36djP\nOSfdJtdeG7FmTRqWB/8hwvDPV5KkYzj22DRkZ8w48LEpUw4sV+mxpQcfCrFlS/q2uzvdtsOXV3rj\njfRrOPHE9N9q+N9r+PdAkqRf2+7dlX3uMgY3ukcffTRZsmTJyP0vfvGLyY033li0zMqVK5P169eP\n3J81a1aye/fustZNkiSZPn16EhFubm5ubm5ubrm/TZ8+vVQ6VaTkTNi8efNi69atsWPHjpg6dWrc\nddddsX79+qJlli1bFmvXro3ly5fHY489FieddFKceuqpMXHixDHXjYjYtm1bqSEAAByVSkZYa2tr\nrF27NpYsWRKFQiFWrFgR3d3dsW7duoiIWLlyZVx88cWxcePGmDFjRkyYMCFuv/32kusCABDRkiRH\nw5E7AADNJdMz5juZa74NDAzEb//2b8dZZ50VZ599dnzlK1+JiIif//znsWjRojjjjDNi8eLF8fpB\nfyb4pS99KWbOnBldXV1x//33ZzV0fq1QKMTcuXPjkksuiQjbrpm8/vrr8bGPfSy6u7vjzDPPjMcf\nf9z2ayJf+tKX4qyzzopzzjknPvGJT8Rbb71l++XUpz/96Tj11FPjnHPOGflYNdvqiSeeiHPOOSdm\nzpwZf/iHf1jeJ6/b0WUVGhoaSqZPn55s37492b9/fzJnzpxky5YtWQ2Hw3jppZeSJ598MkmSJHnz\nzTeTM844I9myZUvyp3/6p8maNWuSJEmSG2+8MfmzP/uzJEmS5Mc//nEyZ86cZP/+/cn27duT6dOn\nJ4VCIbPxkyRf/vKXk0984hPJJZdckiRJYts1kauvvjq59dZbkyRJkrfffjt5/fXXbb8msX379uS0\n005LfvWrXyVJkiS/93u/l9xxxx22X0499NBDyebNm5Ozzz575GOVbKt33nknSZIkmT9/fvL4448n\nSZIkS5cuTe67774xP3dmM2FO5pp/kydPjnPPPTciIo477rjo7u6OwcHBohP0XnPNNXHPPfdERMSG\nDRvi4x//eLS1tUVnZ2fMmDEj+ofP0EfD7dq1KzZu3Bif+cxnRk4jY9s1hzfeeCMefvjh+PSnPx0R\n6TG2J554ou3XJE444YRoa2uLffv2xdDQUOzbty+mTp1q++XUwoUL4+ThSxn8WiXb6vHHH4+XXnop\n3nzzzViwYEFERFx99dUj65SSWYSVcyJY8mPHjh3x5JNPxnnnnRcvv/xynHrqqRERceqpp8bLvz47\n44svvhgdHR0j69im2fqjP/qj+Ou//us45pgDP+a2XXPYvn17TJo0KT71qU/Fb/7mb8a1114be/fu\ntf2axCmnnBJ//Md/HL/xG78RU6dOjZNOOikWLVpk+zWRSrfVuz/e3t5e1jbMLMLKPREs2duzZ09c\nccUVcdNNN8Xxxx9f9FhLS0vJbWk7Z+Nb3/pWfOADH4i5c+eOejJl2y6/hoaGYvPmzfH7v//7sXnz\n5pgwYULceOONRcvYfvn1/PPPx9/8zd/Ejh074sUXX4w9e/bEN77xjaJlbL/mMda2qkVmEdbe3h4D\nB12/YWBgoKgiyYe33347rrjiirjqqqvi0ksvjYj0fwW7f33a4Jdeeik+8IEPRMSh23TXrl3R3t7e\n+EET3//+9+Pee++N0047LT7+8Y/Hgw8+GFdddZVt1yQ6Ojqio6Mj5s+fHxERH/vYx2Lz5s0xefJk\n268J/PCHP4zf+q3fiokTJ0Zra2tcfvnl8eijj9p+TaSS35UdHR3R3t4eu4avXRblb8PMIuzgE8Hu\n378/7rrrrli2bFlWw+EwkiSJFStWxJlnnhmf//znRz6+bNmy+OqvL7j31a9+dSTOli1bFnfeeWfs\n378/tm/fHlu3bh3ZP05jffGLX4yBgYHYvn173HnnnXHBBRfE17/+dduuSUyePDmmTZsWzz33XERE\nbNq0Kc4666y45JJLbL8m0NXVFY899lj88pe/jCRJYtOmTXHmmWfafk2k0t+VkydPjhNOOCEef/zx\nSJIkvv71r4+sU1Id/8CgYhs3bkzOOOOMZPr06ckXv/jFLIfCYTz88MNJS0tLMmfOnOTcc89Nzj33\n3OS+++5LfvaznyUXXnhhMnPmzGTRokXJa6+9NrLOX/7lXybTp09PZs2alfT29mY4eob19fWN/HWk\nbdc8nnrqqWTevHnJ7Nmzk8suuyx5/fXXbb8msmbNmuTMM89Mzj777OTqq69O9u/fb/vl1PLly5Mp\nU6YkbW1tSUdHR3LbbbdVta1++MMfJmeffXYyffr05A/+4A/K+txO1goAkIFMT9YKADBeiTAAgAyI\nMACADIgwAIAMiDAAgAyIMACADIgwAIAMiDAAgAz8fx1o94trs5o2AAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see the top 5 predicted labels." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'\n", + "try:\n", + " labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\\t')\n", + "except:\n", + " !../data/ilsvrc12/get_ilsvrc_aux.sh\n", + " labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\\t')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 19 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "top_k = net.caffenet.blobs['prob'].data[4].flatten().argsort()[-1:-6:-1]\n", + "print labels[top_k]" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "['n02808304 bath towel' 'n02869837 bonnet, poke bonnet'\n", + " 'n03124170 cowboy hat, ten-gallon hat' 'n04259630 sombrero'\n", + " 'n04209133 shower cap']\n" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Funnily enough, ImageNet does not include portraits as a category, so the classifier is quite bad at classifying images as containing people." + ] + } + ], + "metadata": {} + } + ] +} diff --git a/examples/imagenet/get_caffe_reference_imagenet_model.sh b/examples/imagenet/get_caffe_reference_imagenet_model.sh new file mode 100755 index 00000000000..0d65dd685ee --- /dev/null +++ b/examples/imagenet/get_caffe_reference_imagenet_model.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh +# This scripts downloads the caffe reference imagenet model +# for ilsvrc image classification and deep feature extraction + +MODEL=caffe_reference_imagenet_model +CHECKSUM=bf44bac4a59aa7792b296962fe483f2b + +if [ -f $MODEL ]; then + echo "Model already exists. Checking md5..." + os=`uname -s` + if [ "$os" = "Linux" ]; then + checksum=`md5sum $MODEL | awk '{ print $1 }'` + elif [ "$os" = "Darwin" ]; then + checksum=`cat $MODEL | md5` + fi + if [ "$checksum" = "$CHECKSUM" ]; then + echo "Model checksum is correct. No need to download." + exit 0 + else + echo "Model checksum is incorrect. Need to download again." + fi +fi + +echo "Downloading..." + +wget https://www.dropbox.com/s/n3jups0gr7uj0dv/$MODEL + +echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/models/imagenet.prototxt b/examples/imagenet/imagenet_deploy.prototxt similarity index 92% rename from models/imagenet.prototxt rename to examples/imagenet/imagenet_deploy.prototxt index 0fec21b3c50..0b1f41ab914 100644 --- a/models/imagenet.prototxt +++ b/examples/imagenet/imagenet_deploy.prototxt @@ -57,15 +57,6 @@ layers { bottom: "pool1" top: "norm1" } -layers { - layer { - name: "pad2" - type: "padding" - pad: 2 - } - bottom: "norm1" - top: "pad2" -} layers { layer { name: "conv2" @@ -73,6 +64,7 @@ layers { num_output: 256 group: 2 kernelsize: 5 + pad: 2 weight_filler { type: "gaussian" std: 0.01 @@ -86,7 +78,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad2" + bottom: "norm1" top: "conv2" } layers { @@ -119,21 +111,13 @@ layers { bottom: "pool2" top: "norm2" } -layers { - layer { - name: "pad3" - type: "padding" - pad: 1 - } - bottom: "norm2" - top: "pad3" -} layers { layer { name: "conv3" type: "conv" num_output: 384 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -147,7 +131,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad3" + bottom: "norm2" top: "conv3" } layers { @@ -158,15 +142,6 @@ layers { bottom: "conv3" top: "conv3" } -layers { - layer { - name: "pad4" - type: "padding" - pad: 1 - } - bottom: "conv3" - top: "pad4" -} layers { layer { name: "conv4" @@ -174,6 +149,7 @@ layers { num_output: 384 group: 2 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -187,7 +163,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad4" + bottom: "conv3" top: "conv4" } layers { @@ -198,15 +174,6 @@ layers { bottom: "conv4" top: "conv4" } -layers { - layer { - name: "pad5" - type: "padding" - pad: 1 - } - bottom: "conv4" - top: "pad5" -} layers { layer { name: "conv5" @@ -214,6 +181,7 @@ layers { num_output: 256 group: 2 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -227,7 +195,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad5" + bottom: "conv4" top: "conv5" } layers { diff --git a/examples/imagenet/imagenet_train.prototxt b/examples/imagenet/imagenet_train.prototxt index e395302e5ef..9764687c35f 100644 --- a/examples/imagenet/imagenet_train.prototxt +++ b/examples/imagenet/imagenet_train.prototxt @@ -65,15 +65,6 @@ layers { bottom: "pool1" top: "norm1" } -layers { - layer { - name: "pad2" - type: "padding" - pad: 2 - } - bottom: "norm1" - top: "pad2" -} layers { layer { name: "conv2" @@ -81,6 +72,7 @@ layers { num_output: 256 group: 2 kernelsize: 5 + pad: 2 weight_filler { type: "gaussian" std: 0.01 @@ -94,7 +86,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad2" + bottom: "norm1" top: "conv2" } layers { @@ -127,21 +119,13 @@ layers { bottom: "pool2" top: "norm2" } -layers { - layer { - name: "pad3" - type: "padding" - pad: 1 - } - bottom: "norm2" - top: "pad3" -} layers { layer { name: "conv3" type: "conv" num_output: 384 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -155,7 +139,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad3" + bottom: "norm2" top: "conv3" } layers { @@ -166,15 +150,6 @@ layers { bottom: "conv3" top: "conv3" } -layers { - layer { - name: "pad4" - type: "padding" - pad: 1 - } - bottom: "conv3" - top: "pad4" -} layers { layer { name: "conv4" @@ -182,6 +157,7 @@ layers { num_output: 384 group: 2 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -195,7 +171,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad4" + bottom: "conv3" top: "conv4" } layers { @@ -206,15 +182,6 @@ layers { bottom: "conv4" top: "conv4" } -layers { - layer { - name: "pad5" - type: "padding" - pad: 1 - } - bottom: "conv4" - top: "pad5" -} layers { layer { name: "conv5" @@ -222,6 +189,7 @@ layers { num_output: 256 group: 2 kernelsize: 3 + pad: 1 weight_filler { type: "gaussian" std: 0.01 @@ -235,7 +203,7 @@ layers { weight_decay: 1. weight_decay: 0. } - bottom: "pad5" + bottom: "conv4" top: "conv5" } layers { diff --git a/examples/imagenet/imagenet_val.prototxt b/examples/imagenet/imagenet_val.prototxt index e523d29ed90..a004b74f626 100644 --- a/examples/imagenet/imagenet_val.prototxt +++ b/examples/imagenet/imagenet_val.prototxt @@ -53,15 +53,6 @@ layers { bottom: "pool1" top: "norm1" } -layers { - layer { - name: "pad2" - type: "padding" - pad: 2 - } - bottom: "norm1" - top: "pad2" -} layers { layer { name: "conv2" @@ -69,8 +60,9 @@ layers { num_output: 256 group: 2 kernelsize: 5 + pad: 2 } - bottom: "pad2" + bottom: "norm1" top: "conv2" } layers { @@ -103,23 +95,15 @@ layers { bottom: "pool2" top: "norm2" } -layers { - layer { - name: "pad3" - type: "padding" - pad: 1 - } - bottom: "norm2" - top: "pad3" -} layers { layer { name: "conv3" type: "conv" num_output: 384 kernelsize: 3 + pad: 1 } - bottom: "pad3" + bottom: "norm2" top: "conv3" } layers { @@ -130,15 +114,6 @@ layers { bottom: "conv3" top: "conv3" } -layers { - layer { - name: "pad4" - type: "padding" - pad: 1 - } - bottom: "conv3" - top: "pad4" -} layers { layer { name: "conv4" @@ -146,8 +121,9 @@ layers { num_output: 384 group: 2 kernelsize: 3 + pad: 1 } - bottom: "pad4" + bottom: "conv3" top: "conv4" } layers { @@ -158,15 +134,6 @@ layers { bottom: "conv4" top: "conv4" } -layers { - layer { - name: "pad5" - type: "padding" - pad: 1 - } - bottom: "conv4" - top: "pad5" -} layers { layer { name: "conv5" @@ -174,8 +141,9 @@ layers { num_output: 256 group: 2 kernelsize: 3 + pad: 1 } - bottom: "pad5" + bottom: "conv4" top: "conv5" } layers { diff --git a/examples/imagenet_pretrained.ipynb b/examples/imagenet_pretrained.ipynb new file mode 100644 index 00000000000..8bf17f6f5a8 --- /dev/null +++ b/examples/imagenet_pretrained.ipynb @@ -0,0 +1,270 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Running Pretrained ImageNet: the Easy way\n", + "=========================================\n", + "\n", + "For easier use of pretrained models, we provide a wrapper specifically written for the case of ImageNet, so one can take an image and directly compute features or predictions from them. Both Python and Matlab wrappers are provided. We will describe the use of the Python wrapper here, and the Matlab wrapper usage is very similar.\n", + "\n", + "We assume that you have successfully compiled Caffe and set the correct `PYTHONPATH`. If not, please refer to the [installation instructions](installation.html). You will use our pre-trained imagenet model, which you can download (232.57MB) by running `examples/imagenet/get_caffe_reference_imagenet_model.sh`. Note that this pre-trained model is licensed for academic research / non-commercial use only.\n", + "\n", + "Ready? Let's start." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from caffe import imagenet\n", + "from matplotlib import pyplot\n", + "\n", + "# Set the right path to your model file, pretrained model,\n", + "# and the image you would like to classify.\n", + "MODEL_FILE = 'imagenet/imagenet_deploy.prototxt'\n", + "PRETRAINED = 'imagenet/caffe_reference_imagenet_model'\n", + "IMAGE_FILE = 'images/lena.png'" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Loading a network is easy. imagenet.ImagenetClassifier wraps everything. In default, the classifier will crop the center and corners of an image, as well as their mirrored versions, thus creating a batch of 10 images. If you look at the provided MODEL_FILE you can actually see that we are defining the input batch size to be 10.\n", + "\n", + "If you would like to just do the center, you need to specify center_only=1, and also change the batch size from 10 to 1 in the prototxt." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "net = imagenet.ImageNetClassifier(\n", + " MODEL_FILE, PRETRAINED)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will set the phase to test since we are doing testing, and will first use CPU for the computation." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "net.caffenet.set_phase_test()\n", + "net.caffenet.set_mode_cpu()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So now, we can do a prediction. Let's show some output as well:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "prediction = net.predict(IMAGE_FILE)\n", + "print 'prediction shape:', prediction.shape\n", + "pyplot.plot(prediction)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "prediction shape: (1000,)\n" + ] + }, + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can see that the prediction is 1000-dimensional, and is pretty sparse. Our pretrained model uses the alphabetical order for the synsets, and if you look at the index that maximizes the prediction score, it is \"sombrero\". Reasonable prediction, right?\n", + "\n", + "Now, why don't we see how long it takes to perform the classification end to end? This result is run from an Intel i5 CPU, so you may observe some performance differences." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%timeit net.predict(IMAGE_FILE)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1 loops, best of 3: 194 ms per loop\n" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It may look a little slow, but note that it also includes image loading, cropping, and python interfacing time, and it is running 10 images. As a performance notice, if you really want to make prediction fast, you can optionally write things in C and also pipeline the image loading part. But for most applications, the current speed might be fine I guess?\n", + "\n", + "OK, so how about GPU? it is actually pretty easy:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "net.caffenet.set_mode_gpu()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Now we are in GPU mode. Let's see if the code gives the same result:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "prediction = net.predict(IMAGE_FILE)\n", + "print 'prediction shape:', prediction.shape\n", + "pyplot.plot(prediction)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "prediction shape: (1000,)\n" + ] + }, + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 7, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Good, everything is the same. And how about time consumption? The following benchmark is obtained on the same machine with a K20 GPU:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%timeit net.predict(IMAGE_FILE)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "10 loops, best of 3: 50 ms per loop\n" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pretty fast right? Not as fast as you expected? Indeed, in this python demo you are seeing only 4 times speedup. But remember - the GPU code is actually very fast, and the data loading, transformation and interfacing actually start to take **more** time than the actual convnet computation itself!\n", + "\n", + "To fully utilize the power of GPUs, you really want to use one of these ideas:\n", + "* Use larger batches, and minimize python call and data transfer overheads.\n", + "* Pipeline data load operations, like using a subprocess.\n", + "* Code in C++. A little inconvenient, but maybe worth it if your dataset is really, really large." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Parting Words\n", + "-------------\n", + "\n", + "So this is python! We hope the interface is easy enough for one to use. The python wrapper is interfaced with boost::python, and source code can be found at `python/caffe/imagenet`. If you would like to achieve some custom functions, you are more than welcome to look at them!" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/data/cat.jpg b/examples/images/cat.jpg similarity index 100% rename from data/cat.jpg rename to examples/images/cat.jpg diff --git a/examples/images/lena.png b/examples/images/lena.png new file mode 100644 index 00000000000..59ef68aabd0 Binary files /dev/null and b/examples/images/lena.png differ diff --git a/examples/lenet/convert_mnist_data.cpp b/examples/lenet/convert_mnist_data.cpp index 32d9b9d9100..1bf1d663918 100644 --- a/examples/lenet/convert_mnist_data.cpp +++ b/examples/lenet/convert_mnist_data.cpp @@ -12,14 +12,13 @@ #include #include -#include -#include +#include // NOLINT(readability/streams) +#include #include "caffe/proto/caffe.pb.h" -uint32_t swap_endian( uint32_t val ) -{ - val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); +uint32_t swap_endian(uint32_t val) { + val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF); return (val << 16) | (val >> 16); } @@ -37,20 +36,20 @@ void convert_dataset(const char* image_filename, const char* label_filename, uint32_t rows; uint32_t cols; - image_file.read((char*)(&magic), 4); + image_file.read(reinterpret_cast(&magic), 4); magic = swap_endian(magic); CHECK_EQ(magic, 2051) << "Incorrect image file magic."; - label_file.read((char*)(&magic), 4); + label_file.read(reinterpret_cast(&magic), 4); magic = swap_endian(magic); CHECK_EQ(magic, 2049) << "Incorrect label file magic."; - image_file.read((char*)(&num_items), 4); + image_file.read(reinterpret_cast(&num_items), 4); num_items = swap_endian(num_items); - label_file.read((char*)(&num_labels), 4); + label_file.read(reinterpret_cast(&num_labels), 4); num_labels = swap_endian(num_labels); CHECK_EQ(num_items, num_labels); - image_file.read((char*)(&rows), 4); + image_file.read(reinterpret_cast(&rows), 4); rows = swap_endian(rows); - image_file.read((char*)(&cols), 4); + image_file.read(reinterpret_cast(&cols), 4); cols = swap_endian(cols); // Open leveldb @@ -65,7 +64,8 @@ void convert_dataset(const char* image_filename, const char* label_filename, char label; char* pixels = new char[rows * cols]; - char key[10]; + const int kMaxKeyLength = 10; + char key[kMaxKeyLength]; std::string value; caffe::Datum datum; @@ -80,7 +80,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, datum.set_data(pixels, rows*cols); datum.set_label(label); datum.SerializeToString(&value); - sprintf(key, "%08d", itemid); + snprintf(key, kMaxKeyLength, "%08d", itemid); db->Put(leveldb::WriteOptions(), std::string(key), value); } @@ -88,7 +88,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, delete pixels; } -int main (int argc, char** argv) { +int main(int argc, char** argv) { if (argc != 4) { printf("This script converts the MNIST dataset to the leveldb format used\n" "by caffe to perform classification.\n" diff --git a/examples/selective_search_demo.ipynb b/examples/selective_search_demo.ipynb index 04a51d2a85b..6891a9e1504 100644 --- a/examples/selective_search_demo.ipynb +++ b/examples/selective_search_demo.ipynb @@ -15,9 +15,9 @@ "\n", "First of all, we'll need a little [Python script](https://github.com/sergeyk/selective_search_ijcv_with_python) to run the Matlab Selective Search code.\n", "\n", - "Let's run detection on an image of a couple of cats frolicking (one of the ImageNet detection challenge pictures), which we will download from the web. You'll need a prototxt specifying the network, and a trained model.\n", + "Let's run detection on an image of a couple of cats frolicking (one of the ImageNet detection challenge pictures), which we will download from the web.\n", "\n", - "We will use `models/imagenet.prototxt` and the caffe_reference_imagenet_model which you can download by `models/get_caffe_reference_imagenet_model.sh`. The learned model should be at `models/caffe_reference_imagenet_model`." + "Before you get started with this notebook, make sure to follow [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the pretrained ImageNet model." ] }, { @@ -27,11 +27,240 @@ "!mkdir _temp\n", "!curl http://farm1.static.flickr.com/220/512450093_7717fb8ce8.jpg > _temp/cat.jpg\n", "!echo `pwd`/_temp/cat.jpg > _temp/cat.txt\n", - "!python ../python/caffe/detection/detector.py --crop_mode=selective_search --pretrained_model=../models/caffe_reference_imagenet_model --model_def=../models/imagenet.prototxt _temp/cat.txt _temp/cat.h5" + "!python ../python/caffe/detection/detector.py --crop_mode=selective_search --pretrained_model=../examples/imagenet/caffe_reference_imagenet_model --model_def=../examples/imagenet/imagenet_deploy.prototxt _temp/cat.txt _temp/cat.h5" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\r\n", + " Dload Upload Total Spent Left Speed\r\n", + "\r", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\r", + "100 212k 100 212k 0 0 263k 0 -" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "-:--:-- --:--:-- --:--:-- 519k\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Loading Caffe model.\r\n", + "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n", + "I0318 11:15:21.671466 2104947072 net.cpp:74] Creating Layer conv1\r\n", + "I0318 11:15:21.671494 2104947072 net.cpp:84] conv1 <- data\r\n", + "I0318 11:15:21.671500 2104947072 net.cpp:110] conv1 -> conv1\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0318 11:15:21.993130 2104947072 net.cpp:125] Top shape: 10 96 55 55 (2904000)\r\n", + "I0318 11:15:21.993155 2104947072 net.cpp:151] conv1 needs backward computation.\r\n", + "I0318 11:15:21.993165 2104947072 net.cpp:74] Creating Layer relu1\r\n", + "I0318 11:15:21.993170 2104947072 net.cpp:84] relu1 <- conv1\r\n", + "I0318 11:15:21.993175 2104947072 net.cpp:98] relu1 -> conv1 (in-place)\r\n", + "I0318 11:15:21.993182 2104947072 net.cpp:125] Top shape: 10 96 55 55 (2904000)\r\n", + "I0318 11:15:21.993187 2104947072 net.cpp:151] relu1 needs backward computation.\r\n", + "I0318 11:15:21.993192 2104947072 net.cpp:74] Creating Layer pool1\r\n", + "I0318 11:15:21.993197 2104947072 net.cpp:84] pool1 <- conv1\r\n", + "I0318 11:15:21.993201 2104947072 net.cpp:110] pool1 -> pool1\r\n", + "I0318 11:15:21.993208 2104947072 net.cpp:125] Top shape: 10 96 27 27 (699840)\r\n", + "I0318 11:15:21.993212 2104947072 net.cpp:151] pool1 needs backward computation.\r\n", + "I0318 11:15:21.993217 2104947072 net.cpp:74] Creating Layer norm1\r\n", + "I0318 11:15:21.993221 2104947072 net.cpp:84] norm1 <- pool1\r\n", + "I0318 11:15:21.993227 2104947072 net.cpp:110] norm1 -> norm1\r\n", + "I0318 11:15:21.993233 2104947072 net.cpp:125] Top shape: 10 96 27 27 (699840)\r\n", + "I0318 11:15:21.993238 2104947072 net.cpp:151] norm1 needs backward computation.\r\n", + "I0318 11:15:21.993244 2104947072 net.cpp:74] Creating Layer conv2\r\n", + "I0318 11:15:21.993248 2104947072 net.cpp:84] conv2 <- norm1\r\n", + "I0318 11:15:21.993252 2104947072 net.cpp:110] conv2 -> conv2\r\n", + "I0318 11:15:21.995401 2104947072 net.cpp:125] Top shape: 10 256 27 27 (1866240)\r\n", + "I0318 11:15:21.995414 2104947072 net.cpp:151] conv2 needs backward computation.\r\n", + "I0318 11:15:21.995419 2104947072 net.cpp:74] Creating Layer relu2\r\n", + "I0318 11:15:21.995424 2104947072 net.cpp:84] relu2 <- conv2\r\n", + "I0318 11:15:21.995429 2104947072 net.cpp:98] relu2 -> conv2 (in-place)\r\n", + "I0318 11:15:21.995432 2104947072 net.cpp:125] Top shape: 10 256 27 27 (1866240)\r\n", + "I0318 11:15:21.995437 2104947072 net.cpp:151] relu2 needs backward computation.\r\n", + "I0318 11:15:21.995441 2104947072 net.cpp:74] Creating Layer pool2\r\n", + "I0318 11:15:21.995445 2104947072 net.cpp:84] pool2 <- conv2\r\n", + "I0318 11:15:21.995450 2104947072 net.cpp:110] pool2 -> pool2\r\n", + "I0318 11:15:21.995455 2104947072 net.cpp:125] Top shape: 10 256 13 13 (432640)\r\n", + "I0318 11:15:21.995460 2104947072 net.cpp:151] pool2 needs backward computation.\r\n", + "I0318 11:15:21.995463 2104947072 net.cpp:74] Creating Layer norm2\r\n", + "I0318 11:15:21.995467 2104947072 net.cpp:84] norm2 <- pool2\r\n", + "I0318 11:15:21.995471 2104947072 net.cpp:110] norm2 -> norm2\r\n", + "I0318 11:15:21.995477 2104947072 net.cpp:125] Top shape: 10 256 13 13 (432640)\r\n", + "I0318 11:15:21.995481 2104947072 net.cpp:151] norm2 needs backward computation.\r\n", + "I0318 11:15:21.995487 2104947072 net.cpp:74] Creating Layer conv3\r\n", + "I0318 11:15:21.995491 2104947072 net.cpp:84] conv3 <- norm2\r\n", + "I0318 11:15:21.995496 2104947072 net.cpp:110] conv3 -> conv3\r\n", + "I0318 11:15:22.001526 2104947072 net.cpp:125] Top shape: 10 384 13 13 (648960)\r\n", + "I0318 11:15:22.001549 2104947072 net.cpp:151] conv3 needs backward computation.\r\n", + "I0318 11:15:22.001555 2104947072 net.cpp:74] Creating Layer relu3\r\n", + "I0318 11:15:22.001560 2104947072 net.cpp:84] relu3 <- conv3\r\n", + "I0318 11:15:22.001565 2104947072 net.cpp:98] relu3 -> conv3 (in-place)\r\n", + "I0318 11:15:22.001570 2104947072 net.cpp:125] Top shape: 10 384 13 13 (648960)\r\n", + "I0318 11:15:22.001574 2104947072 net.cpp:151] relu3 needs backward computation.\r\n", + "I0318 11:15:22.001580 2104947072 net.cpp:74] Creating Layer conv4\r\n", + "I0318 11:15:22.001585 2104947072 net.cpp:84] conv4 <- conv3\r\n", + "I0318 11:15:22.001588 2104947072 net.cpp:110] conv4 -> conv4\r\n", + "I0318 11:15:22.005995 2104947072 net.cpp:125] Top shape: 10 384 13 13 (648960)\r\n", + "I0318 11:15:22.006008 2104947072 net.cpp:151] conv4 needs backward computation.\r\n", + "I0318 11:15:22.006014 2104947072 net.cpp:74] Creating Layer relu4\r\n", + "I0318 11:15:22.006018 2104947072 net.cpp:84] relu4 <- conv4\r\n", + "I0318 11:15:22.006022 2104947072 net.cpp:98] relu4 -> conv4 (in-place)\r\n", + "I0318 11:15:22.006027 2104947072 net.cpp:125] Top shape: 10 384 13 13 (648960)\r\n", + "I0318 11:15:22.006031 2104947072 net.cpp:151] relu4 needs backward computation.\r\n", + "I0318 11:15:22.006037 2104947072 net.cpp:74] Creating Layer conv5\r\n", + "I0318 11:15:22.006042 2104947072 net.cpp:84] conv5 <- conv4\r\n", + "I0318 11:15:22.006045 2104947072 net.cpp:110] conv5 -> conv5\r\n", + "I0318 11:15:22.009027 2104947072 net.cpp:125] Top shape: 10 256 13 13 (432640)\r\n", + "I0318 11:15:22.009048 2104947072 net.cpp:151] conv5 needs backward computation.\r\n", + "I0318 11:15:22.009057 2104947072 net.cpp:74] Creating Layer relu5\r\n", + "I0318 11:15:22.009062 2104947072 net.cpp:84] relu5 <- conv5\r\n", + "I0318 11:15:22.009065 2104947072 net.cpp:98] relu5 -> conv5 (in-place)\r\n", + "I0318 11:15:22.009071 2104947072 net.cpp:125] Top shape: 10 256 13 13 (432640)\r\n", + "I0318 11:15:22.009075 2104947072 net.cpp:151] relu5 needs backward computation.\r\n", + "I0318 11:15:22.009080 2104947072 net.cpp:74] Creating Layer pool5\r\n", + "I0318 11:15:22.009084 2104947072 net.cpp:84] pool5 <- conv5\r\n", + "I0318 11:15:22.009088 2104947072 net.cpp:110] pool5 -> pool5\r\n", + "I0318 11:15:22.009093 2104947072 net.cpp:125] Top shape: 10 256 6 6 (92160)\r\n", + "I0318 11:15:22.009099 2104947072 net.cpp:151] pool5 needs backward computation.\r\n", + "I0318 11:15:22.009104 2104947072 net.cpp:74] Creating Layer fc6\r\n", + "I0318 11:15:22.009107 2104947072 net.cpp:84] fc6 <- pool5\r\n", + "I0318 11:15:22.009111 2104947072 net.cpp:110] fc6 -> fc6\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0318 11:15:22.271282 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.271308 2104947072 net.cpp:151] fc6 needs backward computation.\r\n", + "I0318 11:15:22.271320 2104947072 net.cpp:74] Creating Layer relu6\r\n", + "I0318 11:15:22.271327 2104947072 net.cpp:84] relu6 <- fc6\r\n", + "I0318 11:15:22.271332 2104947072 net.cpp:98] relu6 -> fc6 (in-place)\r\n", + "I0318 11:15:22.271337 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.271340 2104947072 net.cpp:151] relu6 needs backward computation.\r\n", + "I0318 11:15:22.271345 2104947072 net.cpp:74] Creating Layer drop6\r\n", + "I0318 11:15:22.271349 2104947072 net.cpp:84] drop6 <- fc6\r\n", + "I0318 11:15:22.271353 2104947072 net.cpp:98] drop6 -> fc6 (in-place)\r\n", + "I0318 11:15:22.271369 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.271374 2104947072 net.cpp:151] drop6 needs backward computation.\r\n", + "I0318 11:15:22.271380 2104947072 net.cpp:74] Creating Layer fc7\r\n", + "I0318 11:15:22.271384 2104947072 net.cpp:84] fc7 <- fc6\r\n", + "I0318 11:15:22.271389 2104947072 net.cpp:110] fc7 -> fc7\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0318 11:15:22.389216 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.389250 2104947072 net.cpp:151] fc7 needs backward computation.\r\n", + "I0318 11:15:22.389258 2104947072 net.cpp:74] Creating Layer relu7\r\n", + "I0318 11:15:22.389264 2104947072 net.cpp:84] relu7 <- fc7\r\n", + "I0318 11:15:22.389271 2104947072 net.cpp:98] relu7 -> fc7 (in-place)\r\n", + "I0318 11:15:22.389276 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.389279 2104947072 net.cpp:151] relu7 needs backward computation.\r\n", + "I0318 11:15:22.389284 2104947072 net.cpp:74] Creating Layer drop7\r\n", + "I0318 11:15:22.389289 2104947072 net.cpp:84] drop7 <- fc7\r\n", + "I0318 11:15:22.389293 2104947072 net.cpp:98] drop7 -> fc7 (in-place)\r\n", + "I0318 11:15:22.389298 2104947072 net.cpp:125] Top shape: 10 4096 1 1 (40960)\r\n", + "I0318 11:15:22.389302 2104947072 net.cpp:151] drop7 needs backward computation.\r\n", + "I0318 11:15:22.389308 2104947072 net.cpp:74] Creating Layer fc8\r\n", + "I0318 11:15:22.389312 2104947072 net.cpp:84] fc8 <- fc7\r\n", + "I0318 11:15:22.389317 2104947072 net.cpp:110] fc8 -> fc8\r\n", + "I0318 11:15:22.417853 2104947072 net.cpp:125] Top shape: 10 1000 1 1 (10000)\r\n", + "I0318 11:15:22.417879 2104947072 net.cpp:151] fc8 needs backward computation.\r\n", + "I0318 11:15:22.417887 2104947072 net.cpp:74] Creating Layer prob\r\n", + "I0318 11:15:22.417892 2104947072 net.cpp:84] prob <- fc8\r\n", + "I0318 11:15:22.417898 2104947072 net.cpp:110] prob -> prob\r\n", + "I0318 11:15:22.417917 2104947072 net.cpp:125] Top shape: 10 1000 1 1 (10000)\r\n", + "I0318 11:15:22.417920 2104947072 net.cpp:151] prob needs backward computation.\r\n", + "I0318 11:15:22.417924 2104947072 net.cpp:162] This network produces output prob\r\n", + "I0318 11:15:22.417928 2104947072 net.cpp:173] Collecting Learning Rate and Weight Decay.\r\n", + "I0318 11:15:22.417944 2104947072 net.cpp:166] Network initialization done.\r\n", + "I0318 11:15:22.417948 2104947072 net.cpp:167] Memory required for Data 42022840\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Caffe model loaded in 1.621 s\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Loading input and assembling batches...\r\n", + "selective_search({'/Users/karayev/work/caffe-bvlc/examples/_temp/cat.jpg'}, '/var/folders/4q/vm1lt3t91p9gl06nz6s1dzzw0000gn/T/tmpOcszAc.mat')\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "23 batches assembled in 5.225 s\r\n", + "Processing 1 files in 23 batches\r\n", + "...on batch 0/23, elapsed time: 0.000 s\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "...on batch 10/23, elapsed time: 3.819 s\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "...on batch 20/23, elapsed time: 7.571 s\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Processing complete after 8.818 s.\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: \r\n", + "your performance may suffer as PyTables will pickle object types that it cannot\r\n", + "map directly to c-types [inferred_type->mixed,key->block1_values] [items->['feat']]\r\n", + "\r\n", + " warnings.warn(ws, PerformanceWarning)\r\n", + "Done. Saving to _temp/cat.h5 took 0.160 s.\r\n" + ] + } + ], + "prompt_number": 1 }, { "cell_type": "markdown", @@ -463,4 +692,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 7fd7ea6329c..96ba58c2716 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -18,6 +18,11 @@ #define CURAND_CHECK(condition) CHECK_EQ((condition), CURAND_STATUS_SUCCESS) #define VSL_CHECK(condition) CHECK_EQ((condition), VSL_STATUS_OK) +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; \ + i < (n); \ + i += blockDim.x * gridDim.x) + // After a kernel is executed, this will check the error and if there is one, // exit loudly. #define CUDA_POST_KERNEL_CHECK \ diff --git a/include/caffe/filler.hpp b/include/caffe/filler.hpp index effe62ff2c5..5b934a331e3 100644 --- a/include/caffe/filler.hpp +++ b/include/caffe/filler.hpp @@ -42,7 +42,7 @@ class ConstantFiller : public Filler { for (int i = 0; i < count; ++i) { data[i] = value; } - }; + } }; template diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index adc63657369..a0cb487e50d 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -67,7 +67,7 @@ class Layer { vector*>* top) { // LOG(WARNING) << "Using CPU code as backup."; Forward_cpu(bottom, top); - }; + } // Backward functions: the backward function will compute the gradients for // any parameters and also for the bottom blobs if propagate_down is true. @@ -80,7 +80,7 @@ class Layer { vector*>* bottom) { // LOG(WARNING) << "Using CPU code as backup."; return Backward_cpu(top, propagate_down, bottom); - }; + } DISABLE_COPY_AND_ASSIGN(Layer); }; // class Layer @@ -101,7 +101,7 @@ inline void Layer::Forward(const vector*>& bottom, default: LOG(FATAL) << "Unknown caffe mode."; } -}; +} template inline Dtype Layer::Backward(const vector*>& top, @@ -115,7 +115,7 @@ inline Dtype Layer::Backward(const vector*>& top, default: LOG(FATAL) << "Unknown caffe mode."; } -}; +} template void Layer::ToProto(LayerParameter* param, bool write_diff) { diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 684d6c5a018..b5a57b3c5a4 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -22,8 +22,8 @@ namespace caffe { template class Net { public: - Net(const NetParameter& param); - Net(const string& param_file); + explicit Net(const NetParameter& param); + explicit Net(const string& param_file); virtual ~Net() {} // Initialize a network with the network parameter. diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 25ba3b68927..a5dafe61ae4 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -3,6 +3,7 @@ #ifndef CAFFE_OPTIMIZATION_SOLVER_HPP_ #define CAFFE_OPTIMIZATION_SOLVER_HPP_ +#include #include namespace caffe { @@ -66,6 +67,6 @@ class SGDSolver : public Solver { }; -} // namspace caffe +} // namespace caffe #endif // CAFFE_OPTIMIZATION_SOLVER_HPP_ diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp new file mode 100644 index 00000000000..fd6719a6820 --- /dev/null +++ b/include/caffe/util/benchmark.hpp @@ -0,0 +1,39 @@ +// Copyright 2014 kloud@github + +#ifndef CAFFE_UTIL_BENCHMARK_H_ +#define CAFFE_UTIL_BENCHMARK_H_ + +#include +#include + +namespace caffe { + +class Timer { + public: + Timer(); + virtual ~Timer(); + void Start(); + void Stop(); + float MilliSeconds(); + float Seconds(); + + inline bool initted() { return initted_; } + inline bool running() { return running_; } + inline bool has_run_at_least_once() { return has_run_at_least_once_; } + + protected: + void Init(); + + bool initted_; + bool running_; + bool has_run_at_least_once_; + cudaEvent_t start_gpu_; + cudaEvent_t stop_gpu_; + boost::posix_time::ptime start_cpu_; + boost::posix_time::ptime stop_cpu_; + float elapsed_milliseconds_; +}; + +} // namespace caffe + +#endif // CAFFE_UTIL_BENCHMARK_H_ diff --git a/include/caffe/util/im2col.hpp b/include/caffe/util/im2col.hpp index 83c01ddab53..17da49cddcf 100644 --- a/include/caffe/util/im2col.hpp +++ b/include/caffe/util/im2col.hpp @@ -7,23 +7,23 @@ namespace caffe { template void im2col_cpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_col); template void col2im_cpu(const Dtype* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - Dtype* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, Dtype* data_im); template void im2col_gpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_col); template void col2im_gpu(const Dtype* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - Dtype* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, Dtype* data_im); } // namespace caffe diff --git a/include/caffe/util/insert_splits.hpp b/include/caffe/util/insert_splits.hpp index d0df85650c9..37972b34829 100644 --- a/include/caffe/util/insert_splits.hpp +++ b/include/caffe/util/insert_splits.hpp @@ -3,6 +3,8 @@ #ifndef _CAFFE_UTIL_INSERT_SPLITS_HPP_ #define _CAFFE_UTIL_INSERT_SPLITS_HPP_ +#include + #include "caffe/proto/caffe.pb.h" using std::pair; diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 3174fd0d5fc..7bf78977d6d 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -3,13 +3,15 @@ #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ -#include - #include -#include "caffe/blob.hpp" +#include "google/protobuf/message.h" +#include "hdf5.h" +#include "hdf5_hl.h" #include "caffe/proto/caffe.pb.h" +#include "caffe/blob.hpp" + using std::string; using ::google::protobuf::Message; @@ -48,6 +50,16 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, datum); } +template +void hdf5_load_nd_dataset_helper( + hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, + Blob* blob); + +template +void hdf5_load_nd_dataset( + hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, + Blob* blob); + } // namespace caffe #endif // CAFFE_UTIL_IO_H_ diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 7b0b77a45cf..622556396c1 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -3,11 +3,15 @@ #ifndef CAFFE_VISION_LAYERS_HPP_ #define CAFFE_VISION_LAYERS_HPP_ -#include -#include - +#include +#include #include +#include "leveldb/db.h" +#include "pthread.h" +#include "boost/scoped_ptr.hpp" +#include "hdf5.h" + #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" @@ -272,9 +276,9 @@ class Im2colLayer : public Layer { int CHANNELS_; int HEIGHT_; int WIDTH_; + int PAD_; }; - template class PoolingLayer : public Layer { public: @@ -326,6 +330,7 @@ class ConvolutionLayer : public Layer { int STRIDE_; int NUM_; int CHANNELS_; + int PAD_; int HEIGHT_; int WIDTH_; int NUM_OUTPUT_; @@ -338,6 +343,32 @@ class ConvolutionLayer : public Layer { int N_; }; +template +class ConcatLayer : public Layer { + public: + explicit ConcatLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + virtual Dtype Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + Blob col_bob_; + + int COUNT_; + int NUM_; + int CHANNELS_; + int HEIGHT_; + int WIDTH_; + int concat_dim_; +}; // This function is used to create a pthread that prefetches the data. template @@ -384,7 +415,7 @@ void* ImagesLayerPrefetch(void* layer_pointer); template class ImagesLayer : public Layer { // The function used to perform prefetching. - friend void* ImagesLayerPrefetch(void* layer_pointer); + friend void* ImagesLayerPrefetch(void* layer_pointer); public: explicit ImagesLayer(const LayerParameter& param) @@ -416,6 +447,36 @@ class ImagesLayer : public Layer { }; +template +class HDF5DataLayer : public Layer { + public: + explicit HDF5DataLayer(const LayerParameter& param) + : Layer(param) {} + virtual ~HDF5DataLayer(); + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + virtual Dtype Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + virtual void load_hdf5_file_data(const char* filename); + + std::vector hdf_filenames_; + unsigned int num_files_; + unsigned int current_file_; + hsize_t current_row_; + + Blob data_blob_; + Blob label_blob_; +}; + + template class SoftmaxLayer : public Layer { public: @@ -563,4 +624,3 @@ class AccuracyLayer : public Layer { } // namespace caffe #endif // CAFFE_VISION_LAYERS_HPP_ - diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index d137b31e812..ddbacca1579 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -4,12 +4,15 @@ // caffe::Caffe functions so that one could easily call it from matlab. // Note that for matlab, we will simply use float as the data type. +#include +#include + #include "mex.h" #include "caffe/caffe.hpp" #define MEX_ARGS int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) // The pointer to the internal caffe::Net instance static shared_ptr > net_; @@ -21,8 +24,8 @@ static shared_ptr > net_; // matlab uses RGB color channel order // images need to have the data mean subtracted // -// Data coming in from matlab needs to be in the order -// [batch_images, channels, height, width] +// Data coming in from matlab needs to be in the order +// [batch_images, channels, height, width] // where width is the fastest dimension. // Here is the rough matlab for putting image data into the correct // format: @@ -38,14 +41,14 @@ static shared_ptr > net_; // If you have multiple images, cat them with cat(4, ...) // // The actual forward function. It takes in a cell array of 4-D arrays as -// input and outputs a cell array. +// input and outputs a cell array. static mxArray* do_forward(const mxArray* const bottom) { vector*>& input_blobs = net_->input_blobs(); - CHECK_EQ(static_cast(mxGetDimensions(bottom)[0]), + CHECK_EQ(static_cast(mxGetDimensions(bottom)[0]), input_blobs.size()); for (unsigned int i = 0; i < input_blobs.size(); ++i) { const mxArray* const elem = mxGetCell(bottom, i); - const float* const data_ptr = + const float* const data_ptr = reinterpret_cast(mxGetPr(elem)); switch (Caffe::mode()) { case Caffe::CPU: @@ -63,7 +66,7 @@ static mxArray* do_forward(const mxArray* const bottom) { const vector*>& output_blobs = net_->ForwardPrefilled(); mxArray* mx_out = mxCreateCellMatrix(output_blobs.size(), 1); for (unsigned int i = 0; i < output_blobs.size(); ++i) { - mxArray* mx_blob = mxCreateNumericMatrix(output_blobs[i]->count(), + mxArray* mx_blob = mxCreateNumericMatrix(output_blobs[i]->count(), 1, mxSINGLE_CLASS, mxREAL); mxSetCell(mx_out, i, mx_blob); float* data_ptr = reinterpret_cast(mxGetPr(mx_blob)); @@ -85,30 +88,30 @@ static mxArray* do_forward(const mxArray* const bottom) { } // The caffe::Caffe utility functions. -static void set_mode_cpu(MEX_ARGS) { - Caffe::set_mode(Caffe::CPU); +static void set_mode_cpu(MEX_ARGS) { + Caffe::set_mode(Caffe::CPU); } -static void set_mode_gpu(MEX_ARGS) { - Caffe::set_mode(Caffe::GPU); +static void set_mode_gpu(MEX_ARGS) { + Caffe::set_mode(Caffe::GPU); } -static void set_phase_train(MEX_ARGS) { - Caffe::set_phase(Caffe::TRAIN); +static void set_phase_train(MEX_ARGS) { + Caffe::set_phase(Caffe::TRAIN); } -static void set_phase_test(MEX_ARGS) { - Caffe::set_phase(Caffe::TEST); +static void set_phase_test(MEX_ARGS) { + Caffe::set_phase(Caffe::TEST); } -static void set_device(MEX_ARGS) { +static void set_device(MEX_ARGS) { if (nrhs != 1) { LOG(ERROR) << "Only given " << nrhs << " arguments"; mexErrMsgTxt("Wrong number of arguments"); } int device_id = static_cast(mxGetScalar(prhs[0])); - Caffe::SetDevice(device_id); + Caffe::SetDevice(device_id); } static void init(MEX_ARGS) { diff --git a/matlab/caffe/matcaffe_demo.m b/matlab/caffe/matcaffe_demo.m index 3eb4f107cef..8b13e07a7bb 100644 --- a/matlab/caffe/matcaffe_demo.m +++ b/matlab/caffe/matcaffe_demo.m @@ -1,6 +1,6 @@ function scores = matcaffe_demo(im, use_gpu) % scores = matcaffe_demo(im, use_gpu) -% +% % Demo of the matlab wrapper using the ILSVRC network. % % input @@ -16,13 +16,13 @@ % Or the equivalent based on where things are installed on your system % % Usage: -% im = imread('../../examples/cat.jpg'); +% im = imread('../../examples/images/cat.jpg'); % scores = matcaffe_demo(im, 1); % [score, class] = max(scores); -model_def_file = '../../examples/imagenet_deploy.prototxt'; +model_def_file = '../../examples/imagenet/imagenet_deploy.prototxt'; % NOTE: you'll have to get the pre-trained ILSVRC network -model_file = '../../examples/alexnet_train_iter_470000'; +model_file = '../../examples/imagenet/caffe_reference_imagenet_model'; % init caffe network (spews logging info) caffe('init', model_def_file, model_file); diff --git a/models/.gitignore b/models/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/models/get_caffe_reference_imagenet_model.sh b/models/get_caffe_reference_imagenet_model.sh deleted file mode 100755 index af60cb6b01b..00000000000 --- a/models/get_caffe_reference_imagenet_model.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env sh -# This scripts downloads the caffe reference imagenet model -# for ilsvrc image classification and deep feature extraction - -echo "Downloading..." - -wget -q https://www.dropbox.com/s/n3jups0gr7uj0dv/caffe_reference_imagenet_model - -echo "Done. Please check that the checksum = bf44bac4a59aa7792b296962fe483f2b." diff --git a/python/caffe/__init__.py b/python/caffe/__init__.py index 9dd0ebf1abf..b906d3e6ae9 100644 --- a/python/caffe/__init__.py +++ b/python/caffe/__init__.py @@ -1 +1 @@ -from .pycaffe import * +from .pycaffe import Net diff --git a/python/caffe/pycaffe.cpp b/python/caffe/_caffe.cpp similarity index 68% rename from python/caffe/pycaffe.cpp rename to python/caffe/_caffe.cpp index 1beec163c8f..137cc283571 100644 --- a/python/caffe/pycaffe.cpp +++ b/python/caffe/_caffe.cpp @@ -5,9 +5,15 @@ #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION -#include -#include -#include +#include "boost/python.hpp" +#include "boost/python/suite/indexing/vector_indexing_suite.hpp" +#include "numpy/arrayobject.h" + +// these need to be included after boost on OS X +#include // NOLINT(build/include_order) +#include // NOLINT(build/include_order) +#include // NOLINT + #include "caffe/caffe.hpp" // Temporary solution for numpy < 1.7 versions: old macro, no promises. @@ -18,7 +24,7 @@ #endif -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) using boost::python::extract; using boost::python::len; using boost::python::list; @@ -31,26 +37,24 @@ using boost::python::vector_indexing_suite; // to Python class CaffeBlob { public: + CaffeBlob(const shared_ptr > &blob, const string& name) + : blob_(blob), name_(name) {} - CaffeBlob(const shared_ptr > &blob) - : blob_(blob) {} - - CaffeBlob() - {} - + string name() const { return name_; } int num() const { return blob_->num(); } int channels() const { return blob_->channels(); } int height() const { return blob_->height(); } int width() const { return blob_->width(); } int count() const { return blob_->count(); } - bool operator == (const CaffeBlob &other) - { + // this is here only to satisfy boost's vector_indexing_suite + bool operator == (const CaffeBlob &other) { return this->blob_ == other.blob_; } protected: shared_ptr > blob_; + string name_; }; @@ -59,14 +63,10 @@ class CaffeBlob { // is not freed while still being used in Python class CaffeBlobWrap : public CaffeBlob { public: - CaffeBlobWrap(PyObject *p, shared_ptr > &blob) - : CaffeBlob(blob), self_(p) {} - CaffeBlobWrap(PyObject *p, const CaffeBlob &blob) : CaffeBlob(blob), self_(p) {} - object get_data() - { + object get_data() { npy_intp dims[] = {num(), channels(), height(), width()}; PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, @@ -78,8 +78,7 @@ class CaffeBlobWrap : public CaffeBlob { return object(h); } - object get_diff() - { + object get_diff() { npy_intp dims[] = {num(), channels(), height(), width()}; PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, @@ -96,11 +95,51 @@ class CaffeBlobWrap : public CaffeBlob { }; +class CaffeLayer { + public: + CaffeLayer(const shared_ptr > &layer, const string &name) + : layer_(layer), name_(name) {} + + string name() const { return name_; } + vector blobs() { + vector result; + for (int i = 0; i < layer_->blobs().size(); ++i) { + result.push_back(CaffeBlob(layer_->blobs()[i], name_)); + } + return result; + } + + // this is here only to satisfy boost's vector_indexing_suite + bool operator == (const CaffeLayer &other) { + return this->layer_ == other.layer_; + } + + protected: + shared_ptr > layer_; + string name_; +}; + // A simple wrapper over CaffeNet that runs the forward process. -struct CaffeNet -{ +struct CaffeNet { CaffeNet(string param_file, string pretrained_param_file) { + // for convenience, check that the input files can be opened, and raise + // an exception that boost will send to Python if not + // (this function could still crash if the input files are disturbed + // before Net construction) + std::ifstream f(param_file.c_str()); + if (!f.good()) { + f.close(); + throw std::runtime_error("Could not open file " + param_file); + } + f.close(); + f.open(pretrained_param_file.c_str()); + if (!f.good()) { + f.close(); + throw std::runtime_error("Could not open file " + pretrained_param_file); + } + f.close(); + net_.reset(new Net(param_file)); net_->CopyTrainedLayersFrom(pretrained_param_file); } @@ -121,7 +160,8 @@ struct CaffeNet // The actual forward function. It takes in a python list of numpy arrays as // input and a python list of numpy arrays as output. The input and output - // should all have correct shapes, are single-precisionabcdnt- and c contiguous. + // should all have correct shapes, are single-precisionabcdnt- and + // c contiguous. void Forward(list bottom, list top) { vector*>& input_blobs = net_->input_blobs(); CHECK_EQ(len(bottom), input_blobs.size()); @@ -144,9 +184,9 @@ struct CaffeNet LOG(FATAL) << "Unknown Caffe mode."; } // switch (Caffe::mode()) } - //LOG(INFO) << "Start"; + // LOG(INFO) << "Start"; const vector*>& output_blobs = net_->ForwardPrefilled(); - //LOG(INFO) << "End"; + // LOG(INFO) << "End"; for (int i = 0; i < output_blobs.size(); ++i) { object elem = top[i]; PyArrayObject* arr = reinterpret_cast(elem.ptr()); @@ -189,9 +229,9 @@ struct CaffeNet LOG(FATAL) << "Unknown Caffe mode."; } // switch (Caffe::mode()) } - //LOG(INFO) << "Start"; + // LOG(INFO) << "Start"; net_->Backward(); - //LOG(INFO) << "End"; + // LOG(INFO) << "End"; for (int i = 0; i < input_blobs.size(); ++i) { object elem = bottom_diff[i]; PyArrayObject* arr = reinterpret_cast(elem.ptr()); @@ -211,6 +251,10 @@ struct CaffeNet } } + void ForwardPrefilled() { + net_->ForwardPrefilled(); + } + // The caffe::Caffe utility functions. void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } @@ -219,50 +263,63 @@ struct CaffeNet void set_device(int device_id) { Caffe::SetDevice(device_id); } vector blobs() { - return vector(net_->blobs().begin(), net_->blobs().end()); + vector result; + for (int i = 0; i < net_->blobs().size(); ++i) { + result.push_back(CaffeBlob(net_->blobs()[i], net_->blob_names()[i])); + } + return result; } - vector params() { - return vector(net_->params().begin(), net_->params().end()); + vector layers() { + vector result; + for (int i = 0; i < net_->layers().size(); ++i) { + result.push_back(CaffeLayer(net_->layers()[i], net_->layer_names()[i])); + } + return result; } // The pointer to the internal caffe::Net instant. - shared_ptr > net_; + shared_ptr > net_; }; // The boost python module definition. -BOOST_PYTHON_MODULE(pycaffe) -{ - +BOOST_PYTHON_MODULE(_caffe) { boost::python::class_( "CaffeNet", boost::python::init()) - .def("Forward", &CaffeNet::Forward) - .def("Backward", &CaffeNet::Backward) - .def("set_mode_cpu", &CaffeNet::set_mode_cpu) - .def("set_mode_gpu", &CaffeNet::set_mode_gpu) - .def("set_phase_train", &CaffeNet::set_phase_train) - .def("set_phase_test", &CaffeNet::set_phase_test) - .def("set_device", &CaffeNet::set_device) - .def("blobs", &CaffeNet::blobs) - .def("params", &CaffeNet::params) - ; + .def("Forward", &CaffeNet::Forward) + .def("ForwardPrefilled", &CaffeNet::ForwardPrefilled) + .def("Backward", &CaffeNet::Backward) + .def("set_mode_cpu", &CaffeNet::set_mode_cpu) + .def("set_mode_gpu", &CaffeNet::set_mode_gpu) + .def("set_phase_train", &CaffeNet::set_phase_train) + .def("set_phase_test", &CaffeNet::set_phase_test) + .def("set_device", &CaffeNet::set_device) + .add_property("blobs", &CaffeNet::blobs) + .add_property("layers", &CaffeNet::layers); boost::python::class_( "CaffeBlob", boost::python::no_init) + .add_property("name", &CaffeBlob::name) .add_property("num", &CaffeBlob::num) .add_property("channels", &CaffeBlob::channels) .add_property("height", &CaffeBlob::height) .add_property("width", &CaffeBlob::width) .add_property("count", &CaffeBlob::count) .add_property("data", &CaffeBlobWrap::get_data) - .add_property("diff", &CaffeBlobWrap::get_diff) - ; + .add_property("diff", &CaffeBlobWrap::get_diff); + + boost::python::class_( + "CaffeLayer", boost::python::no_init) + .add_property("name", &CaffeLayer::name) + .add_property("blobs", &CaffeLayer::blobs); boost::python::class_ >("BlobVec") .def(vector_indexing_suite, true>()); - import_array(); + boost::python::class_ >("LayerVec") + .def(vector_indexing_suite, true>()); + import_array(); } diff --git a/python/caffe/detection/detector.py b/python/caffe/detection/detector.py index 1dcb797c95c..9355274c85f 100644 --- a/python/caffe/detection/detector.py +++ b/python/caffe/detection/detector.py @@ -332,7 +332,7 @@ def config(model_def, pretrained_model, gpu, image_dim, image_mean_file): # Initialize network by loading model definition and weights. t = time.time() print("Loading Caffe model.") - NET = caffe.CaffeNet(model_def, pretrained_model) + NET = caffe.Net(model_def, pretrained_model) NET.set_phase_test() if gpu: NET.set_mode_gpu() @@ -340,7 +340,7 @@ def config(model_def, pretrained_model, gpu, image_dim, image_mean_file): # Configure for input/output data IMAGE_DIM = image_dim - CROPPED_DIM = NET.blobs()[0].width + CROPPED_DIM = NET.blobs.values()[0].width IMAGE_CENTER = int((IMAGE_DIM - CROPPED_DIM) / 2) # Load the data set mean file @@ -349,8 +349,8 @@ def config(model_def, pretrained_model, gpu, image_dim, image_mean_file): CROPPED_IMAGE_MEAN = IMAGE_MEAN[IMAGE_CENTER:IMAGE_CENTER + CROPPED_DIM, IMAGE_CENTER:IMAGE_CENTER + CROPPED_DIM, :] - BATCH_SIZE = NET.blobs()[0].num # network batch size - NUM_OUTPUT = NET.blobs()[-1].channels # number of output classes + BATCH_SIZE = NET.blobs.values()[0].num # network batch size + NUM_OUTPUT = NET.blobs.values()[-1].channels # number of output classes if __name__ == "__main__": @@ -371,12 +371,12 @@ def config(model_def, pretrained_model, gpu, image_dim, image_mean_file): # Optional arguments. parser.add_argument( "--model_def", - default="examples/imagenet_deploy.prototxt", + default="../../../examples/imagenet/imagenet_deploy.prototxt", help="Model definition file." ) parser.add_argument( "--pretrained_model", - default="examples/caffe_reference_imagenet_model", + default="../../../examples/imagenet/caffe_reference_imagenet_model", help="Trained model weights file." ) parser.add_argument( diff --git a/python/caffe/imagenet/wrapper.py b/python/caffe/imagenet/wrapper.py index c29f1ab5b8a..4a5b6ed8df4 100644 --- a/python/caffe/imagenet/wrapper.py +++ b/python/caffe/imagenet/wrapper.py @@ -76,7 +76,7 @@ def __init__(self, model_def_file, pretrained_model, center_only=False, num = 1 else: num = 10 - self.caffenet = caffe.CaffeNet(model_def_file, pretrained_model) + self.caffenet = caffe.Net(model_def_file, pretrained_model) self._output_blobs = [np.empty((num, num_output, 1, 1), dtype=np.float32)] self._center_only = center_only diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py new file mode 100644 index 00000000000..8fbbcf9aac9 --- /dev/null +++ b/python/caffe/pycaffe.py @@ -0,0 +1,28 @@ +""" +Wrap the internal caffe C++ module (_caffe.so) with a clean, Pythonic +interface. +""" + +from ._caffe import CaffeNet +from collections import OrderedDict + +class Net(CaffeNet): + """ + The direct Python interface to caffe, exposing Forward and Backward + passes, data, gradients, and layer parameters + """ + def __init__(self, param_file, pretrained_param_file): + super(Net, self).__init__(param_file, pretrained_param_file) + self._blobs = OrderedDict([(bl.name, bl) + for bl in super(Net, self).blobs]) + self.params = OrderedDict([(lr.name, lr.blobs) + for lr in super(Net, self).layers + if len(lr.blobs) > 0]) + + @property + def blobs(self): + """ + An OrderedDict (bottom to top, i.e., input to output) of network + blobs indexed by name + """ + return self._blobs diff --git a/scripts/build_docs.sh b/scripts/build_docs.sh new file mode 100755 index 00000000000..1d4f16a40a5 --- /dev/null +++ b/scripts/build_docs.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +echo "usage: build_docs.sh [port]" +PORT=4000 +if [ $# -gt 0 ]; then + PORT=$1 +fi +jekyll serve -w -s docs/ -d docs/_site --port $PORT diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py new file mode 100755 index 00000000000..f7898d8f764 --- /dev/null +++ b/scripts/cpp_lint.py @@ -0,0 +1,4760 @@ +#!/usr/bin/python +# +# Copyright (c) 2009 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Does google-lint on c++ files. + +The goal of this script is to identify places in the code that *may* +be in non-compliance with google style. It does not attempt to fix +up these problems -- the point is to educate. It does also not +attempt to find all problems, or to ensure that everything it does +find is legitimately a problem. + +In particular, we can get very confused by /* and // inside strings! +We do a small hack, which is to ignore //'s with "'s after them on the +same line, but it is far from perfect (in either direction). +""" + +import codecs +import copy +import getopt +import math # for log +import os +import re +import sre_compile +import string +import sys +import unicodedata + + +_USAGE = """ +Syntax: cpp_lint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] + [--counting=total|toplevel|detailed] [--root=subdir] + [--linelength=digits] + [file] ... + + The style guidelines this tries to follow are those in + http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml + + Every problem is given a confidence score from 1-5, with 5 meaning we are + certain of the problem, and 1 meaning it could be a legitimate construct. + This will miss some errors, and is not a substitute for a code review. + + To suppress false-positive errors of a certain category, add a + 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) + suppresses errors of all categories on that line. + + The files passed in will be linted; at least one file must be provided. + Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the + extensions with the --extensions flag. + + Flags: + + output=vs7 + By default, the output is formatted to ease emacs parsing. Visual Studio + compatible output (vs7) may also be used. Other formats are unsupported. + + verbose=# + Specify a number 0-5 to restrict errors to certain verbosity levels. + + filter=-x,+y,... + Specify a comma-separated list of category-filters to apply: only + error messages whose category names pass the filters will be printed. + (Category names are printed with the message and look like + "[whitespace/indent]".) Filters are evaluated left to right. + "-FOO" and "FOO" means "do not print categories that start with FOO". + "+FOO" means "do print categories that start with FOO". + + Examples: --filter=-whitespace,+whitespace/braces + --filter=whitespace,runtime/printf,+runtime/printf_format + --filter=-,+build/include_what_you_use + + To see a list of all the categories used in cpplint, pass no arg: + --filter= + + counting=total|toplevel|detailed + The total number of errors found is always printed. If + 'toplevel' is provided, then the count of errors in each of + the top-level categories like 'build' and 'whitespace' will + also be printed. If 'detailed' is provided, then a count + is provided for each category like 'build/class'. + + root=subdir + The root directory used for deriving header guard CPP variable. + By default, the header guard CPP variable is calculated as the relative + path to the directory that contains .git, .hg, or .svn. When this flag + is specified, the relative path is calculated from the specified + directory. If the specified directory does not exist, this flag is + ignored. + + Examples: + Assuing that src/.git exists, the header guard CPP variables for + src/chrome/browser/ui/browser.h are: + + No flag => CHROME_BROWSER_UI_BROWSER_H_ + --root=chrome => BROWSER_UI_BROWSER_H_ + --root=chrome/browser => UI_BROWSER_H_ + + linelength=digits + This is the allowed line length for the project. The default value is + 80 characters. + + Examples: + --linelength=120 + + extensions=extension,extension,... + The allowed file extensions that cpplint will check + + Examples: + --extensions=hpp,cpp +""" + +# We categorize each error message we print. Here are the categories. +# We want an explicit list so we can list them all in cpplint --filter=. +# If you add a new error message with a new category, add it to the list +# here! cpplint_unittest.py should tell you if you forget to do this. +_ERROR_CATEGORIES = [ + 'build/class', + 'build/deprecated', + 'build/endif_comment', + 'build/explicit_make_pair', + 'build/forward_decl', + 'build/header_guard', + 'build/include', + 'build/include_alpha', + 'build/include_dir', + 'build/include_order', + 'build/include_what_you_use', + 'build/namespaces', + 'build/printf_format', + 'build/storage_class', + 'legal/copyright', + 'readability/alt_tokens', + 'readability/braces', + 'readability/casting', + 'readability/check', + 'readability/constructors', + 'readability/fn_size', + 'readability/function', + 'readability/multiline_comment', + 'readability/multiline_string', + 'readability/namespace', + 'readability/nolint', + 'readability/nul', + 'readability/streams', + 'readability/todo', + 'readability/utf8', + 'runtime/arrays', + 'runtime/casting', + 'runtime/explicit', + 'runtime/int', + 'runtime/init', + 'runtime/invalid_increment', + 'runtime/member_string_references', + 'runtime/memset', + 'runtime/operator', + 'runtime/printf', + 'runtime/printf_format', + 'runtime/references', + 'runtime/string', + 'runtime/threadsafe_fn', + 'runtime/vlog', + 'whitespace/blank_line', + 'whitespace/braces', + 'whitespace/comma', + 'whitespace/comments', + 'whitespace/empty_conditional_body', + 'whitespace/empty_loop_body', + 'whitespace/end_of_line', + 'whitespace/ending_newline', + 'whitespace/forcolon', + 'whitespace/indent', + 'whitespace/line_length', + 'whitespace/newline', + 'whitespace/operators', + 'whitespace/parens', + 'whitespace/semicolon', + 'whitespace/tab', + 'whitespace/todo' + ] + +# The default state of the category filter. This is overrided by the --filter= +# flag. By default all errors are on, so only add here categories that should be +# off by default (i.e., categories that must be enabled by the --filter= flags). +# All entries here should start with a '-' or '+', as in the --filter= flag. +_DEFAULT_FILTERS = [ + '-build/include_alpha', + '-build/include_dir', + '-readability/todo', + ] + +# We used to check for high-bit characters, but after much discussion we +# decided those were OK, as long as they were in UTF-8 and didn't represent +# hard-coded international strings, which belong in a separate i18n file. + + +# C++ headers +_CPP_HEADERS = frozenset([ + # Legacy + 'algobase.h', + 'algo.h', + 'alloc.h', + 'builtinbuf.h', + 'bvector.h', + 'complex.h', + 'defalloc.h', + 'deque.h', + 'editbuf.h', + 'fstream.h', + 'function.h', + 'hash_map', + 'hash_map.h', + 'hash_set', + 'hash_set.h', + 'hashtable.h', + 'heap.h', + 'indstream.h', + 'iomanip.h', + 'iostream.h', + 'istream.h', + 'iterator.h', + 'list.h', + 'map.h', + 'multimap.h', + 'multiset.h', + 'ostream.h', + 'pair.h', + 'parsestream.h', + 'pfstream.h', + 'procbuf.h', + 'pthread_alloc', + 'pthread_alloc.h', + 'rope', + 'rope.h', + 'ropeimpl.h', + 'set.h', + 'slist', + 'slist.h', + 'stack.h', + 'stdiostream.h', + 'stl_alloc.h', + 'stl_relops.h', + 'streambuf.h', + 'stream.h', + 'strfile.h', + 'strstream.h', + 'tempbuf.h', + 'tree.h', + 'type_traits.h', + 'vector.h', + # 17.6.1.2 C++ library headers + 'algorithm', + 'array', + 'atomic', + 'bitset', + 'chrono', + 'codecvt', + 'complex', + 'condition_variable', + 'deque', + 'exception', + 'forward_list', + 'fstream', + 'functional', + 'future', + 'initializer_list', + 'iomanip', + 'ios', + 'iosfwd', + 'iostream', + 'istream', + 'iterator', + 'limits', + 'list', + 'locale', + 'map', + 'memory', + 'mutex', + 'new', + 'numeric', + 'ostream', + 'queue', + 'random', + 'ratio', + 'regex', + 'set', + 'sstream', + 'stack', + 'stdexcept', + 'streambuf', + 'string', + 'strstream', + 'system_error', + 'thread', + 'tuple', + 'typeindex', + 'typeinfo', + 'type_traits', + 'unordered_map', + 'unordered_set', + 'utility', + 'valarray', + 'vector', + # 17.6.1.2 C++ headers for C library facilities + 'cassert', + 'ccomplex', + 'cctype', + 'cerrno', + 'cfenv', + 'cfloat', + 'cinttypes', + 'ciso646', + 'climits', + 'clocale', + 'cmath', + 'csetjmp', + 'csignal', + 'cstdalign', + 'cstdarg', + 'cstdbool', + 'cstddef', + 'cstdint', + 'cstdio', + 'cstdlib', + 'cstring', + 'ctgmath', + 'ctime', + 'cuchar', + 'cwchar', + 'cwctype', + ]) + +# Assertion macros. These are defined in base/logging.h and +# testing/base/gunit.h. Note that the _M versions need to come first +# for substring matching to work. +_CHECK_MACROS = [ + 'DCHECK', 'CHECK', + 'EXPECT_TRUE_M', 'EXPECT_TRUE', + 'ASSERT_TRUE_M', 'ASSERT_TRUE', + 'EXPECT_FALSE_M', 'EXPECT_FALSE', + 'ASSERT_FALSE_M', 'ASSERT_FALSE', + ] + +# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE +_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS]) + +for op, replacement in [('==', 'EQ'), ('!=', 'NE'), + ('>=', 'GE'), ('>', 'GT'), + ('<=', 'LE'), ('<', 'LT')]: + _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement + _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement + _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement + _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement + _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement + _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement + +for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'), + ('>=', 'LT'), ('>', 'LE'), + ('<=', 'GT'), ('<', 'GE')]: + _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement + _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement + _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement + _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement + +# Alternative tokens and their replacements. For full list, see section 2.5 +# Alternative tokens [lex.digraph] in the C++ standard. +# +# Digraphs (such as '%:') are not included here since it's a mess to +# match those on a word boundary. +_ALT_TOKEN_REPLACEMENT = { + 'and': '&&', + 'bitor': '|', + 'or': '||', + 'xor': '^', + 'compl': '~', + 'bitand': '&', + 'and_eq': '&=', + 'or_eq': '|=', + 'xor_eq': '^=', + 'not': '!', + 'not_eq': '!=' + } + +# Compile regular expression that matches all the above keywords. The "[ =()]" +# bit is meant to avoid matching these keywords outside of boolean expressions. +# +# False positives include C-style multi-line comments and multi-line strings +# but those have always been troublesome for cpplint. +_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( + r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)') + + +# These constants define types of headers for use with +# _IncludeState.CheckNextIncludeOrder(). +_C_SYS_HEADER = 1 +_CPP_SYS_HEADER = 2 +_LIKELY_MY_HEADER = 3 +_POSSIBLE_MY_HEADER = 4 +_OTHER_HEADER = 5 + +# These constants define the current inline assembly state +_NO_ASM = 0 # Outside of inline assembly block +_INSIDE_ASM = 1 # Inside inline assembly block +_END_ASM = 2 # Last line of inline assembly block +_BLOCK_ASM = 3 # The whole block is an inline assembly block + +# Match start of assembly blocks +_MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)' + r'(?:\s+(volatile|__volatile__))?' + r'\s*[{(]') + + +_regexp_compile_cache = {} + +# Finds occurrences of NOLINT[_NEXT_LINE] or NOLINT[_NEXT_LINE](...). +_RE_SUPPRESSION = re.compile(r'\bNOLINT(_NEXT_LINE)?\b(\([^)]*\))?') + +# {str, set(int)}: a map from error categories to sets of linenumbers +# on which those errors are expected and should be suppressed. +_error_suppressions = {} + +# The root directory used for deriving header guard CPP variable. +# This is set by --root flag. +_root = None + +# The allowed line length of files. +# This is set by --linelength flag. +_line_length = 80 + +# The allowed extensions for file names +# This is set by --extensions flag. +_valid_extensions = set(['cc', 'h', 'cpp', 'hpp', 'cu', 'cuh']) + +def ParseNolintSuppressions(filename, raw_line, linenum, error): + """Updates the global list of error-suppressions. + + Parses any NOLINT comments on the current line, updating the global + error_suppressions store. Reports an error if the NOLINT comment + was malformed. + + Args: + filename: str, the name of the input file. + raw_line: str, the line of input text, with comments. + linenum: int, the number of the current line. + error: function, an error handler. + """ + # FIXME(adonovan): "NOLINT(" is misparsed as NOLINT(*). + matched = _RE_SUPPRESSION.search(raw_line) + if matched: + if matched.group(1) == '_NEXT_LINE': + linenum += 1 + category = matched.group(2) + if category in (None, '(*)'): # => "suppress all" + _error_suppressions.setdefault(None, set()).add(linenum) + else: + if category.startswith('(') and category.endswith(')'): + category = category[1:-1] + if category in _ERROR_CATEGORIES: + _error_suppressions.setdefault(category, set()).add(linenum) + else: + error(filename, linenum, 'readability/nolint', 5, + 'Unknown NOLINT error category: %s' % category) + + +def ResetNolintSuppressions(): + "Resets the set of NOLINT suppressions to empty." + _error_suppressions.clear() + + +def IsErrorSuppressedByNolint(category, linenum): + """Returns true if the specified error category is suppressed on this line. + + Consults the global error_suppressions map populated by + ParseNolintSuppressions/ResetNolintSuppressions. + + Args: + category: str, the category of the error. + linenum: int, the current line number. + Returns: + bool, True iff the error should be suppressed due to a NOLINT comment. + """ + return (linenum in _error_suppressions.get(category, set()) or + linenum in _error_suppressions.get(None, set())) + +def Match(pattern, s): + """Matches the string with the pattern, caching the compiled regexp.""" + # The regexp compilation caching is inlined in both Match and Search for + # performance reasons; factoring it out into a separate function turns out + # to be noticeably expensive. + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].match(s) + + +def ReplaceAll(pattern, rep, s): + """Replaces instances of pattern in a string with a replacement. + + The compiled regex is kept in a cache shared by Match and Search. + + Args: + pattern: regex pattern + rep: replacement text + s: search string + + Returns: + string with replacements made (or original string if no replacements) + """ + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].sub(rep, s) + + +def Search(pattern, s): + """Searches the string for the pattern, caching the compiled regexp.""" + if pattern not in _regexp_compile_cache: + _regexp_compile_cache[pattern] = sre_compile.compile(pattern) + return _regexp_compile_cache[pattern].search(s) + + +class _IncludeState(dict): + """Tracks line numbers for includes, and the order in which includes appear. + + As a dict, an _IncludeState object serves as a mapping between include + filename and line number on which that file was included. + + Call CheckNextIncludeOrder() once for each header in the file, passing + in the type constants defined above. Calls in an illegal order will + raise an _IncludeError with an appropriate error message. + + """ + # self._section will move monotonically through this set. If it ever + # needs to move backwards, CheckNextIncludeOrder will raise an error. + _INITIAL_SECTION = 0 + _MY_H_SECTION = 1 + _C_SECTION = 2 + _CPP_SECTION = 3 + _OTHER_H_SECTION = 4 + + _TYPE_NAMES = { + _C_SYS_HEADER: 'C system header', + _CPP_SYS_HEADER: 'C++ system header', + _LIKELY_MY_HEADER: 'header this file implements', + _POSSIBLE_MY_HEADER: 'header this file may implement', + _OTHER_HEADER: 'other header', + } + _SECTION_NAMES = { + _INITIAL_SECTION: "... nothing. (This can't be an error.)", + _MY_H_SECTION: 'a header this file implements', + _C_SECTION: 'C system header', + _CPP_SECTION: 'C++ system header', + _OTHER_H_SECTION: 'other header', + } + + def __init__(self): + dict.__init__(self) + self.ResetSection() + + def ResetSection(self): + # The name of the current section. + self._section = self._INITIAL_SECTION + # The path of last found header. + self._last_header = '' + + def SetLastHeader(self, header_path): + self._last_header = header_path + + def CanonicalizeAlphabeticalOrder(self, header_path): + """Returns a path canonicalized for alphabetical comparison. + + - replaces "-" with "_" so they both cmp the same. + - removes '-inl' since we don't require them to be after the main header. + - lowercase everything, just in case. + + Args: + header_path: Path to be canonicalized. + + Returns: + Canonicalized path. + """ + return header_path.replace('-inl.h', '.h').replace('-', '_').lower() + + def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): + """Check if a header is in alphabetical order with the previous header. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + header_path: Canonicalized header to be checked. + + Returns: + Returns true if the header is in alphabetical order. + """ + # If previous section is different from current section, _last_header will + # be reset to empty string, so it's always less than current header. + # + # If previous line was a blank line, assume that the headers are + # intentionally sorted the way they are. + if (self._last_header > header_path and + not Match(r'^\s*$', clean_lines.elided[linenum - 1])): + return False + return True + + def CheckNextIncludeOrder(self, header_type): + """Returns a non-empty error message if the next header is out of order. + + This function also updates the internal state to be ready to check + the next include. + + Args: + header_type: One of the _XXX_HEADER constants defined above. + + Returns: + The empty string if the header is in the right order, or an + error message describing what's wrong. + + """ + error_message = ('Found %s after %s' % + (self._TYPE_NAMES[header_type], + self._SECTION_NAMES[self._section])) + + last_section = self._section + + if header_type == _C_SYS_HEADER: + if self._section <= self._C_SECTION: + self._section = self._C_SECTION + else: + self._last_header = '' + return error_message + elif header_type == _CPP_SYS_HEADER: + if self._section <= self._CPP_SECTION: + self._section = self._CPP_SECTION + else: + self._last_header = '' + return error_message + elif header_type == _LIKELY_MY_HEADER: + if self._section <= self._MY_H_SECTION: + self._section = self._MY_H_SECTION + else: + self._section = self._OTHER_H_SECTION + elif header_type == _POSSIBLE_MY_HEADER: + if self._section <= self._MY_H_SECTION: + self._section = self._MY_H_SECTION + else: + # This will always be the fallback because we're not sure + # enough that the header is associated with this file. + self._section = self._OTHER_H_SECTION + else: + assert header_type == _OTHER_HEADER + self._section = self._OTHER_H_SECTION + + if last_section != self._section: + self._last_header = '' + + return '' + + +class _CppLintState(object): + """Maintains module-wide state..""" + + def __init__(self): + self.verbose_level = 1 # global setting. + self.error_count = 0 # global count of reported errors + # filters to apply when emitting error messages + self.filters = _DEFAULT_FILTERS[:] + self.counting = 'total' # In what way are we counting errors? + self.errors_by_category = {} # string to int dict storing error counts + + # output format: + # "emacs" - format that emacs can parse (default) + # "vs7" - format that Microsoft Visual Studio 7 can parse + self.output_format = 'emacs' + + def SetOutputFormat(self, output_format): + """Sets the output format for errors.""" + self.output_format = output_format + + def SetVerboseLevel(self, level): + """Sets the module's verbosity, and returns the previous setting.""" + last_verbose_level = self.verbose_level + self.verbose_level = level + return last_verbose_level + + def SetCountingStyle(self, counting_style): + """Sets the module's counting options.""" + self.counting = counting_style + + def SetFilters(self, filters): + """Sets the error-message filters. + + These filters are applied when deciding whether to emit a given + error message. + + Args: + filters: A string of comma-separated filters (eg "+whitespace/indent"). + Each filter should start with + or -; else we die. + + Raises: + ValueError: The comma-separated filters did not all start with '+' or '-'. + E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" + """ + # Default filters always have less priority than the flag ones. + self.filters = _DEFAULT_FILTERS[:] + for filt in filters.split(','): + clean_filt = filt.strip() + if clean_filt: + self.filters.append(clean_filt) + for filt in self.filters: + if not (filt.startswith('+') or filt.startswith('-')): + raise ValueError('Every filter in --filters must start with + or -' + ' (%s does not)' % filt) + + def ResetErrorCounts(self): + """Sets the module's error statistic back to zero.""" + self.error_count = 0 + self.errors_by_category = {} + + def IncrementErrorCount(self, category): + """Bumps the module's error statistic.""" + self.error_count += 1 + if self.counting in ('toplevel', 'detailed'): + if self.counting != 'detailed': + category = category.split('/')[0] + if category not in self.errors_by_category: + self.errors_by_category[category] = 0 + self.errors_by_category[category] += 1 + + def PrintErrorCounts(self): + """Print a summary of errors by category, and the total.""" + for category, count in self.errors_by_category.iteritems(): + sys.stderr.write('Category \'%s\' errors found: %d\n' % + (category, count)) + sys.stderr.write('Total errors found: %d\n' % self.error_count) + +_cpplint_state = _CppLintState() + + +def _OutputFormat(): + """Gets the module's output format.""" + return _cpplint_state.output_format + + +def _SetOutputFormat(output_format): + """Sets the module's output format.""" + _cpplint_state.SetOutputFormat(output_format) + + +def _VerboseLevel(): + """Returns the module's verbosity setting.""" + return _cpplint_state.verbose_level + + +def _SetVerboseLevel(level): + """Sets the module's verbosity, and returns the previous setting.""" + return _cpplint_state.SetVerboseLevel(level) + + +def _SetCountingStyle(level): + """Sets the module's counting options.""" + _cpplint_state.SetCountingStyle(level) + + +def _Filters(): + """Returns the module's list of output filters, as a list.""" + return _cpplint_state.filters + + +def _SetFilters(filters): + """Sets the module's error-message filters. + + These filters are applied when deciding whether to emit a given + error message. + + Args: + filters: A string of comma-separated filters (eg "whitespace/indent"). + Each filter should start with + or -; else we die. + """ + _cpplint_state.SetFilters(filters) + + +class _FunctionState(object): + """Tracks current function name and the number of lines in its body.""" + + _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. + _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. + + def __init__(self): + self.in_a_function = False + self.lines_in_function = 0 + self.current_function = '' + + def Begin(self, function_name): + """Start analyzing function body. + + Args: + function_name: The name of the function being tracked. + """ + self.in_a_function = True + self.lines_in_function = 0 + self.current_function = function_name + + def Count(self): + """Count line in current function body.""" + if self.in_a_function: + self.lines_in_function += 1 + + def Check(self, error, filename, linenum): + """Report if too many lines in function body. + + Args: + error: The function to call with any errors found. + filename: The name of the current file. + linenum: The number of the line to check. + """ + if Match(r'T(EST|est)', self.current_function): + base_trigger = self._TEST_TRIGGER + else: + base_trigger = self._NORMAL_TRIGGER + trigger = base_trigger * 2**_VerboseLevel() + + if self.lines_in_function > trigger: + error_level = int(math.log(self.lines_in_function / base_trigger, 2)) + # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... + if error_level > 5: + error_level = 5 + error(filename, linenum, 'readability/fn_size', error_level, + 'Small and focused functions are preferred:' + ' %s has %d non-comment lines' + ' (error triggered by exceeding %d lines).' % ( + self.current_function, self.lines_in_function, trigger)) + + def End(self): + """Stop analyzing function body.""" + self.in_a_function = False + + +class _IncludeError(Exception): + """Indicates a problem with the include order in a file.""" + pass + + +class FileInfo: + """Provides utility functions for filenames. + + FileInfo provides easy access to the components of a file's path + relative to the project root. + """ + + def __init__(self, filename): + self._filename = filename + + def FullName(self): + """Make Windows paths like Unix.""" + return os.path.abspath(self._filename).replace('\\', '/') + + def RepositoryName(self): + """FullName after removing the local path to the repository. + + If we have a real absolute path name here we can try to do something smart: + detecting the root of the checkout and truncating /path/to/checkout from + the name so that we get header guards that don't include things like + "C:\Documents and Settings\..." or "/home/username/..." in them and thus + people on different computers who have checked the source out to different + locations won't see bogus errors. + """ + fullname = self.FullName() + + if os.path.exists(fullname): + project_dir = os.path.dirname(fullname) + + if os.path.exists(os.path.join(project_dir, ".svn")): + # If there's a .svn file in the current directory, we recursively look + # up the directory tree for the top of the SVN checkout + root_dir = project_dir + one_up_dir = os.path.dirname(root_dir) + while os.path.exists(os.path.join(one_up_dir, ".svn")): + root_dir = os.path.dirname(root_dir) + one_up_dir = os.path.dirname(one_up_dir) + + prefix = os.path.commonprefix([root_dir, project_dir]) + return fullname[len(prefix) + 1:] + + # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by + # searching up from the current path. + root_dir = os.path.dirname(fullname) + while (root_dir != os.path.dirname(root_dir) and + not os.path.exists(os.path.join(root_dir, ".git")) and + not os.path.exists(os.path.join(root_dir, ".hg")) and + not os.path.exists(os.path.join(root_dir, ".svn"))): + root_dir = os.path.dirname(root_dir) + + if (os.path.exists(os.path.join(root_dir, ".git")) or + os.path.exists(os.path.join(root_dir, ".hg")) or + os.path.exists(os.path.join(root_dir, ".svn"))): + prefix = os.path.commonprefix([root_dir, project_dir]) + return fullname[len(prefix) + 1:] + + # Don't know what to do; header guard warnings may be wrong... + return fullname + + def Split(self): + """Splits the file into the directory, basename, and extension. + + For 'chrome/browser/browser.cc', Split() would + return ('chrome/browser', 'browser', '.cc') + + Returns: + A tuple of (directory, basename, extension). + """ + + googlename = self.RepositoryName() + project, rest = os.path.split(googlename) + return (project,) + os.path.splitext(rest) + + def BaseName(self): + """File base name - text after the final slash, before the final period.""" + return self.Split()[1] + + def Extension(self): + """File extension - text following the final period.""" + return self.Split()[2] + + def NoExtension(self): + """File has no source file extension.""" + return '/'.join(self.Split()[0:2]) + + def IsSource(self): + """File has a source file extension.""" + return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') + + +def _ShouldPrintError(category, confidence, linenum): + """If confidence >= verbose, category passes filter and is not suppressed.""" + + # There are three ways we might decide not to print an error message: + # a "NOLINT(category)" comment appears in the source, + # the verbosity level isn't high enough, or the filters filter it out. + if IsErrorSuppressedByNolint(category, linenum): + return False + if confidence < _cpplint_state.verbose_level: + return False + + is_filtered = False + for one_filter in _Filters(): + if one_filter.startswith('-'): + if category.startswith(one_filter[1:]): + is_filtered = True + elif one_filter.startswith('+'): + if category.startswith(one_filter[1:]): + is_filtered = False + else: + assert False # should have been checked for in SetFilter. + if is_filtered: + return False + + return True + + +def Error(filename, linenum, category, confidence, message): + """Logs the fact we've found a lint error. + + We log where the error was found, and also our confidence in the error, + that is, how certain we are this is a legitimate style regression, and + not a misidentification or a use that's sometimes justified. + + False positives can be suppressed by the use of + "cpplint(category)" comments on the offending line. These are + parsed into _error_suppressions. + + Args: + filename: The name of the file containing the error. + linenum: The number of the line containing the error. + category: A string used to describe the "category" this bug + falls under: "whitespace", say, or "runtime". Categories + may have a hierarchy separated by slashes: "whitespace/indent". + confidence: A number from 1-5 representing a confidence score for + the error, with 5 meaning that we are certain of the problem, + and 1 meaning that it could be a legitimate construct. + message: The error message. + """ + if _ShouldPrintError(category, confidence, linenum): + _cpplint_state.IncrementErrorCount(category) + if _cpplint_state.output_format == 'vs7': + sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + elif _cpplint_state.output_format == 'eclipse': + sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + else: + sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( + filename, linenum, message, category, confidence)) + + +# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. +_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( + r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') +# Matches strings. Escape codes should already be removed by ESCAPES. +_RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES = re.compile(r'"[^"]*"') +# Matches characters. Escape codes should already be removed by ESCAPES. +_RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES = re.compile(r"'.'") +# Matches multi-line C++ comments. +# This RE is a little bit more complicated than one might expect, because we +# have to take care of space removals tools so we can handle comments inside +# statements better. +# The current rule is: We only clear spaces from both sides when we're at the +# end of the line. Otherwise, we try to remove spaces from the right side, +# if this doesn't work we try on left side but only if there's a non-character +# on the right. +_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( + r"""(\s*/\*.*\*/\s*$| + /\*.*\*/\s+| + \s+/\*.*\*/(?=\W)| + /\*.*\*/)""", re.VERBOSE) + + +def IsCppString(line): + """Does line terminate so, that the next symbol is in string constant. + + This function does not consider single-line nor multi-line comments. + + Args: + line: is a partial line of code starting from the 0..n. + + Returns: + True, if next character appended to 'line' is inside a + string constant. + """ + + line = line.replace(r'\\', 'XX') # after this, \\" does not match to \" + return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 + + +def CleanseRawStrings(raw_lines): + """Removes C++11 raw strings from lines. + + Before: + static const char kData[] = R"( + multi-line string + )"; + + After: + static const char kData[] = "" + (replaced by blank line) + ""; + + Args: + raw_lines: list of raw lines. + + Returns: + list of lines with C++11 raw strings replaced by empty strings. + """ + + delimiter = None + lines_without_raw_strings = [] + for line in raw_lines: + if delimiter: + # Inside a raw string, look for the end + end = line.find(delimiter) + if end >= 0: + # Found the end of the string, match leading space for this + # line and resume copying the original lines, and also insert + # a "" on the last line. + leading_space = Match(r'^(\s*)\S', line) + line = leading_space.group(1) + '""' + line[end + len(delimiter):] + delimiter = None + else: + # Haven't found the end yet, append a blank line. + line = '' + + else: + # Look for beginning of a raw string. + # See 2.14.15 [lex.string] for syntax. + matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) + if matched: + delimiter = ')' + matched.group(2) + '"' + + end = matched.group(3).find(delimiter) + if end >= 0: + # Raw string ended on same line + line = (matched.group(1) + '""' + + matched.group(3)[end + len(delimiter):]) + delimiter = None + else: + # Start of a multi-line raw string + line = matched.group(1) + '""' + + lines_without_raw_strings.append(line) + + # TODO(unknown): if delimiter is not None here, we might want to + # emit a warning for unterminated string. + return lines_without_raw_strings + + +def FindNextMultiLineCommentStart(lines, lineix): + """Find the beginning marker for a multiline comment.""" + while lineix < len(lines): + if lines[lineix].strip().startswith('/*'): + # Only return this marker if the comment goes beyond this line + if lines[lineix].strip().find('*/', 2) < 0: + return lineix + lineix += 1 + return len(lines) + + +def FindNextMultiLineCommentEnd(lines, lineix): + """We are inside a comment, find the end marker.""" + while lineix < len(lines): + if lines[lineix].strip().endswith('*/'): + return lineix + lineix += 1 + return len(lines) + + +def RemoveMultiLineCommentsFromRange(lines, begin, end): + """Clears a range of lines for multi-line comments.""" + # Having // dummy comments makes the lines non-empty, so we will not get + # unnecessary blank line warnings later in the code. + for i in range(begin, end): + lines[i] = '// dummy' + + +def RemoveMultiLineComments(filename, lines, error): + """Removes multiline (c-style) comments from lines.""" + lineix = 0 + while lineix < len(lines): + lineix_begin = FindNextMultiLineCommentStart(lines, lineix) + if lineix_begin >= len(lines): + return + lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) + if lineix_end >= len(lines): + error(filename, lineix_begin + 1, 'readability/multiline_comment', 5, + 'Could not find end of multi-line comment') + return + RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) + lineix = lineix_end + 1 + + +def CleanseComments(line): + """Removes //-comments and single-line C-style /* */ comments. + + Args: + line: A line of C++ source. + + Returns: + The line with single-line comments removed. + """ + commentpos = line.find('//') + if commentpos != -1 and not IsCppString(line[:commentpos]): + line = line[:commentpos].rstrip() + # get rid of /* ... */ + return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line) + + +class CleansedLines(object): + """Holds 3 copies of all lines with different preprocessing applied to them. + + 1) elided member contains lines without strings and comments, + 2) lines member contains lines without comments, and + 3) raw_lines member contains all the lines without processing. + All these three members are of , and of the same length. + """ + + def __init__(self, lines): + self.elided = [] + self.lines = [] + self.raw_lines = lines + self.num_lines = len(lines) + self.lines_without_raw_strings = CleanseRawStrings(lines) + for linenum in range(len(self.lines_without_raw_strings)): + self.lines.append(CleanseComments( + self.lines_without_raw_strings[linenum])) + elided = self._CollapseStrings(self.lines_without_raw_strings[linenum]) + self.elided.append(CleanseComments(elided)) + + def NumLines(self): + """Returns the number of lines represented.""" + return self.num_lines + + @staticmethod + def _CollapseStrings(elided): + """Collapses strings and chars on a line to simple "" or '' blocks. + + We nix strings first so we're not fooled by text like '"http://"' + + Args: + elided: The line being processed. + + Returns: + The line with collapsed strings. + """ + if not _RE_PATTERN_INCLUDE.match(elided): + # Remove escaped characters first to make quote/single quote collapsing + # basic. Things that look like escaped characters shouldn't occur + # outside of strings and chars. + elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided) + elided = _RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES.sub("''", elided) + elided = _RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES.sub('""', elided) + return elided + + +def FindEndOfExpressionInLine(line, startpos, depth, startchar, endchar): + """Find the position just after the matching endchar. + + Args: + line: a CleansedLines line. + startpos: start searching at this position. + depth: nesting level at startpos. + startchar: expression opening character. + endchar: expression closing character. + + Returns: + On finding matching endchar: (index just after matching endchar, 0) + Otherwise: (-1, new depth at end of this line) + """ + for i in xrange(startpos, len(line)): + if line[i] == startchar: + depth += 1 + elif line[i] == endchar: + depth -= 1 + if depth == 0: + return (i + 1, 0) + return (-1, depth) + + +def CloseExpression(clean_lines, linenum, pos): + """If input points to ( or { or [ or <, finds the position that closes it. + + If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the + linenum/pos that correspond to the closing of the expression. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + pos: A position on the line. + + Returns: + A tuple (line, linenum, pos) pointer *past* the closing brace, or + (line, len(lines), -1) if we never find a close. Note we ignore + strings and comments when matching; and the line we return is the + 'cleansed' line at linenum. + """ + + line = clean_lines.elided[linenum] + startchar = line[pos] + if startchar not in '({[<': + return (line, clean_lines.NumLines(), -1) + if startchar == '(': endchar = ')' + if startchar == '[': endchar = ']' + if startchar == '{': endchar = '}' + if startchar == '<': endchar = '>' + + # Check first line + (end_pos, num_open) = FindEndOfExpressionInLine( + line, pos, 0, startchar, endchar) + if end_pos > -1: + return (line, linenum, end_pos) + + # Continue scanning forward + while linenum < clean_lines.NumLines() - 1: + linenum += 1 + line = clean_lines.elided[linenum] + (end_pos, num_open) = FindEndOfExpressionInLine( + line, 0, num_open, startchar, endchar) + if end_pos > -1: + return (line, linenum, end_pos) + + # Did not find endchar before end of file, give up + return (line, clean_lines.NumLines(), -1) + + +def FindStartOfExpressionInLine(line, endpos, depth, startchar, endchar): + """Find position at the matching startchar. + + This is almost the reverse of FindEndOfExpressionInLine, but note + that the input position and returned position differs by 1. + + Args: + line: a CleansedLines line. + endpos: start searching at this position. + depth: nesting level at endpos. + startchar: expression opening character. + endchar: expression closing character. + + Returns: + On finding matching startchar: (index at matching startchar, 0) + Otherwise: (-1, new depth at beginning of this line) + """ + for i in xrange(endpos, -1, -1): + if line[i] == endchar: + depth += 1 + elif line[i] == startchar: + depth -= 1 + if depth == 0: + return (i, 0) + return (-1, depth) + + +def ReverseCloseExpression(clean_lines, linenum, pos): + """If input points to ) or } or ] or >, finds the position that opens it. + + If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the + linenum/pos that correspond to the opening of the expression. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + pos: A position on the line. + + Returns: + A tuple (line, linenum, pos) pointer *at* the opening brace, or + (line, 0, -1) if we never find the matching opening brace. Note + we ignore strings and comments when matching; and the line we + return is the 'cleansed' line at linenum. + """ + line = clean_lines.elided[linenum] + endchar = line[pos] + if endchar not in ')}]>': + return (line, 0, -1) + if endchar == ')': startchar = '(' + if endchar == ']': startchar = '[' + if endchar == '}': startchar = '{' + if endchar == '>': startchar = '<' + + # Check last line + (start_pos, num_open) = FindStartOfExpressionInLine( + line, pos, 0, startchar, endchar) + if start_pos > -1: + return (line, linenum, start_pos) + + # Continue scanning backward + while linenum > 0: + linenum -= 1 + line = clean_lines.elided[linenum] + (start_pos, num_open) = FindStartOfExpressionInLine( + line, len(line) - 1, num_open, startchar, endchar) + if start_pos > -1: + return (line, linenum, start_pos) + + # Did not find startchar before beginning of file, give up + return (line, 0, -1) + + +def CheckForCopyright(filename, lines, error): + """Logs an error if no Copyright message appears at the top of the file.""" + + # We'll say it should occur by line 10. Don't forget there's a + # dummy line at the front. + for line in xrange(1, min(len(lines), 11)): + if re.search(r'Copyright', lines[line], re.I): break + else: # means no copyright line was found + error(filename, 0, 'legal/copyright', 5, + 'No copyright message found. ' + 'You should have a line: "Copyright [year] "') + + +def GetHeaderGuardCPPVariable(filename): + """Returns the CPP variable that should be used as a header guard. + + Args: + filename: The name of a C++ header file. + + Returns: + The CPP variable that should be used as a header guard in the + named file. + + """ + + # Restores original filename in case that cpplint is invoked from Emacs's + # flymake. + filename = re.sub(r'_flymake\.h$', '.h', filename) + filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) + + fileinfo = FileInfo(filename) + file_path_from_root = fileinfo.RepositoryName() + if _root: + file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) + return re.sub(r'[-./\s]', '_', file_path_from_root).upper() + '_' + + +def CheckForHeaderGuard(filename, lines, error): + """Checks that the file contains a header guard. + + Logs an error if no #ifndef header guard is present. For other + headers, checks that the full pathname is used. + + Args: + filename: The name of the C++ header file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + + cppvar = GetHeaderGuardCPPVariable(filename) + + ifndef = None + ifndef_linenum = 0 + define = None + endif = None + endif_linenum = 0 + for linenum, line in enumerate(lines): + linesplit = line.split() + if len(linesplit) >= 2: + # find the first occurrence of #ifndef and #define, save arg + if not ifndef and linesplit[0] == '#ifndef': + # set ifndef to the header guard presented on the #ifndef line. + ifndef = linesplit[1] + ifndef_linenum = linenum + if not define and linesplit[0] == '#define': + define = linesplit[1] + # find the last occurrence of #endif, save entire line + if line.startswith('#endif'): + endif = line + endif_linenum = linenum + + if not ifndef: + error(filename, 0, 'build/header_guard', 5, + 'No #ifndef header guard found, suggested CPP variable is: %s' % + cppvar) + return + + if not define: + error(filename, 0, 'build/header_guard', 5, + 'No #define header guard found, suggested CPP variable is: %s' % + cppvar) + return + + # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ + # for backward compatibility. + if ifndef != cppvar: + error_level = 0 + if ifndef != cppvar + '_': + error_level = 5 + + ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum, + error) + error(filename, ifndef_linenum, 'build/header_guard', error_level, + '#ifndef header guard has wrong style, please use: %s' % cppvar) + + if define != ifndef: + error(filename, 0, 'build/header_guard', 5, + '#ifndef and #define don\'t match, suggested CPP variable is: %s' % + cppvar) + return + + if endif != ('#endif // %s' % cppvar): + error_level = 0 + if endif != ('#endif // %s' % (cppvar + '_')): + error_level = 5 + + ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum, + error) + error(filename, endif_linenum, 'build/header_guard', error_level, + '#endif line should be "#endif // %s"' % cppvar) + + +def CheckForBadCharacters(filename, lines, error): + """Logs an error for each line containing bad characters. + + Two kinds of bad characters: + + 1. Unicode replacement characters: These indicate that either the file + contained invalid UTF-8 (likely) or Unicode replacement characters (which + it shouldn't). Note that it's possible for this to throw off line + numbering if the invalid UTF-8 occurred adjacent to a newline. + + 2. NUL bytes. These are problematic for some tools. + + Args: + filename: The name of the current file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + for linenum, line in enumerate(lines): + if u'\ufffd' in line: + error(filename, linenum, 'readability/utf8', 5, + 'Line contains invalid UTF-8 (or Unicode replacement character).') + if '\0' in line: + error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.') + + +def CheckForNewlineAtEOF(filename, lines, error): + """Logs an error if there is no newline char at the end of the file. + + Args: + filename: The name of the current file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + + # The array lines() was created by adding two newlines to the + # original file (go figure), then splitting on \n. + # To verify that the file ends in \n, we just have to make sure the + # last-but-two element of lines() exists and is empty. + if len(lines) < 3 or lines[-2]: + error(filename, len(lines) - 2, 'whitespace/ending_newline', 5, + 'Could not find a newline character at the end of the file.') + + +def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): + """Logs an error if we see /* ... */ or "..." that extend past one line. + + /* ... */ comments are legit inside macros, for one line. + Otherwise, we prefer // comments, so it's ok to warn about the + other. Likewise, it's ok for strings to extend across multiple + lines, as long as a line continuation character (backslash) + terminates each line. Although not currently prohibited by the C++ + style guide, it's ugly and unnecessary. We don't do well with either + in this lint program, so we warn about both. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Remove all \\ (escaped backslashes) from the line. They are OK, and the + # second (escaped) slash may trigger later \" detection erroneously. + line = line.replace('\\\\', '') + + if line.count('/*') > line.count('*/'): + error(filename, linenum, 'readability/multiline_comment', 5, + 'Complex multi-line /*...*/-style comment found. ' + 'Lint may give bogus warnings. ' + 'Consider replacing these with //-style comments, ' + 'with #if 0...#endif, ' + 'or with more clearly structured multi-line comments.') + + if (line.count('"') - line.count('\\"')) % 2: + error(filename, linenum, 'readability/multiline_string', 5, + 'Multi-line string ("...") found. This lint script doesn\'t ' + 'do well with such strings, and may give bogus warnings. ' + 'Use C++11 raw strings or concatenation instead.') + + +threading_list = ( + ('asctime(', 'asctime_r('), + ('ctime(', 'ctime_r('), + ('getgrgid(', 'getgrgid_r('), + ('getgrnam(', 'getgrnam_r('), + ('getlogin(', 'getlogin_r('), + ('getpwnam(', 'getpwnam_r('), + ('getpwuid(', 'getpwuid_r('), + ('gmtime(', 'gmtime_r('), + ('localtime(', 'localtime_r('), + ('rand(', 'rand_r('), + ('strtok(', 'strtok_r('), + ('ttyname(', 'ttyname_r('), + ) + + +def CheckPosixThreading(filename, clean_lines, linenum, error): + """Checks for calls to thread-unsafe functions. + + Much code has been originally written without consideration of + multi-threading. Also, engineers are relying on their old experience; + they have learned posix before threading extensions were added. These + tests guide the engineers to use thread-safe functions (when using + posix directly). + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + for single_thread_function, multithread_safe_function in threading_list: + ix = line.find(single_thread_function) + # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison + if ix >= 0 and (ix == 0 or (not line[ix - 1].isalnum() and + line[ix - 1] not in ('_', '.', '>'))): + error(filename, linenum, 'runtime/threadsafe_fn', 2, + 'Consider using ' + multithread_safe_function + + '...) instead of ' + single_thread_function + + '...) for improved thread safety.') + + +def CheckVlogArguments(filename, clean_lines, linenum, error): + """Checks that VLOG() is only used for defining a logging level. + + For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and + VLOG(FATAL) are not. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line): + error(filename, linenum, 'runtime/vlog', 5, + 'VLOG() should be used with numeric verbosity level. ' + 'Use LOG() if you want symbolic severity levels.') + + +# Matches invalid increment: *count++, which moves pointer instead of +# incrementing a value. +_RE_PATTERN_INVALID_INCREMENT = re.compile( + r'^\s*\*\w+(\+\+|--);') + + +def CheckInvalidIncrement(filename, clean_lines, linenum, error): + """Checks for invalid increment *count++. + + For example following function: + void increment_counter(int* count) { + *count++; + } + is invalid, because it effectively does count++, moving pointer, and should + be replaced with ++*count, (*count)++ or *count += 1. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + if _RE_PATTERN_INVALID_INCREMENT.match(line): + error(filename, linenum, 'runtime/invalid_increment', 5, + 'Changing pointer instead of value (or unused value of operator*).') + + +class _BlockInfo(object): + """Stores information about a generic block of code.""" + + def __init__(self, seen_open_brace): + self.seen_open_brace = seen_open_brace + self.open_parentheses = 0 + self.inline_asm = _NO_ASM + + def CheckBegin(self, filename, clean_lines, linenum, error): + """Run checks that applies to text up to the opening brace. + + This is mostly for checking the text after the class identifier + and the "{", usually where the base class is specified. For other + blocks, there isn't much to check, so we always pass. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + pass + + def CheckEnd(self, filename, clean_lines, linenum, error): + """Run checks that applies to text after the closing brace. + + This is mostly used for checking end of namespace comments. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + pass + + +class _ClassInfo(_BlockInfo): + """Stores information about a class.""" + + def __init__(self, name, class_or_struct, clean_lines, linenum): + _BlockInfo.__init__(self, False) + self.name = name + self.starting_linenum = linenum + self.is_derived = False + if class_or_struct == 'struct': + self.access = 'public' + self.is_struct = True + else: + self.access = 'private' + self.is_struct = False + + # Remember initial indentation level for this class. Using raw_lines here + # instead of elided to account for leading comments. + initial_indent = Match(r'^( *)\S', clean_lines.raw_lines[linenum]) + if initial_indent: + self.class_indent = len(initial_indent.group(1)) + else: + self.class_indent = 0 + + # Try to find the end of the class. This will be confused by things like: + # class A { + # } *x = { ... + # + # But it's still good enough for CheckSectionSpacing. + self.last_line = 0 + depth = 0 + for i in range(linenum, clean_lines.NumLines()): + line = clean_lines.elided[i] + depth += line.count('{') - line.count('}') + if not depth: + self.last_line = i + break + + def CheckBegin(self, filename, clean_lines, linenum, error): + # Look for a bare ':' + if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]): + self.is_derived = True + + def CheckEnd(self, filename, clean_lines, linenum, error): + # Check that closing brace is aligned with beginning of the class. + # Only do this if the closing brace is indented by only whitespaces. + # This means we will not check single-line class definitions. + indent = Match(r'^( *)\}', clean_lines.elided[linenum]) + if indent and len(indent.group(1)) != self.class_indent: + if self.is_struct: + parent = 'struct ' + self.name + else: + parent = 'class ' + self.name + error(filename, linenum, 'whitespace/indent', 3, + 'Closing brace should be aligned with beginning of %s' % parent) + + +class _NamespaceInfo(_BlockInfo): + """Stores information about a namespace.""" + + def __init__(self, name, linenum): + _BlockInfo.__init__(self, False) + self.name = name or '' + self.starting_linenum = linenum + + def CheckEnd(self, filename, clean_lines, linenum, error): + """Check end of namespace comments.""" + line = clean_lines.raw_lines[linenum] + + # Check how many lines is enclosed in this namespace. Don't issue + # warning for missing namespace comments if there aren't enough + # lines. However, do apply checks if there is already an end of + # namespace comment and it's incorrect. + # + # TODO(unknown): We always want to check end of namespace comments + # if a namespace is large, but sometimes we also want to apply the + # check if a short namespace contained nontrivial things (something + # other than forward declarations). There is currently no logic on + # deciding what these nontrivial things are, so this check is + # triggered by namespace size only, which works most of the time. + if (linenum - self.starting_linenum < 10 + and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)): + return + + # Look for matching comment at end of namespace. + # + # Note that we accept C style "/* */" comments for terminating + # namespaces, so that code that terminate namespaces inside + # preprocessor macros can be cpplint clean. + # + # We also accept stuff like "// end of namespace ." with the + # period at the end. + # + # Besides these, we don't accept anything else, otherwise we might + # get false negatives when existing comment is a substring of the + # expected namespace. + if self.name: + # Named namespace + if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) + + r'[\*/\.\\\s]*$'), + line): + error(filename, linenum, 'readability/namespace', 5, + 'Namespace should be terminated with "// namespace %s"' % + self.name) + else: + # Anonymous namespace + if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line): + error(filename, linenum, 'readability/namespace', 5, + 'Namespace should be terminated with "// namespace"') + + +class _PreprocessorInfo(object): + """Stores checkpoints of nesting stacks when #if/#else is seen.""" + + def __init__(self, stack_before_if): + # The entire nesting stack before #if + self.stack_before_if = stack_before_if + + # The entire nesting stack up to #else + self.stack_before_else = [] + + # Whether we have already seen #else or #elif + self.seen_else = False + + +class _NestingState(object): + """Holds states related to parsing braces.""" + + def __init__(self): + # Stack for tracking all braces. An object is pushed whenever we + # see a "{", and popped when we see a "}". Only 3 types of + # objects are possible: + # - _ClassInfo: a class or struct. + # - _NamespaceInfo: a namespace. + # - _BlockInfo: some other type of block. + self.stack = [] + + # Stack of _PreprocessorInfo objects. + self.pp_stack = [] + + def SeenOpenBrace(self): + """Check if we have seen the opening brace for the innermost block. + + Returns: + True if we have seen the opening brace, False if the innermost + block is still expecting an opening brace. + """ + return (not self.stack) or self.stack[-1].seen_open_brace + + def InNamespaceBody(self): + """Check if we are currently one level inside a namespace body. + + Returns: + True if top of the stack is a namespace block, False otherwise. + """ + return self.stack and isinstance(self.stack[-1], _NamespaceInfo) + + def UpdatePreprocessor(self, line): + """Update preprocessor stack. + + We need to handle preprocessors due to classes like this: + #ifdef SWIG + struct ResultDetailsPageElementExtensionPoint { + #else + struct ResultDetailsPageElementExtensionPoint : public Extension { + #endif + + We make the following assumptions (good enough for most files): + - Preprocessor condition evaluates to true from #if up to first + #else/#elif/#endif. + + - Preprocessor condition evaluates to false from #else/#elif up + to #endif. We still perform lint checks on these lines, but + these do not affect nesting stack. + + Args: + line: current line to check. + """ + if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line): + # Beginning of #if block, save the nesting stack here. The saved + # stack will allow us to restore the parsing state in the #else case. + self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) + elif Match(r'^\s*#\s*(else|elif)\b', line): + # Beginning of #else block + if self.pp_stack: + if not self.pp_stack[-1].seen_else: + # This is the first #else or #elif block. Remember the + # whole nesting stack up to this point. This is what we + # keep after the #endif. + self.pp_stack[-1].seen_else = True + self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) + + # Restore the stack to how it was before the #if + self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) + else: + # TODO(unknown): unexpected #else, issue warning? + pass + elif Match(r'^\s*#\s*endif\b', line): + # End of #if or #else blocks. + if self.pp_stack: + # If we saw an #else, we will need to restore the nesting + # stack to its former state before the #else, otherwise we + # will just continue from where we left off. + if self.pp_stack[-1].seen_else: + # Here we can just use a shallow copy since we are the last + # reference to it. + self.stack = self.pp_stack[-1].stack_before_else + # Drop the corresponding #if + self.pp_stack.pop() + else: + # TODO(unknown): unexpected #endif, issue warning? + pass + + def Update(self, filename, clean_lines, linenum, error): + """Update nesting state with current line. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Update pp_stack first + self.UpdatePreprocessor(line) + + # Count parentheses. This is to avoid adding struct arguments to + # the nesting stack. + if self.stack: + inner_block = self.stack[-1] + depth_change = line.count('(') - line.count(')') + inner_block.open_parentheses += depth_change + + # Also check if we are starting or ending an inline assembly block. + if inner_block.inline_asm in (_NO_ASM, _END_ASM): + if (depth_change != 0 and + inner_block.open_parentheses == 1 and + _MATCH_ASM.match(line)): + # Enter assembly block + inner_block.inline_asm = _INSIDE_ASM + else: + # Not entering assembly block. If previous line was _END_ASM, + # we will now shift to _NO_ASM state. + inner_block.inline_asm = _NO_ASM + elif (inner_block.inline_asm == _INSIDE_ASM and + inner_block.open_parentheses == 0): + # Exit assembly block + inner_block.inline_asm = _END_ASM + + # Consume namespace declaration at the beginning of the line. Do + # this in a loop so that we catch same line declarations like this: + # namespace proto2 { namespace bridge { class MessageSet; } } + while True: + # Match start of namespace. The "\b\s*" below catches namespace + # declarations even if it weren't followed by a whitespace, this + # is so that we don't confuse our namespace checker. The + # missing spaces will be flagged by CheckSpacing. + namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line) + if not namespace_decl_match: + break + + new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) + self.stack.append(new_namespace) + + line = namespace_decl_match.group(2) + if line.find('{') != -1: + new_namespace.seen_open_brace = True + line = line[line.find('{') + 1:] + + # Look for a class declaration in whatever is left of the line + # after parsing namespaces. The regexp accounts for decorated classes + # such as in: + # class LOCKABLE API Object { + # }; + # + # Templates with class arguments may confuse the parser, for example: + # template , + # class Vector = vector > + # class HeapQueue { + # + # Because this parser has no nesting state about templates, by the + # time it saw "class Comparator", it may think that it's a new class. + # Nested templates have a similar problem: + # template < + # typename ExportedType, + # typename TupleType, + # template class ImplTemplate> + # + # To avoid these cases, we ignore classes that are followed by '=' or '>' + class_decl_match = Match( + r'\s*(template\s*<[\w\s<>,:]*>\s*)?' + r'(class|struct)\s+([A-Z_]+\s+)*(\w+(?:::\w+)*)' + r'(([^=>]|<[^<>]*>|<[^<>]*<[^<>]*>\s*>)*)$', line) + if (class_decl_match and + (not self.stack or self.stack[-1].open_parentheses == 0)): + self.stack.append(_ClassInfo( + class_decl_match.group(4), class_decl_match.group(2), + clean_lines, linenum)) + line = class_decl_match.group(5) + + # If we have not yet seen the opening brace for the innermost block, + # run checks here. + if not self.SeenOpenBrace(): + self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) + + # Update access control if we are inside a class/struct + if self.stack and isinstance(self.stack[-1], _ClassInfo): + classinfo = self.stack[-1] + access_match = Match( + r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?' + r':(?:[^:]|$)', + line) + if access_match: + classinfo.access = access_match.group(2) + + # Check that access keywords are indented +1 space. Skip this + # check if the keywords are not preceded by whitespaces. + indent = access_match.group(1) + if (len(indent) != classinfo.class_indent + 1 and + Match(r'^\s*$', indent)): + if classinfo.is_struct: + parent = 'struct ' + classinfo.name + else: + parent = 'class ' + classinfo.name + slots = '' + if access_match.group(3): + slots = access_match.group(3) + error(filename, linenum, 'whitespace/indent', 3, + '%s%s: should be indented +1 space inside %s' % ( + access_match.group(2), slots, parent)) + + # Consume braces or semicolons from what's left of the line + while True: + # Match first brace, semicolon, or closed parenthesis. + matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line) + if not matched: + break + + token = matched.group(1) + if token == '{': + # If namespace or class hasn't seen a opening brace yet, mark + # namespace/class head as complete. Push a new block onto the + # stack otherwise. + if not self.SeenOpenBrace(): + self.stack[-1].seen_open_brace = True + else: + self.stack.append(_BlockInfo(True)) + if _MATCH_ASM.match(line): + self.stack[-1].inline_asm = _BLOCK_ASM + elif token == ';' or token == ')': + # If we haven't seen an opening brace yet, but we already saw + # a semicolon, this is probably a forward declaration. Pop + # the stack for these. + # + # Similarly, if we haven't seen an opening brace yet, but we + # already saw a closing parenthesis, then these are probably + # function arguments with extra "class" or "struct" keywords. + # Also pop these stack for these. + if not self.SeenOpenBrace(): + self.stack.pop() + else: # token == '}' + # Perform end of block checks and pop the stack. + if self.stack: + self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) + self.stack.pop() + line = matched.group(2) + + def InnermostClass(self): + """Get class info on the top of the stack. + + Returns: + A _ClassInfo object if we are inside a class, or None otherwise. + """ + for i in range(len(self.stack), 0, -1): + classinfo = self.stack[i - 1] + if isinstance(classinfo, _ClassInfo): + return classinfo + return None + + def CheckCompletedBlocks(self, filename, error): + """Checks that all classes and namespaces have been completely parsed. + + Call this when all lines in a file have been processed. + Args: + filename: The name of the current file. + error: The function to call with any errors found. + """ + # Note: This test can result in false positives if #ifdef constructs + # get in the way of brace matching. See the testBuildClass test in + # cpplint_unittest.py for an example of this. + for obj in self.stack: + if isinstance(obj, _ClassInfo): + error(filename, obj.starting_linenum, 'build/class', 5, + 'Failed to find complete declaration of class %s' % + obj.name) + elif isinstance(obj, _NamespaceInfo): + error(filename, obj.starting_linenum, 'build/namespaces', 5, + 'Failed to find complete declaration of namespace %s' % + obj.name) + + +def CheckForNonStandardConstructs(filename, clean_lines, linenum, + nesting_state, error): + r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. + + Complain about several constructs which gcc-2 accepts, but which are + not standard C++. Warning about these in lint is one way to ease the + transition to new compilers. + - put storage class first (e.g. "static const" instead of "const static"). + - "%lld" instead of %qd" in printf-type functions. + - "%1$d" is non-standard in printf-type functions. + - "\%" is an undefined character escape sequence. + - text after #endif is not allowed. + - invalid inner-style forward declaration. + - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?', + line): + error(filename, linenum, 'build/deprecated', 3, + '>? and ))?' + # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' + error(filename, linenum, 'runtime/member_string_references', 2, + 'const string& members are dangerous. It is much better to use ' + 'alternatives, such as pointers or simple constants.') + + # Everything else in this function operates on class declarations. + # Return early if the top of the nesting stack is not a class, or if + # the class head is not completed yet. + classinfo = nesting_state.InnermostClass() + if not classinfo or not classinfo.seen_open_brace: + return + + # The class may have been declared with namespace or classname qualifiers. + # The constructor and destructor will not have those qualifiers. + base_classname = classinfo.name.split('::')[-1] + + # Look for single-argument constructors that aren't marked explicit. + # Technically a valid construct, but against style. + args = Match(r'\s+(?:inline\s+)?%s\s*\(([^,()]+)\)' + % re.escape(base_classname), + line) + if (args and + args.group(1) != 'void' and + not Match(r'(const\s+)?%s(\s+const)?\s*(?:<\w+>\s*)?&' + % re.escape(base_classname), args.group(1).strip())): + error(filename, linenum, 'runtime/explicit', 5, + 'Single-argument constructors should be marked explicit.') + + +def CheckSpacingForFunctionCall(filename, line, linenum, error): + """Checks for the correctness of various spacing around function calls. + + Args: + filename: The name of the current file. + line: The text of the line to check. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + # Since function calls often occur inside if/for/while/switch + # expressions - which have their own, more liberal conventions - we + # first see if we should be looking inside such an expression for a + # function call, to which we can apply more strict standards. + fncall = line # if there's no control flow construct, look at whole line + for pattern in (r'\bif\s*\((.*)\)\s*{', + r'\bfor\s*\((.*)\)\s*{', + r'\bwhile\s*\((.*)\)\s*[{;]', + r'\bswitch\s*\((.*)\)\s*{'): + match = Search(pattern, line) + if match: + fncall = match.group(1) # look inside the parens for function calls + break + + # Except in if/for/while/switch, there should never be space + # immediately inside parens (eg "f( 3, 4 )"). We make an exception + # for nested parens ( (a+b) + c ). Likewise, there should never be + # a space before a ( when it's a function argument. I assume it's a + # function argument when the char before the whitespace is legal in + # a function name (alnum + _) and we're not starting a macro. Also ignore + # pointers and references to arrays and functions coz they're too tricky: + # we use a very simple way to recognize these: + # " (something)(maybe-something)" or + # " (something)(maybe-something," or + # " (something)[something]" + # Note that we assume the contents of [] to be short enough that + # they'll never need to wrap. + if ( # Ignore control structures. + not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b', + fncall) and + # Ignore pointers/references to functions. + not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and + # Ignore pointers/references to arrays. + not Search(r' \([^)]+\)\[[^\]]+\]', fncall)): + if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call + error(filename, linenum, 'whitespace/parens', 4, + 'Extra space after ( in function call') + elif Search(r'\(\s+(?!(\s*\\)|\()', fncall): + error(filename, linenum, 'whitespace/parens', 2, + 'Extra space after (') + if (Search(r'\w\s+\(', fncall) and + not Search(r'#\s*define|typedef', fncall) and + not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall)): + error(filename, linenum, 'whitespace/parens', 4, + 'Extra space before ( in function call') + # If the ) is followed only by a newline or a { + newline, assume it's + # part of a control statement (if/while/etc), and don't complain + if Search(r'[^)]\s+\)\s*[^{\s]', fncall): + # If the closing parenthesis is preceded by only whitespaces, + # try to give a more descriptive error message. + if Search(r'^\s+\)', fncall): + error(filename, linenum, 'whitespace/parens', 2, + 'Closing ) should be moved to the previous line') + else: + error(filename, linenum, 'whitespace/parens', 2, + 'Extra space before )') + + +def IsBlankLine(line): + """Returns true if the given line is blank. + + We consider a line to be blank if the line is empty or consists of + only white spaces. + + Args: + line: A line of a string. + + Returns: + True, if the given line is blank. + """ + return not line or line.isspace() + + +def CheckForFunctionLengths(filename, clean_lines, linenum, + function_state, error): + """Reports for long function bodies. + + For an overview why this is done, see: + http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions + + Uses a simplistic algorithm assuming other style guidelines + (especially spacing) are followed. + Only checks unindented functions, so class members are unchecked. + Trivial bodies are unchecked, so constructors with huge initializer lists + may be missed. + Blank/comment lines are not counted so as to avoid encouraging the removal + of vertical space and comments just to get through a lint check. + NOLINT *on the last line of a function* disables this check. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + function_state: Current function name and lines in body so far. + error: The function to call with any errors found. + """ + lines = clean_lines.lines + line = lines[linenum] + raw = clean_lines.raw_lines + raw_line = raw[linenum] + joined_line = '' + + starting_func = False + regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ... + match_result = Match(regexp, line) + if match_result: + # If the name is all caps and underscores, figure it's a macro and + # ignore it, unless it's TEST or TEST_F. + function_name = match_result.group(1).split()[-1] + if function_name == 'TEST' or function_name == 'TEST_F' or ( + not Match(r'[A-Z_]+$', function_name)): + starting_func = True + + if starting_func: + body_found = False + for start_linenum in xrange(linenum, clean_lines.NumLines()): + start_line = lines[start_linenum] + joined_line += ' ' + start_line.lstrip() + if Search(r'(;|})', start_line): # Declarations and trivial functions + body_found = True + break # ... ignore + elif Search(r'{', start_line): + body_found = True + function = Search(r'((\w|:)*)\(', line).group(1) + if Match(r'TEST', function): # Handle TEST... macros + parameter_regexp = Search(r'(\(.*\))', joined_line) + if parameter_regexp: # Ignore bad syntax + function += parameter_regexp.group(1) + else: + function += '()' + function_state.Begin(function) + break + if not body_found: + # No body for the function (or evidence of a non-function) was found. + error(filename, linenum, 'readability/fn_size', 5, + 'Lint failed to find start of function body.') + elif Match(r'^\}\s*$', line): # function end + function_state.Check(error, filename, linenum) + function_state.End() + elif not Match(r'^\s*$', line): + function_state.Count() # Count non-blank/non-comment lines. + + +_RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') + + +def CheckComment(comment, filename, linenum, error): + """Checks for common mistakes in TODO comments. + + Args: + comment: The text of the comment from the line in question. + filename: The name of the current file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + match = _RE_PATTERN_TODO.match(comment) + if match: + # One whitespace is correct; zero whitespace is handled elsewhere. + leading_whitespace = match.group(1) + if len(leading_whitespace) > 1: + error(filename, linenum, 'whitespace/todo', 2, + 'Too many spaces before TODO') + + username = match.group(2) + if not username: + error(filename, linenum, 'readability/todo', 2, + 'Missing username in TODO; it should look like ' + '"// TODO(my_username): Stuff."') + + middle_whitespace = match.group(3) + # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison + if middle_whitespace != ' ' and middle_whitespace != '': + error(filename, linenum, 'whitespace/todo', 2, + 'TODO(my_username) should be followed by a space') + +def CheckAccess(filename, clean_lines, linenum, nesting_state, error): + """Checks for improper use of DISALLOW* macros. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] # get rid of comments and strings + + matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|' + r'DISALLOW_EVIL_CONSTRUCTORS|' + r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line) + if not matched: + return + if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo): + if nesting_state.stack[-1].access != 'private': + error(filename, linenum, 'readability/constructors', 3, + '%s must be in the private: section' % matched.group(1)) + + else: + # Found DISALLOW* macro outside a class declaration, or perhaps it + # was used inside a function when it should have been part of the + # class declaration. We could issue a warning here, but it + # probably resulted in a compiler error already. + pass + + +def FindNextMatchingAngleBracket(clean_lines, linenum, init_suffix): + """Find the corresponding > to close a template. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: Current line number. + init_suffix: Remainder of the current line after the initial <. + + Returns: + True if a matching bracket exists. + """ + line = init_suffix + nesting_stack = ['<'] + while True: + # Find the next operator that can tell us whether < is used as an + # opening bracket or as a less-than operator. We only want to + # warn on the latter case. + # + # We could also check all other operators and terminate the search + # early, e.g. if we got something like this "a(),;\[\]]*([<>(),;\[\]])(.*)$', line) + if match: + # Found an operator, update nesting stack + operator = match.group(1) + line = match.group(2) + + if nesting_stack[-1] == '<': + # Expecting closing angle bracket + if operator in ('<', '(', '['): + nesting_stack.append(operator) + elif operator == '>': + nesting_stack.pop() + if not nesting_stack: + # Found matching angle bracket + return True + elif operator == ',': + # Got a comma after a bracket, this is most likely a template + # argument. We have not seen a closing angle bracket yet, but + # it's probably a few lines later if we look for it, so just + # return early here. + return True + else: + # Got some other operator. + return False + + else: + # Expecting closing parenthesis or closing bracket + if operator in ('<', '(', '['): + nesting_stack.append(operator) + elif operator in (')', ']'): + # We don't bother checking for matching () or []. If we got + # something like (] or [), it would have been a syntax error. + nesting_stack.pop() + + else: + # Scan the next line + linenum += 1 + if linenum >= len(clean_lines.elided): + break + line = clean_lines.elided[linenum] + + # Exhausted all remaining lines and still no matching angle bracket. + # Most likely the input was incomplete, otherwise we should have + # seen a semicolon and returned early. + return True + + +def FindPreviousMatchingAngleBracket(clean_lines, linenum, init_prefix): + """Find the corresponding < that started a template. + + Args: + clean_lines: A CleansedLines instance containing the file. + linenum: Current line number. + init_prefix: Part of the current line before the initial >. + + Returns: + True if a matching bracket exists. + """ + line = init_prefix + nesting_stack = ['>'] + while True: + # Find the previous operator + match = Search(r'^(.*)([<>(),;\[\]])[^<>(),;\[\]]*$', line) + if match: + # Found an operator, update nesting stack + operator = match.group(2) + line = match.group(1) + + if nesting_stack[-1] == '>': + # Expecting opening angle bracket + if operator in ('>', ')', ']'): + nesting_stack.append(operator) + elif operator == '<': + nesting_stack.pop() + if not nesting_stack: + # Found matching angle bracket + return True + elif operator == ',': + # Got a comma before a bracket, this is most likely a + # template argument. The opening angle bracket is probably + # there if we look for it, so just return early here. + return True + else: + # Got some other operator. + return False + + else: + # Expecting opening parenthesis or opening bracket + if operator in ('>', ')', ']'): + nesting_stack.append(operator) + elif operator in ('(', '['): + nesting_stack.pop() + + else: + # Scan the previous line + linenum -= 1 + if linenum < 0: + break + line = clean_lines.elided[linenum] + + # Exhausted all earlier lines and still no matching angle bracket. + return False + + +def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): + """Checks for the correctness of various spacing issues in the code. + + Things we check for: spaces around operators, spaces after + if/for/while/switch, no spaces around parens in function calls, two + spaces between code and comment, don't start a block with a blank + line, don't end a function with a blank line, don't add a blank line + after public/protected/private, don't have too many blank lines in a row. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + + # Don't use "elided" lines here, otherwise we can't check commented lines. + # Don't want to use "raw" either, because we don't want to check inside C++11 + # raw strings, + raw = clean_lines.lines_without_raw_strings + line = raw[linenum] + + # Before nixing comments, check if the line is blank for no good + # reason. This includes the first line after a block is opened, and + # blank lines at the end of a function (ie, right before a line like '}' + # + # Skip all the blank line checks if we are immediately inside a + # namespace body. In other words, don't issue blank line warnings + # for this block: + # namespace { + # + # } + # + # A warning about missing end of namespace comments will be issued instead. + if IsBlankLine(line) and not nesting_state.InNamespaceBody(): + elided = clean_lines.elided + prev_line = elided[linenum - 1] + prevbrace = prev_line.rfind('{') + # TODO(unknown): Don't complain if line before blank line, and line after, + # both start with alnums and are indented the same amount. + # This ignores whitespace at the start of a namespace block + # because those are not usually indented. + if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1: + # OK, we have a blank line at the start of a code block. Before we + # complain, we check if it is an exception to the rule: The previous + # non-empty line has the parameters of a function header that are indented + # 4 spaces (because they did not fit in a 80 column line when placed on + # the same line as the function name). We also check for the case where + # the previous line is indented 6 spaces, which may happen when the + # initializers of a constructor do not fit into a 80 column line. + exception = False + if Match(r' {6}\w', prev_line): # Initializer list? + # We are looking for the opening column of initializer list, which + # should be indented 4 spaces to cause 6 space indentation afterwards. + search_position = linenum-2 + while (search_position >= 0 + and Match(r' {6}\w', elided[search_position])): + search_position -= 1 + exception = (search_position >= 0 + and elided[search_position][:5] == ' :') + else: + # Search for the function arguments or an initializer list. We use a + # simple heuristic here: If the line is indented 4 spaces; and we have a + # closing paren, without the opening paren, followed by an opening brace + # or colon (for initializer lists) we assume that it is the last line of + # a function header. If we have a colon indented 4 spaces, it is an + # initializer list. + exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)', + prev_line) + or Match(r' {4}:', prev_line)) + + if not exception: + error(filename, linenum, 'whitespace/blank_line', 2, + 'Redundant blank line at the start of a code block ' + 'should be deleted.') + # Ignore blank lines at the end of a block in a long if-else + # chain, like this: + # if (condition1) { + # // Something followed by a blank line + # + # } else if (condition2) { + # // Something else + # } + if linenum + 1 < clean_lines.NumLines(): + next_line = raw[linenum + 1] + if (next_line + and Match(r'\s*}', next_line) + and next_line.find('} else ') == -1): + error(filename, linenum, 'whitespace/blank_line', 3, + 'Redundant blank line at the end of a code block ' + 'should be deleted.') + + matched = Match(r'\s*(public|protected|private):', prev_line) + if matched: + error(filename, linenum, 'whitespace/blank_line', 3, + 'Do not leave a blank line after "%s:"' % matched.group(1)) + + # Next, we complain if there's a comment too near the text + commentpos = line.find('//') + if commentpos != -1: + # Check if the // may be in quotes. If so, ignore it + # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison + if (line.count('"', 0, commentpos) - + line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes + # Allow one space for new scopes, two spaces otherwise: + if (not Match(r'^\s*{ //', line) and + ((commentpos >= 1 and + line[commentpos-1] not in string.whitespace) or + (commentpos >= 2 and + line[commentpos-2] not in string.whitespace))): + error(filename, linenum, 'whitespace/comments', 2, + 'At least two spaces is best between code and comments') + # There should always be a space between the // and the comment + commentend = commentpos + 2 + if commentend < len(line) and not line[commentend] == ' ': + # but some lines are exceptions -- e.g. if they're big + # comment delimiters like: + # //---------------------------------------------------------- + # or are an empty C++ style Doxygen comment, like: + # /// + # or C++ style Doxygen comments placed after the variable: + # ///< Header comment + # //!< Header comment + # or they begin with multiple slashes followed by a space: + # //////// Header comment + match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or + Search(r'^/$', line[commentend:]) or + Search(r'^!< ', line[commentend:]) or + Search(r'^/< ', line[commentend:]) or + Search(r'^/+ ', line[commentend:])) + if not match: + error(filename, linenum, 'whitespace/comments', 4, + 'Should have a space between // and comment') + CheckComment(line[commentpos:], filename, linenum, error) + + line = clean_lines.elided[linenum] # get rid of comments and strings + + # Don't try to do spacing checks for operator methods + line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line) + + # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". + # Otherwise not. Note we only check for non-spaces on *both* sides; + # sometimes people put non-spaces on one side when aligning ='s among + # many lines (not that this is behavior that I approve of...) + if Search(r'[\w.]=[\w.]', line) and not Search(r'\b(if|while) ', line): + error(filename, linenum, 'whitespace/operators', 4, + 'Missing spaces around =') + + # It's ok not to have spaces around binary operators like + - * /, but if + # there's too little whitespace, we get concerned. It's hard to tell, + # though, so we punt on this one for now. TODO. + + # You should always have whitespace around binary operators. + # + # Check <= and >= first to avoid false positives with < and >, then + # check non-include lines for spacing around < and >. + match = Search(r'[^<>=!\s](==|!=|<=|>=)[^<>=!\s]', line) + if match: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around %s' % match.group(1)) + # We allow no-spaces around << when used like this: 10<<20, but + # not otherwise (particularly, not when used as streams) + # Also ignore using ns::operator<<; + match = Search(r'(operator|\S)(?:L|UL|ULL|l|ul|ull)?<<(\S)', line) + if (match and + not (match.group(1).isdigit() and match.group(2).isdigit()) and + not (match.group(1) == 'operator' and match.group(2) == ';')): + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around <<') + elif not Match(r'#.*include', line): + # Avoid false positives on -> + reduced_line = line.replace('->', '') + + # Look for < that is not surrounded by spaces. This is only + # triggered if both sides are missing spaces, even though + # technically should should flag if at least one side is missing a + # space. This is done to avoid some false positives with shifts. + match = Search(r'[^\s<]<([^\s=<].*)', reduced_line) + if (match and + not FindNextMatchingAngleBracket(clean_lines, linenum, match.group(1))): + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around <') + + # Look for > that is not surrounded by spaces. Similar to the + # above, we only trigger if both sides are missing spaces to avoid + # false positives with shifts. + match = Search(r'^(.*[^\s>])>[^\s=>]', reduced_line) + if (match and + not FindPreviousMatchingAngleBracket(clean_lines, linenum, + match.group(1))): + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around >') + + # We allow no-spaces around >> for almost anything. This is because + # C++11 allows ">>" to close nested templates, which accounts for + # most cases when ">>" is not followed by a space. + # + # We still warn on ">>" followed by alpha character, because that is + # likely due to ">>" being used for right shifts, e.g.: + # value >> alpha + # + # When ">>" is used to close templates, the alphanumeric letter that + # follows would be part of an identifier, and there should still be + # a space separating the template type and the identifier. + # type> alpha + match = Search(r'>>[a-zA-Z_]', line) + if match: + error(filename, linenum, 'whitespace/operators', 3, + 'Missing spaces around >>') + + # There shouldn't be space around unary operators + match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) + if match: + error(filename, linenum, 'whitespace/operators', 4, + 'Extra space for operator %s' % match.group(1)) + + # A pet peeve of mine: no spaces after an if, while, switch, or for + match = Search(r' (if\(|for\(|while\(|switch\()', line) + if match: + error(filename, linenum, 'whitespace/parens', 5, + 'Missing space before ( in %s' % match.group(1)) + + # For if/for/while/switch, the left and right parens should be + # consistent about how many spaces are inside the parens, and + # there should either be zero or one spaces inside the parens. + # We don't want: "if ( foo)" or "if ( foo )". + # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. + match = Search(r'\b(if|for|while|switch)\s*' + r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$', + line) + if match: + if len(match.group(2)) != len(match.group(4)): + if not (match.group(3) == ';' and + len(match.group(2)) == 1 + len(match.group(4)) or + not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)): + error(filename, linenum, 'whitespace/parens', 5, + 'Mismatching spaces inside () in %s' % match.group(1)) + if len(match.group(2)) not in [0, 1]: + error(filename, linenum, 'whitespace/parens', 5, + 'Should have zero or one spaces inside ( and ) in %s' % + match.group(1)) + + # You should always have a space after a comma (either as fn arg or operator) + # + # This does not apply when the non-space character following the + # comma is another comma, since the only time when that happens is + # for empty macro arguments. + # + # We run this check in two passes: first pass on elided lines to + # verify that lines contain missing whitespaces, second pass on raw + # lines to confirm that those missing whitespaces are not due to + # elided comments. + if Search(r',[^,\s]', line) and Search(r',[^,\s]', raw[linenum]): + error(filename, linenum, 'whitespace/comma', 3, + 'Missing space after ,') + + # You should always have a space after a semicolon + # except for few corner cases + # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more + # space after ; + if Search(r';[^\s};\\)/]', line): + error(filename, linenum, 'whitespace/semicolon', 3, + 'Missing space after ;') + + # Next we will look for issues with function calls. + CheckSpacingForFunctionCall(filename, line, linenum, error) + + # Except after an opening paren, or after another opening brace (in case of + # an initializer list, for instance), you should have spaces before your + # braces. And since you should never have braces at the beginning of a line, + # this is an easy test. + match = Match(r'^(.*[^ ({]){', line) + if match: + # Try a bit harder to check for brace initialization. This + # happens in one of the following forms: + # Constructor() : initializer_list_{} { ... } + # Constructor{}.MemberFunction() + # Type variable{}; + # FunctionCall(type{}, ...); + # LastArgument(..., type{}); + # LOG(INFO) << type{} << " ..."; + # map_of_type[{...}] = ...; + # + # We check for the character following the closing brace, and + # silence the warning if it's one of those listed above, i.e. + # "{.;,)<]". + # + # To account for nested initializer list, we allow any number of + # closing braces up to "{;,)<". We can't simply silence the + # warning on first sight of closing brace, because that would + # cause false negatives for things that are not initializer lists. + # Silence this: But not this: + # Outer{ if (...) { + # Inner{...} if (...){ // Missing space before { + # }; } + # + # There is a false negative with this approach if people inserted + # spurious semicolons, e.g. "if (cond){};", but we will catch the + # spurious semicolon with a separate check. + (endline, endlinenum, endpos) = CloseExpression( + clean_lines, linenum, len(match.group(1))) + trailing_text = '' + if endpos > -1: + trailing_text = endline[endpos:] + for offset in xrange(endlinenum + 1, + min(endlinenum + 3, clean_lines.NumLines() - 1)): + trailing_text += clean_lines.elided[offset] + if not Match(r'^[\s}]*[{.;,)<\]]', trailing_text): + error(filename, linenum, 'whitespace/braces', 5, + 'Missing space before {') + + # Make sure '} else {' has spaces. + if Search(r'}else', line): + error(filename, linenum, 'whitespace/braces', 5, + 'Missing space before else') + + # You shouldn't have spaces before your brackets, except maybe after + # 'delete []' or 'new char * []'. + if Search(r'\w\s+\[', line) and not Search(r'delete\s+\[', line): + error(filename, linenum, 'whitespace/braces', 5, + 'Extra space before [') + + # You shouldn't have a space before a semicolon at the end of the line. + # There's a special case for "for" since the style guide allows space before + # the semicolon there. + if Search(r':\s*;\s*$', line): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Semicolon defining empty statement. Use {} instead.') + elif Search(r'^\s*;\s*$', line): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Line contains only semicolon. If this should be an empty statement, ' + 'use {} instead.') + elif (Search(r'\s+;\s*$', line) and + not Search(r'\bfor\b', line)): + error(filename, linenum, 'whitespace/semicolon', 5, + 'Extra space before last semicolon. If this should be an empty ' + 'statement, use {} instead.') + + # In range-based for, we wanted spaces before and after the colon, but + # not around "::" tokens that might appear. + if (Search('for *\(.*[^:]:[^: ]', line) or + Search('for *\(.*[^: ]:[^:]', line)): + error(filename, linenum, 'whitespace/forcolon', 2, + 'Missing space around colon in range-based for loop') + + +def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): + """Checks for additional blank line issues related to sections. + + Currently the only thing checked here is blank line before protected/private. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + class_info: A _ClassInfo objects. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + # Skip checks if the class is small, where small means 25 lines or less. + # 25 lines seems like a good cutoff since that's the usual height of + # terminals, and any class that can't fit in one screen can't really + # be considered "small". + # + # Also skip checks if we are on the first line. This accounts for + # classes that look like + # class Foo { public: ... }; + # + # If we didn't find the end of the class, last_line would be zero, + # and the check will be skipped by the first condition. + if (class_info.last_line - class_info.starting_linenum <= 24 or + linenum <= class_info.starting_linenum): + return + + matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum]) + if matched: + # Issue warning if the line before public/protected/private was + # not a blank line, but don't do this if the previous line contains + # "class" or "struct". This can happen two ways: + # - We are at the beginning of the class. + # - We are forward-declaring an inner class that is semantically + # private, but needed to be public for implementation reasons. + # Also ignores cases where the previous line ends with a backslash as can be + # common when defining classes in C macros. + prev_line = clean_lines.lines[linenum - 1] + if (not IsBlankLine(prev_line) and + not Search(r'\b(class|struct)\b', prev_line) and + not Search(r'\\$', prev_line)): + # Try a bit harder to find the beginning of the class. This is to + # account for multi-line base-specifier lists, e.g.: + # class Derived + # : public Base { + end_class_head = class_info.starting_linenum + for i in range(class_info.starting_linenum, linenum): + if Search(r'\{\s*$', clean_lines.lines[i]): + end_class_head = i + break + if end_class_head < linenum - 1: + error(filename, linenum, 'whitespace/blank_line', 3, + '"%s:" should be preceded by a blank line' % matched.group(1)) + + +def GetPreviousNonBlankLine(clean_lines, linenum): + """Return the most recent non-blank line and its line number. + + Args: + clean_lines: A CleansedLines instance containing the file contents. + linenum: The number of the line to check. + + Returns: + A tuple with two elements. The first element is the contents of the last + non-blank line before the current line, or the empty string if this is the + first non-blank line. The second is the line number of that line, or -1 + if this is the first non-blank line. + """ + + prevlinenum = linenum - 1 + while prevlinenum >= 0: + prevline = clean_lines.elided[prevlinenum] + if not IsBlankLine(prevline): # if not a blank line... + return (prevline, prevlinenum) + prevlinenum -= 1 + return ('', -1) + + +def CheckBraces(filename, clean_lines, linenum, error): + """Looks for misplaced braces (e.g. at the end of line). + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + line = clean_lines.elided[linenum] # get rid of comments and strings + + if Match(r'\s*{\s*$', line): + # We allow an open brace to start a line in the case where someone is using + # braces in a block to explicitly create a new scope, which is commonly used + # to control the lifetime of stack-allocated variables. Braces are also + # used for brace initializers inside function calls. We don't detect this + # perfectly: we just don't complain if the last non-whitespace character on + # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the + # previous line starts a preprocessor block. + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if (not Search(r'[,;:}{(]\s*$', prevline) and + not Match(r'\s*#', prevline)): + error(filename, linenum, 'whitespace/braces', 4, + '{ should almost always be at the end of the previous line') + + # An else clause should be on the same line as the preceding closing brace. + if Match(r'\s*else\s*', line): + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if Match(r'\s*}\s*$', prevline): + error(filename, linenum, 'whitespace/newline', 4, + 'An else should appear on the same line as the preceding }') + + # If braces come on one side of an else, they should be on both. + # However, we have to worry about "else if" that spans multiple lines! + if Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): + if Search(r'}\s*else if([^{]*)$', line): # could be multi-line if + # find the ( after the if + pos = line.find('else if') + pos = line.find('(', pos) + if pos > 0: + (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) + if endline[endpos:].find('{') == -1: # must be brace after if + error(filename, linenum, 'readability/braces', 5, + 'If an else has a brace on one side, it should have it on both') + else: # common case: else not followed by a multi-line if + error(filename, linenum, 'readability/braces', 5, + 'If an else has a brace on one side, it should have it on both') + + # Likewise, an else should never have the else clause on the same line + if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line): + error(filename, linenum, 'whitespace/newline', 4, + 'Else clause should never be on same line as else (use 2 lines)') + + # In the same way, a do/while should never be on one line + if Match(r'\s*do [^\s{]', line): + error(filename, linenum, 'whitespace/newline', 4, + 'do/while clauses should not be on a single line') + + # Block bodies should not be followed by a semicolon. Due to C++11 + # brace initialization, there are more places where semicolons are + # required than not, so we use a whitelist approach to check these + # rather than a blacklist. These are the places where "};" should + # be replaced by just "}": + # 1. Some flavor of block following closing parenthesis: + # for (;;) {}; + # while (...) {}; + # switch (...) {}; + # Function(...) {}; + # if (...) {}; + # if (...) else if (...) {}; + # + # 2. else block: + # if (...) else {}; + # + # 3. const member function: + # Function(...) const {}; + # + # 4. Block following some statement: + # x = 42; + # {}; + # + # 5. Block at the beginning of a function: + # Function(...) { + # {}; + # } + # + # Note that naively checking for the preceding "{" will also match + # braces inside multi-dimensional arrays, but this is fine since + # that expression will not contain semicolons. + # + # 6. Block following another block: + # while (true) {} + # {}; + # + # 7. End of namespaces: + # namespace {}; + # + # These semicolons seems far more common than other kinds of + # redundant semicolons, possibly due to people converting classes + # to namespaces. For now we do not warn for this case. + # + # Try matching case 1 first. + match = Match(r'^(.*\)\s*)\{', line) + if match: + # Matched closing parenthesis (case 1). Check the token before the + # matching opening parenthesis, and don't warn if it looks like a + # macro. This avoids these false positives: + # - macro that defines a base class + # - multi-line macro that defines a base class + # - macro that defines the whole class-head + # + # But we still issue warnings for macros that we know are safe to + # warn, specifically: + # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P + # - TYPED_TEST + # - INTERFACE_DEF + # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: + # + # We implement a whitelist of safe macros instead of a blacklist of + # unsafe macros, even though the latter appears less frequently in + # google code and would have been easier to implement. This is because + # the downside for getting the whitelist wrong means some extra + # semicolons, while the downside for getting the blacklist wrong + # would result in compile errors. + # + # In addition to macros, we also don't want to warn on compound + # literals. + closing_brace_pos = match.group(1).rfind(')') + opening_parenthesis = ReverseCloseExpression( + clean_lines, linenum, closing_brace_pos) + if opening_parenthesis[2] > -1: + line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]] + macro = Search(r'\b([A-Z_]+)\s*$', line_prefix) + if ((macro and + macro.group(1) not in ( + 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST', + 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED', + 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or + Search(r'\s+=\s*$', line_prefix)): + match = None + + else: + # Try matching cases 2-3. + match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line) + if not match: + # Try matching cases 4-6. These are always matched on separate lines. + # + # Note that we can't simply concatenate the previous line to the + # current line and do a single match, otherwise we may output + # duplicate warnings for the blank line case: + # if (cond) { + # // blank line + # } + prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] + if prevline and Search(r'[;{}]\s*$', prevline): + match = Match(r'^(\s*)\{', line) + + # Check matching closing brace + if match: + (endline, endlinenum, endpos) = CloseExpression( + clean_lines, linenum, len(match.group(1))) + if endpos > -1 and Match(r'^\s*;', endline[endpos:]): + # Current {} pair is eligible for semicolon check, and we have found + # the redundant semicolon, output warning here. + # + # Note: because we are scanning forward for opening braces, and + # outputting warnings for the matching closing brace, if there are + # nested blocks with trailing semicolons, we will get the error + # messages in reversed order. + error(filename, endlinenum, 'readability/braces', 4, + "You don't need a ; after a }") + + +def CheckEmptyBlockBody(filename, clean_lines, linenum, error): + """Look for empty loop/conditional body with only a single semicolon. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + # Search for loop keywords at the beginning of the line. Because only + # whitespaces are allowed before the keywords, this will also ignore most + # do-while-loops, since those lines should start with closing brace. + # + # We also check "if" blocks here, since an empty conditional block + # is likely an error. + line = clean_lines.elided[linenum] + matched = Match(r'\s*(for|while|if)\s*\(', line) + if matched: + # Find the end of the conditional expression + (end_line, end_linenum, end_pos) = CloseExpression( + clean_lines, linenum, line.find('(')) + + # Output warning if what follows the condition expression is a semicolon. + # No warning for all other cases, including whitespace or newline, since we + # have a separate check for semicolons preceded by whitespace. + if end_pos >= 0 and Match(r';', end_line[end_pos:]): + if matched.group(1) == 'if': + error(filename, end_linenum, 'whitespace/empty_conditional_body', 5, + 'Empty conditional bodies should use {}') + else: + error(filename, end_linenum, 'whitespace/empty_loop_body', 5, + 'Empty loop bodies should use {} or continue') + + +def CheckCheck(filename, clean_lines, linenum, error): + """Checks the use of CHECK and EXPECT macros. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + + # Decide the set of replacement macros that should be suggested + lines = clean_lines.elided + check_macro = None + start_pos = -1 + for macro in _CHECK_MACROS: + i = lines[linenum].find(macro) + if i >= 0: + check_macro = macro + + # Find opening parenthesis. Do a regular expression match here + # to make sure that we are matching the expected CHECK macro, as + # opposed to some other macro that happens to contain the CHECK + # substring. + matched = Match(r'^(.*\b' + check_macro + r'\s*)\(', lines[linenum]) + if not matched: + continue + start_pos = len(matched.group(1)) + break + if not check_macro or start_pos < 0: + # Don't waste time here if line doesn't contain 'CHECK' or 'EXPECT' + return + + # Find end of the boolean expression by matching parentheses + (last_line, end_line, end_pos) = CloseExpression( + clean_lines, linenum, start_pos) + if end_pos < 0: + return + if linenum == end_line: + expression = lines[linenum][start_pos + 1:end_pos - 1] + else: + expression = lines[linenum][start_pos + 1:] + for i in xrange(linenum + 1, end_line): + expression += lines[i] + expression += last_line[0:end_pos - 1] + + # Parse expression so that we can take parentheses into account. + # This avoids false positives for inputs like "CHECK((a < 4) == b)", + # which is not replaceable by CHECK_LE. + lhs = '' + rhs = '' + operator = None + while expression: + matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||' + r'==|!=|>=|>|<=|<|\()(.*)$', expression) + if matched: + token = matched.group(1) + if token == '(': + # Parenthesized operand + expression = matched.group(2) + (end, _) = FindEndOfExpressionInLine(expression, 0, 1, '(', ')') + if end < 0: + return # Unmatched parenthesis + lhs += '(' + expression[0:end] + expression = expression[end:] + elif token in ('&&', '||'): + # Logical and/or operators. This means the expression + # contains more than one term, for example: + # CHECK(42 < a && a < b); + # + # These are not replaceable with CHECK_LE, so bail out early. + return + elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'): + # Non-relational operator + lhs += token + expression = matched.group(2) + else: + # Relational operator + operator = token + rhs = matched.group(2) + break + else: + # Unparenthesized operand. Instead of appending to lhs one character + # at a time, we do another regular expression match to consume several + # characters at once if possible. Trivial benchmark shows that this + # is more efficient when the operands are longer than a single + # character, which is generally the case. + matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression) + if not matched: + matched = Match(r'^(\s*\S)(.*)$', expression) + if not matched: + break + lhs += matched.group(1) + expression = matched.group(2) + + # Only apply checks if we got all parts of the boolean expression + if not (lhs and operator and rhs): + return + + # Check that rhs do not contain logical operators. We already know + # that lhs is fine since the loop above parses out && and ||. + if rhs.find('&&') > -1 or rhs.find('||') > -1: + return + + # At least one of the operands must be a constant literal. This is + # to avoid suggesting replacements for unprintable things like + # CHECK(variable != iterator) + # + # The following pattern matches decimal, hex integers, strings, and + # characters (in that order). + lhs = lhs.strip() + rhs = rhs.strip() + match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' + if Match(match_constant, lhs) or Match(match_constant, rhs): + # Note: since we know both lhs and rhs, we can provide a more + # descriptive error message like: + # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) + # Instead of: + # Consider using CHECK_EQ instead of CHECK(a == b) + # + # We are still keeping the less descriptive message because if lhs + # or rhs gets long, the error message might become unreadable. + error(filename, linenum, 'readability/check', 2, + 'Consider using %s instead of %s(a %s b)' % ( + _CHECK_REPLACEMENT[check_macro][operator], + check_macro, operator)) + + +def CheckAltTokens(filename, clean_lines, linenum, error): + """Check alternative keywords being used in boolean expressions. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + + # Avoid preprocessor lines + if Match(r'^\s*#', line): + return + + # Last ditch effort to avoid multi-line comments. This will not help + # if the comment started before the current line or ended after the + # current line, but it catches most of the false positives. At least, + # it provides a way to workaround this warning for people who use + # multi-line comments in preprocessor macros. + # + # TODO(unknown): remove this once cpplint has better support for + # multi-line comments. + if line.find('/*') >= 0 or line.find('*/') >= 0: + return + + for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): + error(filename, linenum, 'readability/alt_tokens', 2, + 'Use operator %s instead of %s' % ( + _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1))) + + +def GetLineWidth(line): + """Determines the width of the line in column positions. + + Args: + line: A string, which may be a Unicode string. + + Returns: + The width of the line in column positions, accounting for Unicode + combining characters and wide characters. + """ + if isinstance(line, unicode): + width = 0 + for uc in unicodedata.normalize('NFC', line): + if unicodedata.east_asian_width(uc) in ('W', 'F'): + width += 2 + elif not unicodedata.combining(uc): + width += 1 + return width + else: + return len(line) + + +def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, + error): + """Checks rules from the 'C++ style rules' section of cppguide.html. + + Most of these rules are hard to test (naming, comment style), but we + do what we can. In particular we check for 2-space indents, line lengths, + tab usage, spaces inside code, etc. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + file_extension: The extension (without the dot) of the filename. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + + # Don't use "elided" lines here, otherwise we can't check commented lines. + # Don't want to use "raw" either, because we don't want to check inside C++11 + # raw strings, + raw_lines = clean_lines.lines_without_raw_strings + line = raw_lines[linenum] + + if line.find('\t') != -1: + error(filename, linenum, 'whitespace/tab', 1, + 'Tab found; better to use spaces') + + # One or three blank spaces at the beginning of the line is weird; it's + # hard to reconcile that with 2-space indents. + # NOTE: here are the conditions rob pike used for his tests. Mine aren't + # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces + # if(RLENGTH > 20) complain = 0; + # if(match($0, " +(error|private|public|protected):")) complain = 0; + # if(match(prev, "&& *$")) complain = 0; + # if(match(prev, "\\|\\| *$")) complain = 0; + # if(match(prev, "[\",=><] *$")) complain = 0; + # if(match($0, " <<")) complain = 0; + # if(match(prev, " +for \\(")) complain = 0; + # if(prevodd && match(prevprev, " +for \\(")) complain = 0; + initial_spaces = 0 + cleansed_line = clean_lines.elided[linenum] + while initial_spaces < len(line) and line[initial_spaces] == ' ': + initial_spaces += 1 + if line and line[-1].isspace(): + error(filename, linenum, 'whitespace/end_of_line', 4, + 'Line ends in whitespace. Consider deleting these extra spaces.') + # There are certain situations we allow one space, notably for section labels + elif ((initial_spaces == 1 or initial_spaces == 3) and + not Match(r'\s*\w+\s*:\s*$', cleansed_line)): + error(filename, linenum, 'whitespace/indent', 3, + 'Weird number of spaces at line-start. ' + 'Are you using a 2-space indent?') + + # Check if the line is a header guard. + is_header_guard = False + if file_extension == 'h': + cppvar = GetHeaderGuardCPPVariable(filename) + if (line.startswith('#ifndef %s' % cppvar) or + line.startswith('#define %s' % cppvar) or + line.startswith('#endif // %s' % cppvar)): + is_header_guard = True + # #include lines and header guards can be long, since there's no clean way to + # split them. + # + # URLs can be long too. It's possible to split these, but it makes them + # harder to cut&paste. + # + # The "$Id:...$" comment may also get very long without it being the + # developers fault. + if (not line.startswith('#include') and not is_header_guard and + not Match(r'^\s*//.*http(s?)://\S*$', line) and + not Match(r'^// \$Id:.*#[0-9]+ \$$', line)): + line_width = GetLineWidth(line) + extended_length = int((_line_length * 1.25)) + if line_width > extended_length: + error(filename, linenum, 'whitespace/line_length', 4, + 'Lines should very rarely be longer than %i characters' % + extended_length) + elif line_width > _line_length: + error(filename, linenum, 'whitespace/line_length', 2, + 'Lines should be <= %i characters long' % _line_length) + + if (cleansed_line.count(';') > 1 and + # for loops are allowed two ;'s (and may run over two lines). + cleansed_line.find('for') == -1 and + (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or + GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and + # It's ok to have many commands in a switch case that fits in 1 line + not ((cleansed_line.find('case ') != -1 or + cleansed_line.find('default:') != -1) and + cleansed_line.find('break;') != -1)): + error(filename, linenum, 'whitespace/newline', 0, + 'More than one command on the same line') + + # Some more style checks + CheckBraces(filename, clean_lines, linenum, error) + CheckEmptyBlockBody(filename, clean_lines, linenum, error) + CheckAccess(filename, clean_lines, linenum, nesting_state, error) + CheckSpacing(filename, clean_lines, linenum, nesting_state, error) + CheckCheck(filename, clean_lines, linenum, error) + CheckAltTokens(filename, clean_lines, linenum, error) + classinfo = nesting_state.InnermostClass() + if classinfo: + CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) + + +_RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"') +_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') +# Matches the first component of a filename delimited by -s and _s. That is: +# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' +# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' +_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') + + +def _DropCommonSuffixes(filename): + """Drops common suffixes like _test.cc or -inl.h from filename. + + For example: + >>> _DropCommonSuffixes('foo/foo-inl.h') + 'foo/foo' + >>> _DropCommonSuffixes('foo/bar/foo.cc') + 'foo/bar/foo' + >>> _DropCommonSuffixes('foo/foo_internal.h') + 'foo/foo' + >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') + 'foo/foo_unusualinternal' + + Args: + filename: The input filename. + + Returns: + The filename with the common suffix removed. + """ + for suffix in ('test.cc', 'regtest.cc', 'unittest.cc', + 'inl.h', 'impl.h', 'internal.h'): + if (filename.endswith(suffix) and len(filename) > len(suffix) and + filename[-len(suffix) - 1] in ('-', '_')): + return filename[:-len(suffix) - 1] + return os.path.splitext(filename)[0] + + +def _IsTestFilename(filename): + """Determines if the given filename has a suffix that identifies it as a test. + + Args: + filename: The input filename. + + Returns: + True if 'filename' looks like a test, False otherwise. + """ + if (filename.endswith('_test.cc') or + filename.endswith('_unittest.cc') or + filename.endswith('_regtest.cc')): + return True + else: + return False + + +def _ClassifyInclude(fileinfo, include, is_system): + """Figures out what kind of header 'include' is. + + Args: + fileinfo: The current file cpplint is running over. A FileInfo instance. + include: The path to a #included file. + is_system: True if the #include used <> rather than "". + + Returns: + One of the _XXX_HEADER constants. + + For example: + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) + _C_SYS_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) + _CPP_SYS_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) + _LIKELY_MY_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), + ... 'bar/foo_other_ext.h', False) + _POSSIBLE_MY_HEADER + >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) + _OTHER_HEADER + """ + # This is a list of all standard c++ header files, except + # those already checked for above. + is_cpp_h = include in _CPP_HEADERS + + if is_system: + if is_cpp_h: + return _CPP_SYS_HEADER + else: + return _C_SYS_HEADER + + # If the target file and the include we're checking share a + # basename when we drop common extensions, and the include + # lives in . , then it's likely to be owned by the target file. + target_dir, target_base = ( + os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName()))) + include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) + if target_base == include_base and ( + include_dir == target_dir or + include_dir == os.path.normpath(target_dir + '/../public')): + return _LIKELY_MY_HEADER + + # If the target and include share some initial basename + # component, it's possible the target is implementing the + # include, so it's allowed to be first, but we'll never + # complain if it's not there. + target_first_component = _RE_FIRST_COMPONENT.match(target_base) + include_first_component = _RE_FIRST_COMPONENT.match(include_base) + if (target_first_component and include_first_component and + target_first_component.group(0) == + include_first_component.group(0)): + return _POSSIBLE_MY_HEADER + + return _OTHER_HEADER + + + +def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): + """Check rules that are applicable to #include lines. + + Strings on #include lines are NOT removed from elided line, to make + certain tasks easier. However, to prevent false positives, checks + applicable to #include lines in CheckLanguage must be put here. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + include_state: An _IncludeState instance in which the headers are inserted. + error: The function to call with any errors found. + """ + fileinfo = FileInfo(filename) + + line = clean_lines.lines[linenum] + + # "include" should use the new style "foo/bar.h" instead of just "bar.h" + if _RE_PATTERN_INCLUDE_NEW_STYLE.search(line): + error(filename, linenum, 'build/include_dir', 4, + 'Include the directory when naming .h files') + + # we shouldn't include a file more than once. actually, there are a + # handful of instances where doing so is okay, but in general it's + # not. + match = _RE_PATTERN_INCLUDE.search(line) + if match: + include = match.group(2) + is_system = (match.group(1) == '<') + if include in include_state: + error(filename, linenum, 'build/include', 4, + '"%s" already included at %s:%s' % + (include, filename, include_state[include])) + else: + include_state[include] = linenum + + # We want to ensure that headers appear in the right order: + # 1) for foo.cc, foo.h (preferred location) + # 2) c system files + # 3) cpp system files + # 4) for foo.cc, foo.h (deprecated location) + # 5) other google headers + # + # We classify each include statement as one of those 5 types + # using a number of techniques. The include_state object keeps + # track of the highest type seen, and complains if we see a + # lower type after that. + error_message = include_state.CheckNextIncludeOrder( + _ClassifyInclude(fileinfo, include, is_system)) + if error_message: + error(filename, linenum, 'build/include_order', 4, + '%s. Should be: %s.h, c system, c++ system, other.' % + (error_message, fileinfo.BaseName())) + canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) + if not include_state.IsInAlphabeticalOrder( + clean_lines, linenum, canonical_include): + error(filename, linenum, 'build/include_alpha', 4, + 'Include "%s" not in alphabetical order' % include) + include_state.SetLastHeader(canonical_include) + + # Look for any of the stream classes that are part of standard C++. + match = _RE_PATTERN_INCLUDE.match(line) + if match: + include = match.group(2) + if Match(r'(f|ind|io|i|o|parse|pf|stdio|str|)?stream$', include): + # Many unit tests use cout, so we exempt them. + if not _IsTestFilename(filename): + error(filename, linenum, 'readability/streams', 3, + 'Streams are highly discouraged.') + + +def _GetTextInside(text, start_pattern): + r"""Retrieves all the text between matching open and close parentheses. + + Given a string of lines and a regular expression string, retrieve all the text + following the expression and between opening punctuation symbols like + (, [, or {, and the matching close-punctuation symbol. This properly nested + occurrences of the punctuations, so for the text like + printf(a(), b(c())); + a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. + start_pattern must match string having an open punctuation symbol at the end. + + Args: + text: The lines to extract text. Its comments and strings must be elided. + It can be single line and can span multiple lines. + start_pattern: The regexp string indicating where to start extracting + the text. + Returns: + The extracted text. + None if either the opening string or ending punctuation could not be found. + """ + # TODO(sugawarayu): Audit cpplint.py to see what places could be profitably + # rewritten to use _GetTextInside (and use inferior regexp matching today). + + # Give opening punctuations to get the matching close-punctuations. + matching_punctuation = {'(': ')', '{': '}', '[': ']'} + closing_punctuation = set(matching_punctuation.itervalues()) + + # Find the position to start extracting text. + match = re.search(start_pattern, text, re.M) + if not match: # start_pattern not found in text. + return None + start_position = match.end(0) + + assert start_position > 0, ( + 'start_pattern must ends with an opening punctuation.') + assert text[start_position - 1] in matching_punctuation, ( + 'start_pattern must ends with an opening punctuation.') + # Stack of closing punctuations we expect to have in text after position. + punctuation_stack = [matching_punctuation[text[start_position - 1]]] + position = start_position + while punctuation_stack and position < len(text): + if text[position] == punctuation_stack[-1]: + punctuation_stack.pop() + elif text[position] in closing_punctuation: + # A closing punctuation without matching opening punctuations. + return None + elif text[position] in matching_punctuation: + punctuation_stack.append(matching_punctuation[text[position]]) + position += 1 + if punctuation_stack: + # Opening punctuations left without matching close-punctuations. + return None + # punctuations match. + return text[start_position:position - 1] + + +# Patterns for matching call-by-reference parameters. +# +# Supports nested templates up to 2 levels deep using this messy pattern: +# < (?: < (?: < [^<>]* +# > +# | [^<>] )* +# > +# | [^<>] )* +# > +_RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]* +_RE_PATTERN_TYPE = ( + r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?' + r'(?:\w|' + r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|' + r'::)+') +# A call-by-reference parameter ends with '& identifier'. +_RE_PATTERN_REF_PARAM = re.compile( + r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*' + r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]') +# A call-by-const-reference parameter either ends with 'const& identifier' +# or looks like 'const type& identifier' when 'type' is atomic. +_RE_PATTERN_CONST_REF_PARAM = ( + r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT + + r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')') + + +def CheckLanguage(filename, clean_lines, linenum, file_extension, + include_state, nesting_state, error): + """Checks rules from the 'C++ language rules' section of cppguide.html. + + Some of these rules are hard to test (function overloading, using + uint32 inappropriately), but we do the best we can. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + file_extension: The extension (without the dot) of the filename. + include_state: An _IncludeState instance in which the headers are inserted. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + # If the line is empty or consists of entirely a comment, no need to + # check it. + line = clean_lines.elided[linenum] + if not line: + return + + match = _RE_PATTERN_INCLUDE.search(line) + if match: + CheckIncludeLine(filename, clean_lines, linenum, include_state, error) + return + + # Reset include state across preprocessor directives. This is meant + # to silence warnings for conditional includes. + if Match(r'^\s*#\s*(?:ifdef|elif|else|endif)\b', line): + include_state.ResetSection() + + # Make Windows paths like Unix. + fullname = os.path.abspath(filename).replace('\\', '/') + + # TODO(unknown): figure out if they're using default arguments in fn proto. + + # Check to see if they're using an conversion function cast. + # I just try to capture the most common basic types, though there are more. + # Parameterless conversion functions, such as bool(), are allowed as they are + # probably a member operator declaration or default constructor. + match = Search( + r'(\bnew\s+)?\b' # Grab 'new' operator, if it's there + r'(int|float|double|bool|char|int32|uint32|int64|uint64)' + r'(\([^)].*)', line) + if match: + matched_new = match.group(1) + matched_type = match.group(2) + matched_funcptr = match.group(3) + + # gMock methods are defined using some variant of MOCK_METHODx(name, type) + # where type may be float(), int(string), etc. Without context they are + # virtually indistinguishable from int(x) casts. Likewise, gMock's + # MockCallback takes a template parameter of the form return_type(arg_type), + # which looks much like the cast we're trying to detect. + # + # std::function<> wrapper has a similar problem. + # + # Return types for function pointers also look like casts if they + # don't have an extra space. + if (matched_new is None and # If new operator, then this isn't a cast + not (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or + Search(r'\bMockCallback<.*>', line) or + Search(r'\bstd::function<.*>', line)) and + not (matched_funcptr and + Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(', + matched_funcptr))): + # Try a bit harder to catch gmock lines: the only place where + # something looks like an old-style cast is where we declare the + # return type of the mocked method, and the only time when we + # are missing context is if MOCK_METHOD was split across + # multiple lines. The missing MOCK_METHOD is usually one or two + # lines back, so scan back one or two lines. + # + # It's not possible for gmock macros to appear in the first 2 + # lines, since the class head + section name takes up 2 lines. + if (linenum < 2 or + not (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$', + clean_lines.elided[linenum - 1]) or + Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$', + clean_lines.elided[linenum - 2]))): + error(filename, linenum, 'readability/casting', 4, + 'Using deprecated casting style. ' + 'Use static_cast<%s>(...) instead' % + matched_type) + + CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum], + 'static_cast', + r'\((int|float|double|bool|char|u?int(16|32|64))\)', error) + + # This doesn't catch all cases. Consider (const char * const)"hello". + # + # (char *) "foo" should always be a const_cast (reinterpret_cast won't + # compile). + if CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum], + 'const_cast', r'\((char\s?\*+\s?)\)\s*"', error): + pass + else: + # Check pointer casts for other than string constants + CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum], + 'reinterpret_cast', r'\((\w+\s?\*+\s?)\)', error) + + # In addition, we look for people taking the address of a cast. This + # is dangerous -- casts can assign to temporaries, so the pointer doesn't + # point where you think. + match = Search( + r'(?:&\(([^)]+)\)[\w(])|' + r'(?:&(static|dynamic|down|reinterpret)_cast\b)', line) + if match and match.group(1) != '*': + error(filename, linenum, 'runtime/casting', 4, + ('Are you taking an address of a cast? ' + 'This is dangerous: could be a temp var. ' + 'Take the address before doing the cast, rather than after')) + + # Create an extended_line, which is the concatenation of the current and + # next lines, for more effective checking of code that may span more than one + # line. + if linenum + 1 < clean_lines.NumLines(): + extended_line = line + clean_lines.elided[linenum + 1] + else: + extended_line = line + + # Check for people declaring static/global STL strings at the top level. + # This is dangerous because the C++ language does not guarantee that + # globals with constructors are initialized before the first access. + match = Match( + r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)', + line) + # Make sure it's not a function. + # Function template specialization looks like: "string foo(...". + # Class template definitions look like: "string Foo::Method(...". + # + # Also ignore things that look like operators. These are matched separately + # because operator names cross non-word boundaries. If we change the pattern + # above, we would decrease the accuracy of matching identifiers. + if (match and + not Search(r'\boperator\W', line) and + not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)?\s*\(([^"]|$)', match.group(3))): + error(filename, linenum, 'runtime/string', 4, + 'For a static/global string constant, use a C style string instead: ' + '"%schar %s[]".' % + (match.group(1), match.group(2))) + + if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line): + error(filename, linenum, 'runtime/init', 4, + 'You seem to be initializing a member variable with itself.') + + if file_extension == 'h': + # TODO(unknown): check that 1-arg constructors are explicit. + # How to tell it's a constructor? + # (handled in CheckForNonStandardConstructs for now) + # TODO(unknown): check that classes have DISALLOW_EVIL_CONSTRUCTORS + # (level 1 error) + pass + + # Check if people are using the verboten C basic types. The only exception + # we regularly allow is "unsigned short port" for port. + if Search(r'\bshort port\b', line): + if not Search(r'\bunsigned short port\b', line): + error(filename, linenum, 'runtime/int', 4, + 'Use "unsigned short" for ports, not "short"') + else: + match = Search(r'\b(short|long(?! +double)|long long)\b', line) + if match: + error(filename, linenum, 'runtime/int', 4, + 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) + + # When snprintf is used, the second argument shouldn't be a literal. + match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) + if match and match.group(2) != '0': + # If 2nd arg is zero, snprintf is used to calculate size. + error(filename, linenum, 'runtime/printf', 3, + 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' + 'to snprintf.' % (match.group(1), match.group(2))) + + # Check if some verboten C functions are being used. + if Search(r'\bsprintf\b', line): + error(filename, linenum, 'runtime/printf', 5, + 'Never use sprintf. Use snprintf instead.') + match = Search(r'\b(strcpy|strcat)\b', line) + if match: + error(filename, linenum, 'runtime/printf', 4, + 'Almost always, snprintf is better than %s' % match.group(1)) + + # Check if some verboten operator overloading is going on + # TODO(unknown): catch out-of-line unary operator&: + # class X {}; + # int operator&(const X& x) { return 42; } // unary operator& + # The trick is it's hard to tell apart from binary operator&: + # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& + if Search(r'\boperator\s*&\s*\(\s*\)', line): + error(filename, linenum, 'runtime/operator', 4, + 'Unary operator& is dangerous. Do not use it.') + + # Check for suspicious usage of "if" like + # } if (a == b) { + if Search(r'\}\s*if\s*\(', line): + error(filename, linenum, 'readability/braces', 4, + 'Did you mean "else if"? If not, start a new line for "if".') + + # Check for potential format string bugs like printf(foo). + # We constrain the pattern not to pick things like DocidForPrintf(foo). + # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) + # TODO(sugawarayu): Catch the following case. Need to change the calling + # convention of the whole function to process multiple line to handle it. + # printf( + # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); + printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(') + if printf_args: + match = Match(r'([\w.\->()]+)$', printf_args) + if match and match.group(1) != '__VA_ARGS__': + function_name = re.search(r'\b((?:string)?printf)\s*\(', + line, re.I).group(1) + error(filename, linenum, 'runtime/printf', 4, + 'Potential format string bug. Do %s("%%s", %s) instead.' + % (function_name, match.group(1))) + + # Check for potential memset bugs like memset(buf, sizeof(buf), 0). + match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line) + if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): + error(filename, linenum, 'runtime/memset', 4, + 'Did you mean "memset(%s, 0, %s)"?' + % (match.group(1), match.group(2))) + + if Search(r'\busing namespace\b', line): + error(filename, linenum, 'build/namespaces', 5, + 'Do not use namespace using-directives. ' + 'Use using-declarations instead.') + + # Detect variable-length arrays. + match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line) + if (match and match.group(2) != 'return' and match.group(2) != 'delete' and + match.group(3).find(']') == -1): + # Split the size using space and arithmetic operators as delimiters. + # If any of the resulting tokens are not compile time constants then + # report the error. + tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3)) + is_const = True + skip_next = False + for tok in tokens: + if skip_next: + skip_next = False + continue + + if Search(r'sizeof\(.+\)', tok): continue + if Search(r'arraysize\(\w+\)', tok): continue + + tok = tok.lstrip('(') + tok = tok.rstrip(')') + if not tok: continue + if Match(r'\d+', tok): continue + if Match(r'0[xX][0-9a-fA-F]+', tok): continue + if Match(r'k[A-Z0-9]\w*', tok): continue + if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue + if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue + # A catch all for tricky sizeof cases, including 'sizeof expression', + # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' + # requires skipping the next token because we split on ' ' and '*'. + if tok.startswith('sizeof'): + skip_next = True + continue + is_const = False + break + if not is_const: + error(filename, linenum, 'runtime/arrays', 1, + 'Do not use variable-length arrays. Use an appropriately named ' + "('k' followed by CamelCase) compile-time constant for the size.") + + # If DISALLOW_EVIL_CONSTRUCTORS, DISALLOW_COPY_AND_ASSIGN, or + # DISALLOW_IMPLICIT_CONSTRUCTORS is present, then it should be the last thing + # in the class declaration. + match = Match( + (r'\s*' + r'(DISALLOW_(EVIL_CONSTRUCTORS|COPY_AND_ASSIGN|IMPLICIT_CONSTRUCTORS))' + r'\(.*\);$'), + line) + if match and linenum + 1 < clean_lines.NumLines(): + next_line = clean_lines.elided[linenum + 1] + # We allow some, but not all, declarations of variables to be present + # in the statement that defines the class. The [\w\*,\s]* fragment of + # the regular expression below allows users to declare instances of + # the class or pointers to instances, but not less common types such + # as function pointers or arrays. It's a tradeoff between allowing + # reasonable code and avoiding trying to parse more C++ using regexps. + if not Search(r'^\s*}[\w\*,\s]*;', next_line): + error(filename, linenum, 'readability/constructors', 3, + match.group(1) + ' should be the last thing in the class') + + # Check for use of unnamed namespaces in header files. Registration + # macros are typically OK, so we allow use of "namespace {" on lines + # that end with backslashes. + if (file_extension == 'h' + and Search(r'\bnamespace\s*{', line) + and line[-1] != '\\'): + error(filename, linenum, 'build/namespaces', 4, + 'Do not use unnamed namespaces in header files. See ' + 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces' + ' for more information.') + +def CheckForNonConstReference(filename, clean_lines, linenum, + nesting_state, error): + """Check for non-const references. + + Separate from CheckLanguage since it scans backwards from current + line, instead of scanning forward. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: The function to call with any errors found. + """ + # Do nothing if there is no '&' on current line. + line = clean_lines.elided[linenum] + if '&' not in line: + return + + # Long type names may be broken across multiple lines, usually in one + # of these forms: + # LongType + # ::LongTypeContinued &identifier + # LongType:: + # LongTypeContinued &identifier + # LongType< + # ...>::LongTypeContinued &identifier + # + # If we detected a type split across two lines, join the previous + # line to current line so that we can match const references + # accordingly. + # + # Note that this only scans back one line, since scanning back + # arbitrary number of lines would be expensive. If you have a type + # that spans more than 2 lines, please use a typedef. + if linenum > 1: + previous = None + if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line): + # previous_line\n + ::current_line + previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$', + clean_lines.elided[linenum - 1]) + elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line): + # previous_line::\n + current_line + previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$', + clean_lines.elided[linenum - 1]) + if previous: + line = previous.group(1) + line.lstrip() + else: + # Check for templated parameter that is split across multiple lines + endpos = line.rfind('>') + if endpos > -1: + (_, startline, startpos) = ReverseCloseExpression( + clean_lines, linenum, endpos) + if startpos > -1 and startline < linenum: + # Found the matching < on an earlier line, collect all + # pieces up to current line. + line = '' + for i in xrange(startline, linenum + 1): + line += clean_lines.elided[i].strip() + + # Check for non-const references in function parameters. A single '&' may + # found in the following places: + # inside expression: binary & for bitwise AND + # inside expression: unary & for taking the address of something + # inside declarators: reference parameter + # We will exclude the first two cases by checking that we are not inside a + # function body, including one that was just introduced by a trailing '{'. + # TODO(unknwon): Doesn't account for preprocessor directives. + # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare]. + check_params = False + if not nesting_state.stack: + check_params = True # top level + elif (isinstance(nesting_state.stack[-1], _ClassInfo) or + isinstance(nesting_state.stack[-1], _NamespaceInfo)): + check_params = True # within class or namespace + elif Match(r'.*{\s*$', line): + if (len(nesting_state.stack) == 1 or + isinstance(nesting_state.stack[-2], _ClassInfo) or + isinstance(nesting_state.stack[-2], _NamespaceInfo)): + check_params = True # just opened global/class/namespace block + # We allow non-const references in a few standard places, like functions + # called "swap()" or iostream operators like "<<" or ">>". Do not check + # those function parameters. + # + # We also accept & in static_assert, which looks like a function but + # it's actually a declaration expression. + whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|' + r'operator\s*[<>][<>]|' + r'static_assert|COMPILE_ASSERT' + r')\s*\(') + if Search(whitelisted_functions, line): + check_params = False + elif not Search(r'\S+\([^)]*$', line): + # Don't see a whitelisted function on this line. Actually we + # didn't see any function name on this line, so this is likely a + # multi-line parameter list. Try a bit harder to catch this case. + for i in xrange(2): + if (linenum > i and + Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])): + check_params = False + break + + if check_params: + decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body + for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): + if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter): + error(filename, linenum, 'runtime/references', 2, + 'Is this a non-const reference? ' + 'If so, make const or use a pointer: ' + + ReplaceAll(' *<', '<', parameter)) + + +def CheckCStyleCast(filename, linenum, line, raw_line, cast_type, pattern, + error): + """Checks for a C-style cast by looking for the pattern. + + Args: + filename: The name of the current file. + linenum: The number of the line to check. + line: The line of code to check. + raw_line: The raw line of code to check, with comments. + cast_type: The string for the C++ cast to recommend. This is either + reinterpret_cast, static_cast, or const_cast, depending. + pattern: The regular expression used to find C-style casts. + error: The function to call with any errors found. + + Returns: + True if an error was emitted. + False otherwise. + """ + match = Search(pattern, line) + if not match: + return False + + # Exclude lines with sizeof, since sizeof looks like a cast. + sizeof_match = Match(r'.*sizeof\s*$', line[0:match.start(1) - 1]) + if sizeof_match: + return False + + # operator++(int) and operator--(int) + if (line[0:match.start(1) - 1].endswith(' operator++') or + line[0:match.start(1) - 1].endswith(' operator--')): + return False + + # A single unnamed argument for a function tends to look like old + # style cast. If we see those, don't issue warnings for deprecated + # casts, instead issue warnings for unnamed arguments where + # appropriate. + # + # These are things that we want warnings for, since the style guide + # explicitly require all parameters to be named: + # Function(int); + # Function(int) { + # ConstMember(int) const; + # ConstMember(int) const { + # ExceptionMember(int) throw (...); + # ExceptionMember(int) throw (...) { + # PureVirtual(int) = 0; + # + # These are functions of some sort, where the compiler would be fine + # if they had named parameters, but people often omit those + # identifiers to reduce clutter: + # (FunctionPointer)(int); + # (FunctionPointer)(int) = value; + # Function((function_pointer_arg)(int)) + # ; + # <(FunctionPointerTemplateArgument)(int)>; + remainder = line[match.end(0):] + if Match(r'^\s*(?:;|const\b|throw\b|=|>|\{|\))', remainder): + # Looks like an unnamed parameter. + + # Don't warn on any kind of template arguments. + if Match(r'^\s*>', remainder): + return False + + # Don't warn on assignments to function pointers, but keep warnings for + # unnamed parameters to pure virtual functions. Note that this pattern + # will also pass on assignments of "0" to function pointers, but the + # preferred values for those would be "nullptr" or "NULL". + matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder) + if matched_zero and matched_zero.group(1) != '0': + return False + + # Don't warn on function pointer declarations. For this we need + # to check what came before the "(type)" string. + if Match(r'.*\)\s*$', line[0:match.start(0)]): + return False + + # Don't warn if the parameter is named with block comments, e.g.: + # Function(int /*unused_param*/); + if '/*' in raw_line: + return False + + # Passed all filters, issue warning here. + error(filename, linenum, 'readability/function', 3, + 'All parameters should be named in a function') + return True + + # At this point, all that should be left is actual casts. + error(filename, linenum, 'readability/casting', 4, + 'Using C-style cast. Use %s<%s>(...) instead' % + (cast_type, match.group(1))) + + return True + + +_HEADERS_CONTAINING_TEMPLATES = ( + ('', ('deque',)), + ('', ('unary_function', 'binary_function', + 'plus', 'minus', 'multiplies', 'divides', 'modulus', + 'negate', + 'equal_to', 'not_equal_to', 'greater', 'less', + 'greater_equal', 'less_equal', + 'logical_and', 'logical_or', 'logical_not', + 'unary_negate', 'not1', 'binary_negate', 'not2', + 'bind1st', 'bind2nd', + 'pointer_to_unary_function', + 'pointer_to_binary_function', + 'ptr_fun', + 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t', + 'mem_fun_ref_t', + 'const_mem_fun_t', 'const_mem_fun1_t', + 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t', + 'mem_fun_ref', + )), + ('', ('numeric_limits',)), + ('', ('list',)), + ('', ('map', 'multimap',)), + ('', ('allocator',)), + ('', ('queue', 'priority_queue',)), + ('', ('set', 'multiset',)), + ('', ('stack',)), + ('', ('char_traits', 'basic_string',)), + ('', ('pair',)), + ('', ('vector',)), + + # gcc extensions. + # Note: std::hash is their hash, ::hash is our hash + ('', ('hash_map', 'hash_multimap',)), + ('', ('hash_set', 'hash_multiset',)), + ('', ('slist',)), + ) + +_RE_PATTERN_STRING = re.compile(r'\bstring\b') + +_re_pattern_algorithm_header = [] +for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', + 'transform'): + # Match max(..., ...), max(..., ...), but not foo->max, foo.max or + # type::max(). + _re_pattern_algorithm_header.append( + (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), + _template, + '')) + +_re_pattern_templates = [] +for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: + for _template in _templates: + _re_pattern_templates.append( + (re.compile(r'(\<|\b)' + _template + r'\s*\<'), + _template + '<>', + _header)) + + +def FilesBelongToSameModule(filename_cc, filename_h): + """Check if these two filenames belong to the same module. + + The concept of a 'module' here is a as follows: + foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the + same 'module' if they are in the same directory. + some/path/public/xyzzy and some/path/internal/xyzzy are also considered + to belong to the same module here. + + If the filename_cc contains a longer path than the filename_h, for example, + '/absolute/path/to/base/sysinfo.cc', and this file would include + 'base/sysinfo.h', this function also produces the prefix needed to open the + header. This is used by the caller of this function to more robustly open the + header file. We don't have access to the real include paths in this context, + so we need this guesswork here. + + Known bugs: tools/base/bar.cc and base/bar.h belong to the same module + according to this implementation. Because of this, this function gives + some false positives. This should be sufficiently rare in practice. + + Args: + filename_cc: is the path for the .cc file + filename_h: is the path for the header path + + Returns: + Tuple with a bool and a string: + bool: True if filename_cc and filename_h belong to the same module. + string: the additional prefix needed to open the header file. + """ + + if not filename_cc.endswith('.cc'): + return (False, '') + filename_cc = filename_cc[:-len('.cc')] + if filename_cc.endswith('_unittest'): + filename_cc = filename_cc[:-len('_unittest')] + elif filename_cc.endswith('_test'): + filename_cc = filename_cc[:-len('_test')] + filename_cc = filename_cc.replace('/public/', '/') + filename_cc = filename_cc.replace('/internal/', '/') + + if not filename_h.endswith('.h'): + return (False, '') + filename_h = filename_h[:-len('.h')] + if filename_h.endswith('-inl'): + filename_h = filename_h[:-len('-inl')] + filename_h = filename_h.replace('/public/', '/') + filename_h = filename_h.replace('/internal/', '/') + + files_belong_to_same_module = filename_cc.endswith(filename_h) + common_path = '' + if files_belong_to_same_module: + common_path = filename_cc[:-len(filename_h)] + return files_belong_to_same_module, common_path + + +def UpdateIncludeState(filename, include_state, io=codecs): + """Fill up the include_state with new includes found from the file. + + Args: + filename: the name of the header to read. + include_state: an _IncludeState instance in which the headers are inserted. + io: The io factory to use to read the file. Provided for testability. + + Returns: + True if a header was succesfully added. False otherwise. + """ + headerfile = None + try: + headerfile = io.open(filename, 'r', 'utf8', 'replace') + except IOError: + return False + linenum = 0 + for line in headerfile: + linenum += 1 + clean_line = CleanseComments(line) + match = _RE_PATTERN_INCLUDE.search(clean_line) + if match: + include = match.group(2) + # The value formatting is cute, but not really used right now. + # What matters here is that the key is in include_state. + include_state.setdefault(include, '%s:%d' % (filename, linenum)) + return True + + +def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, + io=codecs): + """Reports for missing stl includes. + + This function will output warnings to make sure you are including the headers + necessary for the stl containers and functions that you use. We only give one + reason to include a header. For example, if you use both equal_to<> and + less<> in a .h file, only one (the latter in the file) of these will be + reported as a reason to include the . + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + include_state: An _IncludeState instance. + error: The function to call with any errors found. + io: The IO factory to use to read the header file. Provided for unittest + injection. + """ + required = {} # A map of header name to linenumber and the template entity. + # Example of required: { '': (1219, 'less<>') } + + for linenum in xrange(clean_lines.NumLines()): + line = clean_lines.elided[linenum] + if not line or line[0] == '#': + continue + + # String is special -- it is a non-templatized type in STL. + matched = _RE_PATTERN_STRING.search(line) + if matched: + # Don't warn about strings in non-STL namespaces: + # (We check only the first match per line; good enough.) + prefix = line[:matched.start()] + if prefix.endswith('std::') or not prefix.endswith('::'): + required[''] = (linenum, 'string') + + for pattern, template, header in _re_pattern_algorithm_header: + if pattern.search(line): + required[header] = (linenum, template) + + # The following function is just a speed up, no semantics are changed. + if not '<' in line: # Reduces the cpu time usage by skipping lines. + continue + + for pattern, template, header in _re_pattern_templates: + if pattern.search(line): + required[header] = (linenum, template) + + # The policy is that if you #include something in foo.h you don't need to + # include it again in foo.cc. Here, we will look at possible includes. + # Let's copy the include_state so it is only messed up within this function. + include_state = include_state.copy() + + # Did we find the header for this file (if any) and succesfully load it? + header_found = False + + # Use the absolute path so that matching works properly. + abs_filename = FileInfo(filename).FullName() + + # For Emacs's flymake. + # If cpplint is invoked from Emacs's flymake, a temporary file is generated + # by flymake and that file name might end with '_flymake.cc'. In that case, + # restore original file name here so that the corresponding header file can be + # found. + # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' + # instead of 'foo_flymake.h' + abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) + + # include_state is modified during iteration, so we iterate over a copy of + # the keys. + header_keys = include_state.keys() + for header in header_keys: + (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) + fullpath = common_path + header + if same_module and UpdateIncludeState(fullpath, include_state, io): + header_found = True + + # If we can't find the header file for a .cc, assume it's because we don't + # know where to look. In that case we'll give up as we're not sure they + # didn't include it in the .h file. + # TODO(unknown): Do a better job of finding .h files so we are confident that + # not having the .h file means there isn't one. + if filename.endswith('.cc') and not header_found: + return + + # All the lines have been processed, report the errors found. + for required_header_unstripped in required: + template = required[required_header_unstripped][1] + if required_header_unstripped.strip('<>"') not in include_state: + error(filename, required[required_header_unstripped][0], + 'build/include_what_you_use', 4, + 'Add #include ' + required_header_unstripped + ' for ' + template) + + +_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<') + + +def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): + """Check that make_pair's template arguments are deduced. + + G++ 4.6 in C++0x mode fails badly if make_pair's template arguments are + specified explicitly, and such use isn't intended in any case. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) + if match: + error(filename, linenum, 'build/explicit_make_pair', + 4, # 4 = high confidence + 'For C++11-compatibility, omit template arguments from make_pair' + ' OR use pair directly OR if appropriate, construct a pair directly') + + +def ProcessLine(filename, file_extension, clean_lines, line, + include_state, function_state, nesting_state, error, + extra_check_functions=[]): + """Processes a single line in the file. + + Args: + filename: Filename of the file that is being processed. + file_extension: The extension (dot not included) of the file. + clean_lines: An array of strings, each representing a line of the file, + with comments stripped. + line: Number of line being processed. + include_state: An _IncludeState instance in which the headers are inserted. + function_state: A _FunctionState instance which counts function lines, etc. + nesting_state: A _NestingState instance which maintains information about + the current stack of nested blocks being parsed. + error: A callable to which errors are reported, which takes 4 arguments: + filename, line number, error level, and message + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + raw_lines = clean_lines.raw_lines + ParseNolintSuppressions(filename, raw_lines[line], line, error) + nesting_state.Update(filename, clean_lines, line, error) + if nesting_state.stack and nesting_state.stack[-1].inline_asm != _NO_ASM: + return + CheckForFunctionLengths(filename, clean_lines, line, function_state, error) + CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) + CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error) + CheckLanguage(filename, clean_lines, line, file_extension, include_state, + nesting_state, error) + CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) + CheckForNonStandardConstructs(filename, clean_lines, line, + nesting_state, error) + CheckVlogArguments(filename, clean_lines, line, error) + CheckPosixThreading(filename, clean_lines, line, error) + CheckInvalidIncrement(filename, clean_lines, line, error) + CheckMakePairUsesDeduction(filename, clean_lines, line, error) + for check_fn in extra_check_functions: + check_fn(filename, clean_lines, line, error) + +def ProcessFileData(filename, file_extension, lines, error, + extra_check_functions=[]): + """Performs lint checks and reports any errors to the given error function. + + Args: + filename: Filename of the file that is being processed. + file_extension: The extension (dot not included) of the file. + lines: An array of strings, each representing a line of the file, with the + last element being empty if the file is terminated with a newline. + error: A callable to which errors are reported, which takes 4 arguments: + filename, line number, error level, and message + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + lines = (['// marker so line numbers and indices both start at 1'] + lines + + ['// marker so line numbers end in a known way']) + + include_state = _IncludeState() + function_state = _FunctionState() + nesting_state = _NestingState() + + ResetNolintSuppressions() + + CheckForCopyright(filename, lines, error) + + if file_extension == 'h': + CheckForHeaderGuard(filename, lines, error) + + RemoveMultiLineComments(filename, lines, error) + clean_lines = CleansedLines(lines) + for line in xrange(clean_lines.NumLines()): + ProcessLine(filename, file_extension, clean_lines, line, + include_state, function_state, nesting_state, error, + extra_check_functions) + nesting_state.CheckCompletedBlocks(filename, error) + + CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) + + # We check here rather than inside ProcessLine so that we see raw + # lines rather than "cleaned" lines. + CheckForBadCharacters(filename, lines, error) + + CheckForNewlineAtEOF(filename, lines, error) + +def ProcessFile(filename, vlevel, extra_check_functions=[]): + """Does google-lint on a single file. + + Args: + filename: The name of the file to parse. + + vlevel: The level of errors to report. Every error of confidence + >= verbose_level will be reported. 0 is a good default. + + extra_check_functions: An array of additional check functions that will be + run on each source line. Each function takes 4 + arguments: filename, clean_lines, line, error + """ + + _SetVerboseLevel(vlevel) + + try: + # Support the UNIX convention of using "-" for stdin. Note that + # we are not opening the file with universal newline support + # (which codecs doesn't support anyway), so the resulting lines do + # contain trailing '\r' characters if we are reading a file that + # has CRLF endings. + # If after the split a trailing '\r' is present, it is removed + # below. If it is not expected to be present (i.e. os.linesep != + # '\r\n' as in Windows), a warning is issued below if this file + # is processed. + + if filename == '-': + lines = codecs.StreamReaderWriter(sys.stdin, + codecs.getreader('utf8'), + codecs.getwriter('utf8'), + 'replace').read().split('\n') + else: + lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n') + + carriage_return_found = False + # Remove trailing '\r'. + for linenum in range(len(lines)): + if lines[linenum].endswith('\r'): + lines[linenum] = lines[linenum].rstrip('\r') + carriage_return_found = True + + except IOError: + sys.stderr.write( + "Skipping input '%s': Can't open for reading\n" % filename) + return + + # Note, if no dot is found, this will give the entire filename as the ext. + file_extension = filename[filename.rfind('.') + 1:] + + # When reading from stdin, the extension is unknown, so no cpplint tests + # should rely on the extension. + if filename != '-' and file_extension not in _valid_extensions: + sys.stderr.write('Ignoring %s; not a valid file name ' + '(%s)\n' % (filename, ', '.join(_valid_extensions))) + else: + ProcessFileData(filename, file_extension, lines, Error, + extra_check_functions) + if carriage_return_found and os.linesep != '\r\n': + # Use 0 for linenum since outputting only one error for potentially + # several lines. + Error(filename, 0, 'whitespace/newline', 1, + 'One or more unexpected \\r (^M) found;' + 'better to use only a \\n') + + sys.stderr.write('Done processing %s\n' % filename) + + +def PrintUsage(message): + """Prints a brief usage string and exits, optionally with an error message. + + Args: + message: The optional error message. + """ + sys.stderr.write(_USAGE) + if message: + sys.exit('\nFATAL ERROR: ' + message) + else: + sys.exit(1) + + +def PrintCategories(): + """Prints a list of all the error-categories used by error messages. + + These are the categories used to filter messages via --filter. + """ + sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) + sys.exit(0) + + +def ParseArguments(args): + """Parses the command line arguments. + + This may set the output format and verbosity level as side-effects. + + Args: + args: The command line arguments: + + Returns: + The list of filenames to lint. + """ + try: + (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=', + 'counting=', + 'filter=', + 'root=', + 'linelength=', + 'extensions=']) + except getopt.GetoptError: + PrintUsage('Invalid arguments.') + + verbosity = _VerboseLevel() + output_format = _OutputFormat() + filters = '' + counting_style = '' + + for (opt, val) in opts: + if opt == '--help': + PrintUsage(None) + elif opt == '--output': + if val not in ('emacs', 'vs7', 'eclipse'): + PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.') + output_format = val + elif opt == '--verbose': + verbosity = int(val) + elif opt == '--filter': + filters = val + if not filters: + PrintCategories() + elif opt == '--counting': + if val not in ('total', 'toplevel', 'detailed'): + PrintUsage('Valid counting options are total, toplevel, and detailed') + counting_style = val + elif opt == '--root': + global _root + _root = val + elif opt == '--linelength': + global _line_length + try: + _line_length = int(val) + except ValueError: + PrintUsage('Line length must be digits.') + elif opt == '--extensions': + global _valid_extensions + try: + _valid_extensions = set(val.split(',')) + except ValueError: + PrintUsage('Extensions must be comma seperated list.') + + if not filenames: + PrintUsage('No files were specified.') + + _SetOutputFormat(output_format) + _SetVerboseLevel(verbosity) + _SetFilters(filters) + _SetCountingStyle(counting_style) + + return filenames + + +def main(): + filenames = ParseArguments(sys.argv[1:]) + + # Change stderr to write with replacement characters so we don't die + # if we try to print something containing non-ASCII characters. + sys.stderr = codecs.StreamReaderWriter(sys.stderr, + codecs.getreader('utf8'), + codecs.getwriter('utf8'), + 'replace') + + _cpplint_state.ResetErrorCounts() + for filename in filenames: + ProcessFile(filename, _cpplint_state.verbose_level) + _cpplint_state.PrintErrorCounts() + + sys.exit(_cpplint_state.error_count > 0) + + +if __name__ == '__main__': + main() diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 7498579440b..f47173afcae 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -10,8 +10,8 @@ namespace caffe { shared_ptr Caffe::singleton_; -long cluster_seedgen(void) { - long s, seed, pid; +int64_t cluster_seedgen(void) { + int64_t s, seed, pid; pid = getpid(); s = time(NULL); seed = abs(((s * 181) * ((pid - 83) * 359)) % 104729); @@ -36,7 +36,8 @@ Caffe::Caffe() } // Try to create a vsl stream. This should almost always work, but we will // check it anyway. - if (vslNewStream(&vsl_stream_, VSL_BRNG_MT19937, cluster_seedgen()) != VSL_STATUS_OK) { + if (vslNewStream(&vsl_stream_, VSL_BRNG_MT19937, + cluster_seedgen()) != VSL_STATUS_OK) { LOG(ERROR) << "Cannot create vsl stream. VSL random number generator " << "won't be available."; } @@ -48,7 +49,7 @@ Caffe::~Caffe() { CURAND_CHECK(curandDestroyGenerator(curand_generator_)); } if (vsl_stream_) VSL_CHECK(vslDeleteStream(&vsl_stream_)); -}; +} void Caffe::set_random_seed(const unsigned int seed) { // Curand seed diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 263baf543eb..1002c599d72 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -23,18 +23,22 @@ Layer* GetLayer(const LayerParameter& param) { return new AccuracyLayer(param); } else if (type == "bnll") { return new BNLLLayer(param); + } else if (type == "concat") { + return new ConcatLayer(param); } else if (type == "conv") { return new ConvolutionLayer(param); } else if (type == "data") { return new DataLayer(param); - } else if (type == "images") { - return new ImagesLayer(param); } else if (type == "dropout") { return new DropoutLayer(param); } else if (type == "euclidean_loss") { return new EuclideanLossLayer(param); } else if (type == "flatten") { return new FlattenLayer(param); + } else if (type == "hdf5_data") { + return new HDF5DataLayer(param); + } else if (type == "images") { + return new ImagesLayer(param); } else if (type == "im2col") { return new Im2colLayer(param); } else if (type == "infogain_loss") { @@ -43,14 +47,14 @@ Layer* GetLayer(const LayerParameter& param) { return new InnerProductLayer(param); } else if (type == "lrn") { return new LRNLayer(param); + } else if (type == "multinomial_logistic_loss") { + return new MultinomialLogisticLossLayer(param); } else if (type == "padding") { return new PaddingLayer(param); } else if (type == "pool") { return new PoolingLayer(param); } else if (type == "relu") { return new ReLULayer(param); - } else if (type == "tanh") { - return new TanHLayer(param); } else if (type == "sigmoid") { return new SigmoidLayer(param); } else if (type == "softmax") { @@ -59,8 +63,8 @@ Layer* GetLayer(const LayerParameter& param) { return new SoftmaxWithLossLayer(param); } else if (type == "split") { return new SplitLayer(param); - } else if (type == "multinomial_logistic_loss") { - return new MultinomialLogisticLossLayer(param); + } else if (type == "tanh") { + return new TanHLayer(param); } else { LOG(FATAL) << "Unknown layer name: " << type; } diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp new file mode 100644 index 00000000000..b769a35212a --- /dev/null +++ b/src/caffe/layers/bnll_layer.cpp @@ -0,0 +1,50 @@ +// Copyright 2013 Yangqing Jia + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +using std::min; + +namespace caffe { + +const float kBNLL_THRESHOLD = 50.; + +template +void BNLLLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int count = bottom[0]->count(); + for (int i = 0; i < count; ++i) { + top_data[i] = bottom_data[i] > 0 ? + bottom_data[i] + log(1. + exp(-bottom_data[i])) : + log(1. + exp(bottom_data[i])); + } +} + +template +Dtype BNLLLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + if (propagate_down) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const int count = (*bottom)[0]->count(); + Dtype expval; + for (int i = 0; i < count; ++i) { + expval = exp(min(bottom_data[i], Dtype(kBNLL_THRESHOLD))); + bottom_diff[i] = top_diff[i] * expval / (expval + 1.); + } + } + return Dtype(0); +} + + +INSTANTIATE_CLASS(BNLLLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 2c06a63da5d..1fd200894c3 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -1,8 +1,10 @@ // Copyright 2013 Yangqing Jia +#include +#include + #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -#include using std::max; @@ -10,41 +12,9 @@ namespace caffe { const float kBNLL_THRESHOLD = 50.; -template -void BNLLLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int count = bottom[0]->count(); - for (int i = 0; i < count; ++i) { - top_data[i] = bottom_data[i] > 0 ? - bottom_data[i] + log(1. + exp(-bottom_data[i])) : - log(1. + exp(bottom_data[i])); - } -} - -template -Dtype BNLLLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); - Dtype expval; - for (int i = 0; i < count; ++i) { - expval = exp(min(bottom_data[i], Dtype(kBNLL_THRESHOLD))); - bottom_diff[i] = top_diff[i] * expval / (expval + 1.); - } - } - return Dtype(0); -} - template __global__ void BNLLForward(const int n, const Dtype* in, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out[index] = in[index] > 0 ? in[index] + log(1. + exp(-in[index])) : log(1. + exp(in[index])); @@ -57,6 +27,7 @@ void BNLLLayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) BNLLForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; @@ -65,8 +36,7 @@ void BNLLLayer::Forward_gpu(const vector*>& bottom, template __global__ void BNLLBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { Dtype expval = exp(min(in_data[index], Dtype(kBNLL_THRESHOLD))); out_diff[index] = in_diff[index] * expval / (expval + 1.); } @@ -81,6 +51,7 @@ Dtype BNLLLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) BNLLBackward<<>>( count, top_diff, bottom_data, bottom_diff); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp new file mode 100644 index 00000000000..dc949c14010 --- /dev/null +++ b/src/caffe/layers/concat_layer.cpp @@ -0,0 +1,108 @@ +// Copyright 2014 Sergio Guadarrama + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void ConcatLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_GT(bottom.size(), 1) << + "Concat Layer takes at least two blobs as input."; + CHECK_EQ(top->size(), 1) << + "Concat Layer takes a single blob as output."; + concat_dim_ = this->layer_param_.concat_dim(); + CHECK_GE(concat_dim_, 0) << "concat_dim should be >= 0"; + CHECK_LE(concat_dim_, 1) << + "For now concat_dim <=1, it can only concat num and channels"; + // Intialize with the first blob + COUNT_ = bottom[0]->count(); + NUM_ = bottom[0]->num(); + CHANNELS_ = bottom[0]->channels(); + HEIGHT_ = bottom[0]->height(); + WIDTH_ = bottom[0]->width(); + for (int i = 1; i < bottom.size(); ++i) { + COUNT_ += bottom[i]->count(); + if (concat_dim_== 0) { + NUM_ += bottom[i]->num(); + } else if (concat_dim_ == 1) { + CHANNELS_ += bottom[i]->channels(); + } else if (concat_dim_ == 2) { + HEIGHT_ += bottom[i]->height(); + } else if (concat_dim_ == 3) { + WIDTH_ += bottom[i]->width(); + } + } + (*top)[0]->Reshape(NUM_, CHANNELS_, HEIGHT_, WIDTH_); + CHECK_EQ(COUNT_, (*top)[0]->count()); +} + +template +void ConcatLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + if (concat_dim_== 0) { + int offset_num = 0; + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + int num_elem = bottom[i]->count(); + caffe_copy(num_elem, bottom_data, top_data+(*top)[0]->offset(offset_num)); + offset_num += bottom[i]->num(); + } + } else if (concat_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + int num_elem = + bottom[i]->channels()*bottom[i]->height()*bottom[i]->width(); + for (int n = 0; n < NUM_; ++n) { + caffe_copy(num_elem, bottom_data+bottom[i]->offset(n), + top_data+(*top)[0]->offset(n, offset_channel)); + } + offset_channel += bottom[i]->channels(); + } + } else { + LOG(FATAL) << "concat_dim along dim" << concat_dim_ << + " not implemented yet"; + } +} + +template +Dtype ConcatLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + if (concat_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < bottom->size(); ++i) { + Blob* blob = (*bottom)[i]; + Dtype* bottom_diff = blob->mutable_cpu_diff(); + caffe_copy(blob->count(), + top_diff+top[0]->offset(offset_num), bottom_diff); + offset_num += blob->num(); + } + } else if (concat_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < bottom->size(); ++i) { + Blob* blob = (*bottom)[i]; + Dtype* bottom_diff = blob->mutable_cpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < NUM_; ++n) { + caffe_copy(num_elem, top_diff+top[0]->offset(n, offset_channel), + bottom_diff+blob->offset(n)); + } + offset_channel += blob->channels(); + } + } else { + LOG(FATAL) << "concat_dim along dim" << concat_dim_ << + " not implemented yet"; + } + return Dtype(0.); +} + +INSTANTIATE_CLASS(ConcatLayer); + +} // namespace caffe diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu new file mode 100644 index 00000000000..616a5e61683 --- /dev/null +++ b/src/caffe/layers/concat_layer.cu @@ -0,0 +1,75 @@ +// Copyright 2014 Sergio Guadarrama + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void ConcatLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + if (concat_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + caffe_gpu_copy(bottom[i]->count(), bottom_data, + top_data+(*top)[0]->offset(offset_num)); + offset_num += bottom[i]->num(); + } + } else if (concat_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + int num_elem = + bottom[i]->channels()*bottom[i]->height()*bottom[i]->width(); + for (int n = 0; n < NUM_; ++n) { + caffe_gpu_copy(num_elem, bottom_data+bottom[i]->offset(n), + top_data+(*top)[0]->offset(n, offset_channel)); + } + offset_channel += bottom[i]->channels(); + } + } else { + LOG(FATAL) << "concat_dim along dim" << concat_dim_ << + " not implemented yet"; + } +} + +template +Dtype ConcatLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + if (concat_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < bottom->size(); ++i) { + Blob* blob = (*bottom)[i]; + Dtype* bottom_diff = blob->mutable_gpu_diff(); + caffe_gpu_copy(blob->count(), + top_diff+top[0]->offset(offset_num), bottom_diff); + offset_num += blob->num(); + } + } else if (concat_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < bottom->size(); ++i) { + Blob* blob = (*bottom)[i]; + Dtype* bottom_diff = blob->mutable_gpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < NUM_; ++n) { + caffe_gpu_copy(num_elem, top_diff+top[0]->offset(n, offset_channel), + bottom_diff+blob->offset(n)); + } + offset_channel += blob->channels(); + } + } else { + LOG(FATAL) << "concat_dim along dim" << concat_dim_ << + " not implemented yet"; + } + return Dtype(0.); +} + +INSTANTIATE_CLASS(ConcatLayer); + +} // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index f2608be2f64..64a652a8e1d 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -18,6 +18,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, KSIZE_ = this->layer_param_.kernelsize(); STRIDE_ = this->layer_param_.stride(); GROUP_ = this->layer_param_.group(); + PAD_ = this->layer_param_.pad(); NUM_ = bottom[0]->num(); CHANNELS_ = bottom[0]->channels(); HEIGHT_ = bottom[0]->height(); @@ -27,8 +28,8 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, CHECK_EQ(CHANNELS_ % GROUP_, 0); // The im2col result buffer would only hold one image at a time to avoid // overly large memory usage. - int height_out = (HEIGHT_ - KSIZE_) / STRIDE_ + 1; - int width_out = (WIDTH_ - KSIZE_) / STRIDE_ + 1; + int height_out = (HEIGHT_ + 2 * PAD_ - KSIZE_) / STRIDE_ + 1; + int width_out = (WIDTH_ + 2 * PAD_ - KSIZE_) / STRIDE_ + 1; col_buffer_.Reshape(1, CHANNELS_ * KSIZE_ * KSIZE_, height_out, width_out); // Set the parameters CHECK_EQ(NUM_OUTPUT_ % GROUP_, 0) @@ -72,7 +73,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, bias_multiplier_data[i] = 1.; } } -}; +} template @@ -88,7 +89,7 @@ void ConvolutionLayer::Forward_cpu(const vector*>& bottom, for (int n = 0; n < NUM_; ++n) { // First, im2col im2col_cpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, col_data); + WIDTH_, KSIZE_, PAD_, STRIDE_, col_data); // Second, innerproduct with groups for (int g = 0; g < GROUP_; ++g) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -105,36 +106,6 @@ void ConvolutionLayer::Forward_cpu(const vector*>& bottom, } } -template -void ConvolutionLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - Dtype* col_data = col_buffer_.mutable_gpu_data(); - const Dtype* weight = this->blobs_[0]->gpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < NUM_; ++n) { - // First, im2col - im2col_gpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, col_data); - // Second, innerproduct with groups - for (int g = 0; g < GROUP_; ++g) { - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[0]->offset(n) + top_offset * g); - } - // third, add bias - if (biasterm_) { - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, NUM_OUTPUT_, - N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), - reinterpret_cast(bias_multiplier_->gpu_data()), - (Dtype)1., top_data + (*top)[0]->offset(n)); - } - } -} - template Dtype ConvolutionLayer::Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { @@ -167,7 +138,7 @@ Dtype ConvolutionLayer::Backward_cpu(const vector*>& top, // since we saved memory in the forward pass by not storing all col data, // we will need to recompute them. im2col_cpu(bottom_data + (*bottom)[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, col_data); + WIDTH_, KSIZE_, PAD_, STRIDE_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. for (int g = 0; g < GROUP_; ++g) { caffe_cpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, @@ -184,66 +155,8 @@ Dtype ConvolutionLayer::Backward_cpu(const vector*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_cpu(col_diff, CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); - } - } - return Dtype(0.); -} - -template -Dtype ConvolutionLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* weight = this->blobs_[0]->gpu_data(); - Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - Dtype* col_data = col_buffer_.mutable_gpu_data(); - Dtype* col_diff = col_buffer_.mutable_gpu_diff(); - // bias gradient if necessary - Dtype* bias_diff = NULL; - - if (biasterm_) { - bias_diff = this->blobs_[1]->mutable_gpu_diff(); - CUDA_CHECK(cudaMemset(bias_diff, 0, - sizeof(Dtype) * this->blobs_[1]->count())); - for (int n = 0; n < NUM_; ++n) { - caffe_gpu_gemv(CblasNoTrans, NUM_OUTPUT_, N_, - 1., top_diff + top[0]->offset(n), - reinterpret_cast(bias_multiplier_->gpu_data()), - 1., bias_diff); - } - } - - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - CUDA_CHECK(cudaMemset(weight_diff, 0, - sizeof(Dtype) * this->blobs_[0]->count())); - for (int n = 0; n < NUM_; ++n) { - // since we saved memory in the forward pass by not storing all col data, - // we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - for (int g = 0; g < GROUP_; ++g) { - caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[0]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); - } - // gradient w.r.t. bottom data, if necessary - if (propagate_down) { - for (int g = 0; g < GROUP_; ++g) { - caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[0]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); - } - // col2im back to the data - col2im_gpu(col_diff, CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); + col2im_cpu(col_diff, CHANNELS_, HEIGHT_, WIDTH_, KSIZE_, PAD_, STRIDE_, + bottom_diff + (*bottom)[0]->offset(n)); } } return Dtype(0.); diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu new file mode 100644 index 00000000000..a7f56faa97b --- /dev/null +++ b/src/caffe/layers/conv_layer.cu @@ -0,0 +1,104 @@ +// Copyright 2013 Yangqing Jia + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/filler.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void ConvolutionLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* col_data = col_buffer_.mutable_gpu_data(); + const Dtype* weight = this->blobs_[0]->gpu_data(); + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + for (int n = 0; n < NUM_; ++n) { + // First, im2col + im2col_gpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, + WIDTH_, KSIZE_, PAD_, STRIDE_, col_data); + // Second, innerproduct with groups + for (int g = 0; g < GROUP_; ++g) { + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, + (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)0., top_data + (*top)[0]->offset(n) + top_offset * g); + } + // third, add bias + if (biasterm_) { + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, NUM_OUTPUT_, + N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), + reinterpret_cast(bias_multiplier_->gpu_data()), + (Dtype)1., top_data + (*top)[0]->offset(n)); + } + } +} + +template +Dtype ConvolutionLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* weight = this->blobs_[0]->gpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* col_data = col_buffer_.mutable_gpu_data(); + Dtype* col_diff = col_buffer_.mutable_gpu_diff(); + // bias gradient if necessary + Dtype* bias_diff = NULL; + + if (biasterm_) { + bias_diff = this->blobs_[1]->mutable_gpu_diff(); + CUDA_CHECK(cudaMemset(bias_diff, 0, + sizeof(Dtype) * this->blobs_[1]->count())); + for (int n = 0; n < NUM_; ++n) { + caffe_gpu_gemv(CblasNoTrans, NUM_OUTPUT_, N_, + 1., top_diff + top[0]->offset(n), + reinterpret_cast(bias_multiplier_->gpu_data()), + 1., bias_diff); + } + } + + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + CUDA_CHECK(cudaMemset(weight_diff, 0, + sizeof(Dtype) * this->blobs_[0]->count())); + for (int n = 0; n < NUM_; ++n) { + // since we saved memory in the forward pass by not storing all col data, + // we will need to recompute them. + im2col_gpu(bottom_data + (*bottom)[0]->offset(n), CHANNELS_, HEIGHT_, + WIDTH_, KSIZE_, PAD_, STRIDE_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. + for (int g = 0; g < GROUP_; ++g) { + caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[0]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down) { + for (int g = 0; g < GROUP_; ++g) { + caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[0]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_gpu(col_diff, CHANNELS_, HEIGHT_, WIDTH_, KSIZE_, PAD_, STRIDE_, + bottom_diff + (*bottom)[0]->offset(n)); + } + } + return Dtype(0.); +} + + +INSTANTIATE_CLASS(ConvolutionLayer); + +} // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index ffb7fd0a9e2..cc03cdbf0b7 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -50,12 +50,15 @@ void* DataLayerPrefetch(void* layer_pointer) { int h_off, w_off; // We only do random crop when we do training. if (Caffe::phase() == Caffe::TRAIN) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) h_off = rand() % (height - cropsize); + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) w_off = rand() % (width - cropsize); } else { h_off = (height - cropsize) / 2; w_off = (width - cropsize) / 2; } + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) if (mirror && rand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { @@ -111,7 +114,7 @@ void* DataLayerPrefetch(void* layer_pointer) { } } - return (void*)NULL; + return reinterpret_cast(NULL); } template @@ -140,6 +143,7 @@ void DataLayer::SetUp(const vector*>& bottom, iter_->SeekToFirst(); // Check if we would need to randomly skip a few data points if (this->layer_param_.rand_skip()) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) unsigned int skip = rand() % this->layer_param_.rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { @@ -223,23 +227,6 @@ void DataLayer::Forward_cpu(const vector*>& bottom, reinterpret_cast(this))) << "Pthread execution failed."; } -template -void DataLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; - // Copy the data - CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), - prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyHostToDevice)); - CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), - prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyHostToDevice)); - // Start a new prefetch thread - CHECK(!pthread_create(&thread_, NULL, DataLayerPrefetch, - reinterpret_cast(this))) << "Pthread execution failed."; -} - // The backward operations are dummy - they do not carry any computation. template Dtype DataLayer::Backward_cpu(const vector*>& top, @@ -247,12 +234,6 @@ Dtype DataLayer::Backward_cpu(const vector*>& top, return Dtype(0.); } -template -Dtype DataLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - return Dtype(0.); -} - INSTANTIATE_CLASS(DataLayer); } // namespace caffe diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu new file mode 100644 index 00000000000..946f30f3b7f --- /dev/null +++ b/src/caffe/layers/data_layer.cu @@ -0,0 +1,44 @@ +// Copyright 2013 Yangqing Jia + +#include +#include +#include + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/util/io.hpp" +#include "caffe/vision_layers.hpp" + +using std::string; + +namespace caffe { + +template +void DataLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + // First, join the thread + CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; + // Copy the data + CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), + prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), + cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), + prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), + cudaMemcpyHostToDevice)); + // Start a new prefetch thread + CHECK(!pthread_create(&thread_, NULL, DataLayerPrefetch, + reinterpret_cast(this))) << "Pthread execution failed."; +} + +// The backward operations are dummy - they do not carry any computation. +template +Dtype DataLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + return Dtype(0.); +} + +INSTANTIATE_CLASS(DataLayer); + +} // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp new file mode 100644 index 00000000000..f480853cdf3 --- /dev/null +++ b/src/caffe/layers/dropout_layer.cpp @@ -0,0 +1,65 @@ +// Copyright 2013 Yangqing Jia + +#include + +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/syncedmem.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +void DropoutLayer::SetUp(const vector*>& bottom, + vector*>* top) { + NeuronLayer::SetUp(bottom, top); + // Set up the cache for random number generation + rand_vec_.reset(new SyncedMemory(bottom[0]->count() * sizeof(int))); + threshold_ = this->layer_param_.dropout_ratio(); + DCHECK(threshold_ > 0.); + DCHECK(threshold_ < 1.); + scale_ = 1. / (1. - threshold_); + uint_thres_ = (unsigned int)(UINT_MAX * threshold_); +} + +template +void DropoutLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + int* mask = reinterpret_cast(rand_vec_->mutable_cpu_data()); + const int count = bottom[0]->count(); + if (Caffe::phase() == Caffe::TRAIN) { + // Create random numbers + viRngBernoulli(VSL_RNG_METHOD_BERNOULLI_ICDF, Caffe::vsl_stream(), + count, mask, 1. - threshold_); + for (int i = 0; i < count; ++i) { + top_data[i] = bottom_data[i] * mask[i] * scale_; + } + } else { + memcpy(top_data, bottom_data, bottom[0]->count() * sizeof(Dtype)); + } +} + +template +Dtype DropoutLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + CHECK(Caffe::phase() == Caffe::TRAIN); + if (propagate_down) { + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const int* mask = reinterpret_cast(rand_vec_->cpu_data()); + const int count = (*bottom)[0]->count(); + for (int i = 0; i < count; ++i) { + bottom_diff[i] = top_diff[i] * mask[i] * scale_; + } + } + return Dtype(0); +} + + +INSTANTIATE_CLASS(DropoutLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index df94f2deb24..0b38ae2a576 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -2,6 +2,7 @@ #include #include +#include #include "caffe/common.hpp" #include "caffe/layer.hpp" @@ -12,61 +13,12 @@ using std::max; namespace caffe { -template -void DropoutLayer::SetUp(const vector*>& bottom, - vector*>* top) { - NeuronLayer::SetUp(bottom, top); - // Set up the cache for random number generation - rand_vec_.reset(new SyncedMemory(bottom[0]->count() * sizeof(int))); - threshold_ = this->layer_param_.dropout_ratio(); - DCHECK(threshold_ > 0.); - DCHECK(threshold_ < 1.); - scale_ = 1. / (1. - threshold_); - uint_thres_ = (unsigned int)(UINT_MAX * threshold_); -}; - -template -void DropoutLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - int* mask = (int*)rand_vec_->mutable_cpu_data(); - const int count = bottom[0]->count(); - if (Caffe::phase() == Caffe::TRAIN) { - // Create random numbers - viRngBernoulli(VSL_RNG_METHOD_BERNOULLI_ICDF, Caffe::vsl_stream(), - count, mask, 1. - threshold_); - for (int i = 0; i < count; ++i) { - top_data[i] = bottom_data[i] * mask[i] * scale_; - } - } else { - memcpy(top_data, bottom_data, bottom[0]->count() * sizeof(Dtype)); - } -} - -template -Dtype DropoutLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - CHECK(Caffe::phase() == Caffe::TRAIN); - if (propagate_down) { - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int* mask = (int*)(rand_vec_->cpu_data()); - const int count = (*bottom)[0]->count(); - for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * mask[i] * scale_; - } - } - return Dtype(0); -} template __global__ void DropoutForward(const int n, const Dtype* in, const unsigned int* mask, const unsigned int threshold, const float scale, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out[index] = in[index] * (mask[index] > threshold) * scale; } } @@ -81,9 +33,10 @@ void DropoutLayer::Forward_gpu(const vector*>& bottom, CURAND_CHECK(curandGenerate(Caffe::curand_generator(), (unsigned int*)(rand_vec_->mutable_gpu_data()), count)); // set thresholds + // NOLINT_NEXT_LINE(whitespace/operators) DropoutForward<<>>( - count, bottom_data, (unsigned int*)rand_vec_->gpu_data(), uint_thres_, scale_, - top_data); + count, bottom_data, (unsigned int*)rand_vec_->gpu_data(), uint_thres_, + scale_, top_data); CUDA_POST_KERNEL_CHECK; } else { CUDA_CHECK(cudaMemcpy(top_data, bottom_data, @@ -95,8 +48,7 @@ template __global__ void DropoutBackward(const int n, const Dtype* in_diff, const unsigned int* mask, const unsigned int threshold, const float scale, Dtype* out_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out_diff[index] = in_diff[index] * scale * (mask[index] > threshold); } } @@ -111,6 +63,7 @@ Dtype DropoutLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const unsigned int* mask = (unsigned int*)rand_vec_->gpu_data(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) DropoutBackward<<>>( count, top_diff, mask, uint_thres_, scale_, bottom_diff); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index a202f727d7f..9e17a8200c1 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -19,7 +19,7 @@ void FlattenLayer::SetUp(const vector*>& bottom, count_ = bottom[0]->num() * channels_out; CHECK_EQ(count_, bottom[0]->count()); CHECK_EQ(count_, (*top)[0]->count()); -}; +} template void FlattenLayer::Forward_cpu(const vector*>& bottom, @@ -29,14 +29,6 @@ void FlattenLayer::Forward_cpu(const vector*>& bottom, caffe_copy(count_, bottom_data, top_data); } -template -void FlattenLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - caffe_gpu_copy(count_, bottom_data, top_data); -} - template Dtype FlattenLayer::Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { @@ -46,16 +38,6 @@ Dtype FlattenLayer::Backward_cpu(const vector*>& top, return Dtype(0.); } - -template -Dtype FlattenLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - caffe_gpu_copy(count_, top_diff, bottom_diff); - return Dtype(0.); -} - INSTANTIATE_CLASS(FlattenLayer); } // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu new file mode 100644 index 00000000000..571e22e2417 --- /dev/null +++ b/src/caffe/layers/flatten_layer.cu @@ -0,0 +1,30 @@ +// Copyright 2013 Yangqing Jia + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void FlattenLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + caffe_gpu_copy(count_, bottom_data, top_data); +} + +template +Dtype FlattenLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + caffe_gpu_copy(count_, top_diff, bottom_diff); + return Dtype(0.); +} + +INSTANTIATE_CLASS(FlattenLayer); + +} // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp new file mode 100644 index 00000000000..e5b17fedb20 --- /dev/null +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -0,0 +1,132 @@ +// Copyright 2014 BVLC. +/* +Contributors: +- Sergey Karayev, 2014. +- Tobias Domhan, 2014. + +TODO: +- load file in a separate thread ("prefetch") +- can be smarter about the memcpy call instead of doing it row-by-row + :: use util functions caffe_copy, and Blob->offset() + :: don't forget to update hdf5_daa_layer.cu accordingly +- add ability to shuffle filenames if flag is set +*/ +#include +#include +#include +#include // NOLINT(readability/streams) + +#include "hdf5.h" +#include "hdf5_hl.h" + +#include "caffe/layer.hpp" +#include "caffe/util/io.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +HDF5DataLayer::~HDF5DataLayer() { } + +// Load data and label from HDF5 filename into the class property blobs. +template +void HDF5DataLayer::load_hdf5_file_data(const char* filename) { + LOG(INFO) << "Loading HDF5 file" << filename; + hid_t file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) { + LOG(ERROR) << "Failed opening HDF5 file" << filename; + return; + } + + const int MIN_DATA_DIM = 2; + const int MAX_DATA_DIM = 4; + hdf5_load_nd_dataset( + file_id, "data", MIN_DATA_DIM, MAX_DATA_DIM, &data_blob_); + + const int MIN_LABEL_DIM = 1; + const int MAX_LABEL_DIM = 2; + hdf5_load_nd_dataset( + file_id, "label", MIN_LABEL_DIM, MAX_LABEL_DIM, &label_blob_); + + herr_t status = H5Fclose(file_id); + CHECK_EQ(data_blob_.num(), label_blob_.num()); + LOG(INFO) << "Successully loaded " << data_blob_.num() << " rows"; +} + +template +void HDF5DataLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_EQ(bottom.size(), 0) << "HDF5DataLayer takes no input blobs."; + CHECK_EQ(top->size(), 2) << "HDF5DataLayer takes two blobs as output."; + + // Read the source to parse the filenames. + LOG(INFO) << "Loading filename from " << this->layer_param_.source(); + hdf_filenames_.clear(); + std::ifstream myfile(this->layer_param_.source().c_str()); + if (myfile.is_open()) { + std::string line; + while (myfile >> line) { + hdf_filenames_.push_back(line); + } + } + myfile.close(); + num_files_ = hdf_filenames_.size(); + current_file_ = 0; + LOG(INFO) << "Number of files: " << num_files_; + + // Load the first HDF5 file and initialize the line counter. + load_hdf5_file_data(hdf_filenames_[current_file_].c_str()); + current_row_ = 0; + + // Reshape blobs. + (*top)[0]->Reshape(this->layer_param_.batchsize(), data_blob_.channels(), + data_blob_.width(), data_blob_.height()); + (*top)[1]->Reshape(this->layer_param_.batchsize(), label_blob_.channels(), + label_blob_.width(), label_blob_.height()); + LOG(INFO) << "output data size: " << (*top)[0]->num() << "," + << (*top)[0]->channels() << "," << (*top)[0]->height() << "," + << (*top)[0]->width(); +} + +template +void HDF5DataLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const int batchsize = this->layer_param_.batchsize(); + const int data_count = (*top)[0]->count() / (*top)[0]->num(); + const int label_data_count = (*top)[1]->count() / (*top)[1]->num(); + + for (int i = 0; i < batchsize; ++i, ++current_row_) { + if (current_row_ == data_blob_.num()) { + if (num_files_ > 1) { + current_file_ += 1; + + if (current_file_ == num_files_) { + current_file_ = 0; + LOG(INFO) << "looping around to first file"; + } + + load_hdf5_file_data(hdf_filenames_[current_file_].c_str()); + } + current_row_ = 0; + } + + memcpy(&(*top)[0]->mutable_cpu_data()[i * data_count], + &data_blob_.cpu_data()[current_row_ * data_count], + sizeof(Dtype) * data_count); + + memcpy(&(*top)[1]->mutable_cpu_data()[i * label_data_count], + &label_blob_.cpu_data()[current_row_ * label_data_count], + sizeof(Dtype) * label_data_count); + } +} + +// The backward operations are dummy - they do not carry any computation. +template +Dtype HDF5DataLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + return Dtype(0.); +} + +INSTANTIATE_CLASS(HDF5DataLayer); + +} // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu new file mode 100644 index 00000000000..bed7f35a156 --- /dev/null +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -0,0 +1,66 @@ +// Copyright Sergey Karayev 2014 +/* +TODO: +- only load parts of the file, in accordance with a prototxt param "max_mem" +*/ + +#include +#include +#include + +#include "hdf5.h" +#include "hdf5_hl.h" + +#include "caffe/layer.hpp" +#include "caffe/util/io.hpp" +#include "caffe/vision_layers.hpp" + +using std::string; + +namespace caffe { + +template +void HDF5DataLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const int batchsize = this->layer_param_.batchsize(); + const int data_count = (*top)[0]->count() / (*top)[0]->num(); + const int label_data_count = (*top)[1]->count() / (*top)[1]->num(); + + for (int i = 0; i < batchsize; ++i, ++current_row_) { + if (current_row_ == data_blob_.num()) { + if (num_files_ > 1) { + current_file_ += 1; + + if (current_file_ == num_files_) { + current_file_ = 0; + LOG(INFO) << "looping around to first file"; + } + + load_hdf5_file_data(hdf_filenames_[current_file_].c_str()); + } + current_row_ = 0; + } + + CUDA_CHECK(cudaMemcpy( + &(*top)[0]->mutable_gpu_data()[i * data_count], + &data_blob_.cpu_data()[current_row_ * data_count], + sizeof(Dtype) * data_count, + cudaMemcpyHostToDevice)); + + CUDA_CHECK(cudaMemcpy( + &(*top)[1]->mutable_gpu_data()[i * label_data_count], + &label_blob_.cpu_data()[current_row_ * label_data_count], + sizeof(Dtype) * label_data_count, + cudaMemcpyHostToDevice)); + } +} + +template +Dtype HDF5DataLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + return Dtype(0.); +} + +INSTANTIATE_CLASS(HDF5DataLayer); + +} // namespace caffe diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 976c8441e69..e711713b895 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -16,12 +16,14 @@ void Im2colLayer::SetUp(const vector*>& bottom, CHECK_EQ(top->size(), 1) << "Im2col Layer takes a single blob as output."; KSIZE_ = this->layer_param_.kernelsize(); STRIDE_ = this->layer_param_.stride(); + PAD_ = this->layer_param_.pad(); CHANNELS_ = bottom[0]->channels(); HEIGHT_ = bottom[0]->height(); WIDTH_ = bottom[0]->width(); (*top)[0]->Reshape(bottom[0]->num(), CHANNELS_ * KSIZE_ * KSIZE_, - (HEIGHT_ - KSIZE_) / STRIDE_ + 1, (WIDTH_ - KSIZE_) / STRIDE_ + 1); -}; + (HEIGHT_ + 2 * PAD_ - KSIZE_) / STRIDE_ + 1, + (WIDTH_ + 2 * PAD_ - KSIZE_) / STRIDE_ + 1); +} template void Im2colLayer::Forward_cpu(const vector*>& bottom, @@ -30,18 +32,7 @@ void Im2colLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); for (int n = 0; n < bottom[0]->num(); ++n) { im2col_cpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, top_data + (*top)[0]->offset(n)); - } -} - -template -void Im2colLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - for (int n = 0; n < bottom[0]->num(); ++n) { - im2col_gpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, top_data + (*top)[0]->offset(n)); + WIDTH_, KSIZE_, PAD_, STRIDE_, top_data + (*top)[0]->offset(n)); } } @@ -52,20 +43,7 @@ Dtype Im2colLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { col2im_cpu(top_diff + top[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); - } - return Dtype(0.); -} - - -template -Dtype Im2colLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - for (int n = 0; n < top[0]->num(); ++n) { - col2im_gpu(top_diff + top[0]->offset(n), CHANNELS_, HEIGHT_, - WIDTH_, KSIZE_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); + WIDTH_, KSIZE_, PAD_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); } return Dtype(0.); } diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu new file mode 100644 index 00000000000..2d949b12296 --- /dev/null +++ b/src/caffe/layers/im2col_layer.cu @@ -0,0 +1,38 @@ +// Copyright 2013 Yangqing Jia + +#include + +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/common.hpp" + +namespace caffe { + +template +void Im2colLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + for (int n = 0; n < bottom[0]->num(); ++n) { + im2col_gpu(bottom_data + bottom[0]->offset(n), CHANNELS_, HEIGHT_, + WIDTH_, KSIZE_, PAD_, STRIDE_, top_data + (*top)[0]->offset(n)); + } +} + +template +Dtype Im2colLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + for (int n = 0; n < top[0]->num(); ++n) { + col2im_gpu(top_diff + top[0]->offset(n), CHANNELS_, HEIGHT_, + WIDTH_, KSIZE_, PAD_, STRIDE_, bottom_diff + (*bottom)[0]->offset(n)); + } + return Dtype(0.); +} + + +INSTANTIATE_CLASS(Im2colLayer); + +} // namespace caffe diff --git a/src/caffe/layers/images_layer.cpp b/src/caffe/layers/images_layer.cpp index ab3f8b0f8d0..e750e01b266 100644 --- a/src/caffe/layers/images_layer.cpp +++ b/src/caffe/layers/images_layer.cpp @@ -6,8 +6,8 @@ #include #include -#include -#include +#include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include "caffe/layer.hpp" #include "caffe/util/io.hpp" @@ -21,7 +21,8 @@ namespace caffe { template void* ImagesLayerPrefetch(void* layer_pointer) { CHECK(layer_pointer); - ImagesLayer* layer = reinterpret_cast*>(layer_pointer); + ImagesLayer* layer = + reinterpret_cast*>(layer_pointer); CHECK(layer); Datum datum; CHECK(layer->prefetch_data_); @@ -42,28 +43,32 @@ void* ImagesLayerPrefetch(void* layer_pointer) { const int channels = layer->datum_channels_; const int height = layer->datum_height_; const int width = layer->datum_width_; - const int size = layer->datum_size_; + const int size = layer->datum_size_; const int lines_size = layer->lines_.size(); const Dtype* mean = layer->data_mean_.cpu_data(); for (int itemid = 0; itemid < batchsize; ++itemid) { // get a blob - CHECK_GT(lines_size,layer->lines_id_); - if (!ReadImageToDatum(layer->lines_[layer->lines_id_].first, layer->lines_[layer->lines_id_].second, - new_height, new_width, &datum)) { + CHECK_GT(lines_size, layer->lines_id_); + if (!ReadImageToDatum(layer->lines_[layer->lines_id_].first, + layer->lines_[layer->lines_id_].second, + new_height, new_width, &datum)) { continue; - }; + } const string& data = datum.data(); if (cropsize) { CHECK(data.size()) << "Image cropping only support uint8 data"; int h_off, w_off; // We only do random crop when we do training. if (Caffe::phase() == Caffe::TRAIN) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) h_off = rand() % (height - cropsize); + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) w_off = rand() % (width - cropsize); } else { h_off = (height - cropsize) / 2; w_off = (width - cropsize) / 2; } + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) if (mirror && rand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { @@ -115,14 +120,14 @@ void* ImagesLayerPrefetch(void* layer_pointer) { if (layer->lines_id_ >= lines_size) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; - layer->lines_id_=0; + layer->lines_id_ = 0; if (layer->layer_param_.shuffle_images()) { std::random_shuffle(layer->lines_.begin(), layer->lines_.end()); } } } - return (void*)NULL; + return reinterpret_cast(NULL); } template @@ -136,13 +141,15 @@ void ImagesLayer::SetUp(const vector*>& bottom, vector*>* top) { CHECK_EQ(bottom.size(), 0) << "Input Layer takes no input blobs."; CHECK_EQ(top->size(), 2) << "Input Layer takes two blobs as output."; - const int new_height = this->layer_param_.new_height(); - const int new_width = this->layer_param_.new_height(); - CHECK((new_height==0 && new_width==0)||(new_height>0 && new_width > 0)) << - "Current implementation requires new_height and new_width to be set at the same time."; + const int new_height = this->layer_param_.new_height(); + const int new_width = this->layer_param_.new_height(); + CHECK((new_height == 0 && new_width == 0) || + (new_height > 0 && new_width > 0)) << + "Current implementation requires new_height and new_width to be set" + "at the same time."; // Read the file with filenames and labels LOG(INFO) << "Opening file " << this->layer_param_.source(); - std::ifstream infile(this->layer_param_.source().c_str()); + std::ifstream infile(this->layer_param_.source().c_str()); string filename; int label; while (infile >> filename >> label) { @@ -159,15 +166,16 @@ void ImagesLayer::SetUp(const vector*>& bottom, lines_id_ = 0; // Check if we would need to randomly skip a few data points if (this->layer_param_.rand_skip()) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) unsigned int skip = rand() % this->layer_param_.rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; - CHECK_GT(lines_.size(),skip) << "Not enought points to skip"; + CHECK_GT(lines_.size(), skip) << "Not enought points to skip"; lines_id_ = skip; } // Read a data point, and use it to initialize the top blob. Datum datum; CHECK(ReadImageToDatum(lines_[lines_id_].first, lines_[lines_id_].second, - new_height,new_width,&datum)); + new_height, new_width, &datum)); // image int cropsize = this->layer_param_.cropsize(); if (cropsize > 0) { diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 18f1df0dc1f..6987a787ed3 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -2,7 +2,6 @@ #include -#include #include @@ -59,7 +58,7 @@ void InnerProductLayer::SetUp(const vector*>& bottom, bias_multiplier_data[i] = 1.; } } -}; +} template void InnerProductLayer::Forward_cpu(const vector*>& bottom, @@ -100,45 +99,6 @@ Dtype InnerProductLayer::Backward_cpu(const vector*>& top, return Dtype(0); } -template -void InnerProductLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - const Dtype* weight = this->blobs_[0]->gpu_data(); - caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, N_, K_, (Dtype)1., - bottom_data, weight, (Dtype)0., top_data); - if (biasterm_) { - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., - reinterpret_cast(bias_multiplier_->gpu_data()), - this->blobs_[1]->gpu_data(), (Dtype)1., top_data); - } -} - -template -Dtype InnerProductLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - // Gradient with respect to weight - caffe_gpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., - top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_gpu_diff()); - if (biasterm_) { - // Gradient with respect to bias - caffe_gpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - reinterpret_cast(bias_multiplier_->gpu_data()), - (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); - } - if (propagate_down) { - // Gradient with respect to bottom data - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., - top_diff, this->blobs_[0]->gpu_data(), (Dtype)0., - (*bottom)[0]->mutable_gpu_diff()); - } - return Dtype(0); -} - INSTANTIATE_CLASS(InnerProductLayer); } // namespace caffe diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu new file mode 100644 index 00000000000..c7c3e2a99fd --- /dev/null +++ b/src/caffe/layers/inner_product_layer.cu @@ -0,0 +1,59 @@ +// Copyright 2013 Yangqing Jia + + +#include +#include + +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void InnerProductLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const Dtype* weight = this->blobs_[0]->gpu_data(); + caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, N_, K_, (Dtype)1., + bottom_data, weight, (Dtype)0., top_data); + if (biasterm_) { + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., + reinterpret_cast(bias_multiplier_->gpu_data()), + this->blobs_[1]->gpu_data(), (Dtype)1., top_data); + } +} + +template +Dtype InnerProductLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + // Gradient with respect to weight + caffe_gpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., + top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_gpu_diff()); + if (biasterm_) { + // Gradient with respect to bias + caffe_gpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, + reinterpret_cast(bias_multiplier_->gpu_data()), + (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); + } + if (propagate_down) { + // Gradient with respect to bottom data + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., + top_diff, this->blobs_[0]->gpu_data(), (Dtype)0., + (*bottom)[0]->mutable_gpu_diff()); + } + return Dtype(0); +} + +INSTANTIATE_CLASS(InnerProductLayer); + +} // namespace caffe diff --git a/src/caffe/layers/loss_layer.cu b/src/caffe/layers/loss_layer.cpp similarity index 92% rename from src/caffe/layers/loss_layer.cu rename to src/caffe/layers/loss_layer.cpp index ac05ba41b84..1c4303d9bd4 100644 --- a/src/caffe/layers/loss_layer.cu +++ b/src/caffe/layers/loss_layer.cpp @@ -1,7 +1,9 @@ // Copyright 2013 Yangqing Jia + #include #include #include +#include #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" @@ -24,12 +26,12 @@ void MultinomialLogisticLossLayer::SetUp( CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); -}; +} template -Dtype MultinomialLogisticLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, +Dtype MultinomialLogisticLossLayer::Backward_cpu( + const vector*>& top, const bool propagate_down, vector*>* bottom) { const Dtype* bottom_data = (*bottom)[0]->cpu_data(); const Dtype* bottom_label = (*bottom)[1]->cpu_data(); @@ -40,7 +42,7 @@ Dtype MultinomialLogisticLossLayer::Backward_cpu(const vector Dtype loss = 0; for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], kLOG_THRESHOLD); + Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); bottom_diff[i * dim + label] = - 1. / prob / num; } @@ -66,7 +68,7 @@ void InfogainLossLayer::SetUp( CHECK_EQ(infogain_.num(), 1); CHECK_EQ(infogain_.channels(), 1); CHECK_EQ(infogain_.height(), infogain_.width()); -}; +} template @@ -84,7 +86,7 @@ Dtype InfogainLossLayer::Backward_cpu(const vector*>& top, for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], kLOG_THRESHOLD); + Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); loss -= infogain_mat[label * dim + j] * log(prob); bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; } @@ -154,10 +156,11 @@ void AccuracyLayer::Forward_cpu(const vector*>& bottom, max_id = j; } } - if (max_id == (int)bottom_label[i]) { + if (max_id == static_cast(bottom_label[i])) { ++accuracy; } - Dtype prob = max(bottom_data[i * dim + (int)bottom_label[i]], kLOG_THRESHOLD); + Dtype prob = max(bottom_data[i * dim + static_cast(bottom_label[i])], + Dtype(kLOG_THRESHOLD)); logprob -= log(prob); } // LOG(INFO) << "Accuracy: " << accuracy; diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 337b77b76c8..36dbe41ea8c 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -25,7 +25,7 @@ void LRNLayer::SetUp(const vector*>& bottom, pre_pad_ = (size_ - 1) / 2; alpha_ = this->layer_param_.alpha(); beta_ = this->layer_param_.beta(); -}; +} template void LRNLayer::Forward_cpu(const vector*>& bottom, diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index 2afbf38359d..028aa8fa47e 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -1,5 +1,7 @@ // Copyright 2013 Yangqing Jia +#include + #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" @@ -11,8 +13,7 @@ __global__ void LRNFillScale(const int nthreads, const Dtype* in, const int num, const int channels, const int height, const int width, const int size, const Dtype alpha_over_size, Dtype* scale) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { // find out the local offset int w = index % width; int h = (index / width) % height; @@ -58,8 +59,7 @@ __global__ void LRNFillScale(const int nthreads, const Dtype* in, template __global__ void LRNComputeOutput(const int nthreads, const Dtype* in, const Dtype* scale, const Dtype negative_beta, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { out[index] = in[index] * pow(scale[index], negative_beta); } } @@ -74,11 +74,13 @@ void LRNLayer::Forward_gpu(const vector*>& bottom, // We will launch one kernel for each pixel location, and have the kernel // go through all the channels. int n_threads = num_ * height_ * width_; + // NOLINT_NEXT_LINE(whitespace/operators) LRNFillScale<<>>( n_threads, bottom_data, num_, channels_, height_, width_, size_, alpha_ / size_, scale_data); CUDA_POST_KERNEL_CHECK; n_threads = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) LRNComputeOutput<<>>( n_threads, bottom_data, scale_data, -beta_, top_data); CUDA_POST_KERNEL_CHECK; @@ -92,8 +94,7 @@ __global__ void LRNComputeDiff(const int nthreads, const Dtype* bottom_data, const int width, const int size, const Dtype negative_beta, const Dtype cache_ratio, Dtype* bottom_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { // find out the local offset int w = index % width; int h = (index / width) % height; @@ -151,6 +152,7 @@ template Dtype LRNLayer::Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { int n_threads = num_ * height_ * width_; + // NOLINT_NEXT_LINE(whitespace/operators) LRNComputeDiff<<>>( n_threads, (*bottom)[0]->gpu_data(), top[0]->gpu_data(), scale_.gpu_data(), top[0]->gpu_diff(), num_, channels_, height_, width_, diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index dd09dca3505..5def7559e16 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -18,7 +18,7 @@ void NeuronLayer::SetUp(const vector*>& bottom, (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); } -}; +} INSTANTIATE_CLASS(NeuronLayer); diff --git a/src/caffe/layers/padding_layer.cpp b/src/caffe/layers/padding_layer.cpp new file mode 100644 index 00000000000..4cb67df0dcf --- /dev/null +++ b/src/caffe/layers/padding_layer.cpp @@ -0,0 +1,74 @@ +// Copyright 2013 Yangqing Jia + +#include // NOLINT(readability/streams) +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +void PaddingLayer::SetUp(const vector*>& bottom, + vector*>* top) { + // DEPRECATION + LOG(WARNING) << "Padding layers are deprecated in favor of padding-aware " + "convolutions and WILL BE REMOVED. Please update your model " + "prototxt to replace padding layers with pad fields. " + "See https://github.com/BVLC/caffe/pull/128."; + PAD_ = this->layer_param_.pad(); + CHECK_EQ(bottom.size(), 1) << "Padding Layer takes a single blob as input."; + CHECK_EQ(top->size(), 1) << "Padding Layer takes a single blob as output."; + NUM_ = bottom[0]->num(); + CHANNEL_ = bottom[0]->channels(); + HEIGHT_IN_ = bottom[0]->height(); + WIDTH_IN_ = bottom[0]->width(); + HEIGHT_OUT_ = HEIGHT_IN_ + PAD_ * 2; + WIDTH_OUT_ = WIDTH_IN_ + PAD_ * 2; + (*top)[0]->Reshape(NUM_, CHANNEL_, HEIGHT_OUT_, WIDTH_OUT_); +} + +template +void PaddingLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + memset(top_data, 0, sizeof(Dtype) * (*top)[0]->count()); + // In short, top[n, c, h, w] = bottom[n, c, h-pad, w-pad] if in range + for (int n = 0; n < NUM_; ++n) { + for (int c = 0; c < CHANNEL_; ++c) { + for (int h = 0; h < HEIGHT_IN_; ++h) { + // copy the width part + memcpy( + top_data + ((n * CHANNEL_ + c) * HEIGHT_OUT_ + h + PAD_) + * WIDTH_OUT_ + PAD_, + bottom_data + ((n * CHANNEL_ + c) * HEIGHT_IN_ + h) * WIDTH_IN_, + sizeof(Dtype) * WIDTH_IN_); + } + } + } +} + +template +Dtype PaddingLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + for (int n = 0; n < NUM_; ++n) { + for (int c = 0; c < CHANNEL_; ++c) { + for (int h = 0; h < HEIGHT_IN_; ++h) { + // copy the width part + memcpy( + bottom_diff + ((n * CHANNEL_ + c) * HEIGHT_IN_ + h) * WIDTH_IN_, + top_diff + ((n * CHANNEL_ + c) * HEIGHT_OUT_ + h + PAD_) + * WIDTH_OUT_ + PAD_, + sizeof(Dtype) * WIDTH_IN_); + } + } + } + return Dtype(0.); +} + +INSTANTIATE_CLASS(PaddingLayer); + +} // namespace caffe diff --git a/src/caffe/layers/padding_layer.cu b/src/caffe/layers/padding_layer.cu index 90f5508b434..7ec28a9e30f 100644 --- a/src/caffe/layers/padding_layer.cu +++ b/src/caffe/layers/padding_layer.cu @@ -1,76 +1,18 @@ // Copyright 2013 Yangqing Jia +#include // NOLINT(readability/streams) +#include + #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -#include - namespace caffe { -template -void PaddingLayer::SetUp(const vector*>& bottom, - vector*>* top) { - PAD_ = this->layer_param_.pad(); - CHECK_EQ(bottom.size(), 1) << "Padding Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Padding Layer takes a single blob as output."; - NUM_ = bottom[0]->num(); - CHANNEL_ = bottom[0]->channels(); - HEIGHT_IN_ = bottom[0]->height(); - WIDTH_IN_ = bottom[0]->width(); - HEIGHT_OUT_ = HEIGHT_IN_ + PAD_ * 2; - WIDTH_OUT_ = WIDTH_IN_ + PAD_ * 2; - (*top)[0]->Reshape(NUM_, CHANNEL_, HEIGHT_OUT_, WIDTH_OUT_); - -}; - -template -void PaddingLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const Dtype* bottom_data = bottom[0]->cpu_data(); - memset(top_data, 0, sizeof(Dtype) * (*top)[0]->count()); - // In short, top[n, c, h, w] = bottom[n, c, h-pad, w-pad] if in range - for (int n = 0; n < NUM_; ++n) { - for (int c = 0; c < CHANNEL_; ++c) { - for (int h = 0; h < HEIGHT_IN_; ++h) { - // copy the width part - memcpy( - top_data + ((n * CHANNEL_ + c) * HEIGHT_OUT_ + h + PAD_) - * WIDTH_OUT_ + PAD_, - bottom_data + ((n * CHANNEL_ + c) * HEIGHT_IN_ + h) * WIDTH_IN_, - sizeof(Dtype) * WIDTH_IN_); - } - } - } -} - -template -Dtype PaddingLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - //memset(bottom_data, 0, sizeof(Dtype) * (*bottom)[0]->count()); - for (int n = 0; n < NUM_; ++n) { - for (int c = 0; c < CHANNEL_; ++c) { - for (int h = 0; h < HEIGHT_IN_; ++h) { - // copy the width part - memcpy( - bottom_diff + ((n * CHANNEL_ + c) * HEIGHT_IN_ + h) * WIDTH_IN_, - top_diff + ((n * CHANNEL_ + c) * HEIGHT_OUT_ + h + PAD_) - * WIDTH_OUT_ + PAD_, - sizeof(Dtype) * WIDTH_IN_); - } - } - } - return Dtype(0.); -} - template __global__ void PaddingForward(const int count, const Dtype* in, Dtype* out, const int num, const int channel, const int height_in, const int width_in, const int pad) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < count) { + CUDA_KERNEL_LOOP(index, count) { int height_out = height_in + pad + pad; int width_out = width_in + pad + pad; int w = index % width_in; @@ -92,6 +34,7 @@ void PaddingLayer::Forward_gpu(const vector*>& bottom, const int count = bottom[0]->count(); // First, set all data to be zero for the boundary pixels CUDA_CHECK(cudaMemset(top_data, 0, sizeof(Dtype) * (*top)[0]->count())); + // NOLINT_NEXT_LINE(whitespace/operators) PaddingForward<<>>( count, bottom_data, top_data, NUM_, CHANNEL_, HEIGHT_IN_, WIDTH_IN_, PAD_); @@ -102,8 +45,7 @@ template __global__ void PaddingBackward(const int count, const Dtype* in, Dtype* out, const int num, const int channel, const int height_in, const int width_in, const int pad) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < count) { + CUDA_KERNEL_LOOP(index, count) { int height_out = height_in + pad + pad; int width_out = width_in + pad + pad; int w = index % width_in; @@ -113,7 +55,8 @@ __global__ void PaddingBackward(const int count, const Dtype* in, Dtype* out, int c = index % channel; index /= channel; out[((index * channel + c) * height_in + h) * width_in + w] = - in[((index * channel + c) * height_out + h + pad) * width_out + pad + w]; + in[((index * channel + c) * height_out + h + pad) * + width_out + pad + w]; } } @@ -125,6 +68,7 @@ Dtype PaddingLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) PaddingBackward<<>>( count, top_diff, bottom_diff, NUM_, CHANNEL_, HEIGHT_IN_, WIDTH_IN_, PAD_); @@ -135,5 +79,4 @@ Dtype PaddingLayer::Backward_gpu(const vector*>& top, INSTANTIATE_CLASS(PaddingLayer); - } // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 6141642155d..ce30e842c58 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -34,7 +34,7 @@ void PoolingLayer::SetUp(const vector*>& bottom, rand_idx_.Reshape(bottom[0]->num(), CHANNELS_, POOLED_HEIGHT_, POOLED_WIDTH_); } -}; +} // TODO(Yangqing): Is there a faster way to do pooling in the channel-first // case? diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 4fd326cbfb4..357a392976d 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -2,6 +2,8 @@ #include #include +#include + #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" @@ -16,8 +18,7 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* top_data) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; @@ -34,7 +35,7 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, } } top_data[index] = maxval; - } // (if index < nthreads) + } } template @@ -42,8 +43,7 @@ __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* top_data) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; @@ -60,7 +60,7 @@ __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, } } top_data[index] = aveval / (hend - hstart) / (wend - wstart); - } // (if index < nthreads) + } } template @@ -69,8 +69,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, float* rand_idx, Dtype* top_data) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; @@ -100,7 +99,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, } } } - } // (if index < nthreads) + } } @@ -110,8 +109,7 @@ __global__ void StoPoolForwardTest(const int nthreads, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* top_data) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; @@ -132,7 +130,7 @@ __global__ void StoPoolForwardTest(const int nthreads, } } top_data[index] = cumvalues / cumsum; - } // (if index < nthreads) + } } @@ -144,12 +142,14 @@ void PoolingLayer::Forward_gpu(const vector*>& bottom, int count = (*top)[0]->count(); switch (this->layer_param_.pool()) { case LayerParameter_PoolMethod_MAX: + // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, top_data); break; case LayerParameter_PoolMethod_AVE: + // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<<>>( count, bottom_data, bottom[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, @@ -160,12 +160,16 @@ void PoolingLayer::Forward_gpu(const vector*>& bottom, // We need to create the random index as well. CURAND_CHECK(curandGenerateUniform(Caffe::curand_generator(), rand_idx_.mutable_gpu_data(), count)); - StoPoolForwardTrain<<>>( + // NOLINT_NEXT_LINE(whitespace/operators) + StoPoolForwardTrain<<>>( count, bottom_data, bottom[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, rand_idx_.mutable_gpu_data(), top_data); } else { - StoPoolForwardTest<<>>( + // NOLINT_NEXT_LINE(whitespace/operators) + StoPoolForwardTest<<>>( count, bottom_data, bottom[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, top_data); @@ -183,8 +187,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* bottom_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset int w = index % width; @@ -207,7 +210,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, } } bottom_diff[index] = gradient; - } // (if index < nthreads) + } } @@ -216,8 +219,7 @@ __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* bottom_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset int w = index % width; @@ -239,7 +241,7 @@ __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, } } bottom_diff[index] = gradient; - } // (if index < nthreads) + } } @@ -249,8 +251,7 @@ __global__ void StoPoolBackward(const int nthreads, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int ksize, const int stride, Dtype* bottom_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < nthreads) { + CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset int w = index % width; @@ -267,11 +268,11 @@ __global__ void StoPoolBackward(const int nthreads, for (int ph = phstart; ph < phend; ++ph) { for (int pw = pwstart; pw < pwend; ++pw) { gradient += top_diff[ph * pooled_width + pw] * - (index == int(rand_idx[ph * pooled_width + pw])); + (index == static_cast(rand_idx[ph * pooled_width + pw])); } } bottom_diff[index] = gradient; - } // (if index < nthreads) + } } @@ -286,18 +287,21 @@ Dtype PoolingLayer::Backward_gpu(const vector*>& top, int count = (*bottom)[0]->count(); switch (this->layer_param_.pool()) { case LayerParameter_PoolMethod_MAX: + // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( count, (*bottom)[0]->gpu_data(), top[0]->gpu_data(), top_diff, top[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, bottom_diff); break; case LayerParameter_PoolMethod_AVE: + // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<<>>( count, top_diff, top[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, POOLED_WIDTH_, KSIZE_, STRIDE_, bottom_diff); break; case LayerParameter_PoolMethod_STOCHASTIC: + // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<<>>( count, rand_idx_.gpu_data(), top_diff, top[0]->num(), CHANNELS_, HEIGHT_, WIDTH_, POOLED_HEIGHT_, diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp new file mode 100644 index 00000000000..27ae94b7cb0 --- /dev/null +++ b/src/caffe/layers/relu_layer.cpp @@ -0,0 +1,44 @@ +// Copyright 2013 Yangqing Jia + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +using std::max; + +namespace caffe { + +template +void ReLULayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int count = bottom[0]->count(); + for (int i = 0; i < count; ++i) { + top_data[i] = max(bottom_data[i], Dtype(0)); + } +} + +template +Dtype ReLULayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + if (propagate_down) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const int count = (*bottom)[0]->count(); + for (int i = 0; i < count; ++i) { + bottom_diff[i] = top_diff[i] * (bottom_data[i] > 0); + } + } + return Dtype(0); +} + + +INSTANTIATE_CLASS(ReLULayer); + + +} // namespace caffe diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index b0fc46efbca..20a5a45e2f4 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -1,44 +1,18 @@ // Copyright 2013 Yangqing Jia +#include +#include + #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -#include using std::max; namespace caffe { -template -void ReLULayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int count = bottom[0]->count(); - for (int i = 0; i < count; ++i) { - top_data[i] = max(bottom_data[i], Dtype(0)); - } -} - -template -Dtype ReLULayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); - for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * (bottom_data[i] > 0); - } - } - return Dtype(0); -} - template __global__ void ReLUForward(const int n, const Dtype* in, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out[index] = in[index] > 0 ? in[index] : 0; } } @@ -49,11 +23,13 @@ void ReLULayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) ReLUForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; // << " count: " << count << " bottom_data: " - // << (unsigned long)bottom_data << " top_data: " << (unsigned long)top_data + // << (unsigned long)bottom_data + // << " top_data: " << (unsigned long)top_data // << " blocks: " << CAFFE_GET_BLOCKS(count) // << " threads: " << CAFFE_CUDA_NUM_THREADS; } @@ -61,8 +37,7 @@ void ReLULayer::Forward_gpu(const vector*>& bottom, template __global__ void ReLUBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out_diff[index] = in_diff[index] * (in_data[index] > 0); } } @@ -76,6 +51,7 @@ Dtype ReLULayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) ReLUBackward<<>>( count, top_diff, bottom_data, bottom_diff); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp new file mode 100644 index 00000000000..ba6ec84e717 --- /dev/null +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -0,0 +1,48 @@ +// Copyright 2014 Tobias Domhan + +#include +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +inline Dtype sigmoid(Dtype x) { + return 1. / (1. + exp(-x)); +} + +template +void SigmoidLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int count = bottom[0]->count(); + for (int i = 0; i < count; ++i) { + top_data[i] = sigmoid(bottom_data[i]); + } +} + +template +Dtype SigmoidLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + if (propagate_down) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const int count = (*bottom)[0]->count(); + for (int i = 0; i < count; ++i) { + Dtype sigmoid_x = sigmoid(bottom_data[i]); + bottom_diff[i] = top_diff[i] * sigmoid_x * (1. - sigmoid_x); + } + } + return Dtype(0); +} + +INSTANTIATE_CLASS(SigmoidLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index f112a529801..ba311f814a3 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -1,58 +1,24 @@ // Copyright 2014 Tobias Domhan -#include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include #include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" using std::max; namespace caffe { -template -inline Dtype sigmoid(Dtype x) { - return 1. / (1. + exp(-x)); -} - -template -void SigmoidLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int count = bottom[0]->count(); - for (int i = 0; i < count; ++i) { - top_data[i] = sigmoid(bottom_data[i]); - } -} - -template -Dtype SigmoidLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); - for (int i = 0; i < count; ++i) { - Dtype sigmoid_x = sigmoid(bottom_data[i]); - bottom_diff[i] = top_diff[i] * sigmoid_x * (1. - sigmoid_x); - } - } - return Dtype(0); -} - - template __device__ inline Dtype sigmoid_gpu(Dtype x) { return 1. / (1. + exp(-x)); } - template __global__ void SigmoidForward(const int n, const Dtype* in, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { out[index] = sigmoid_gpu(in[index]); } } @@ -63,11 +29,13 @@ void SigmoidLayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) SigmoidForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; // << " count: " << count << " bottom_data: " - // << (unsigned long)bottom_data << " top_data: " << (unsigned long)top_data + // << (unsigned long)bottom_data + // << " top_data: " << (unsigned long)top_data // << " blocks: " << CAFFE_GET_BLOCKS(count) // << " threads: " << CAFFE_CUDA_NUM_THREADS; } @@ -75,8 +43,7 @@ void SigmoidLayer::Forward_gpu(const vector*>& bottom, template __global__ void SigmoidBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { Dtype sigmoid_x = sigmoid_gpu(in_data[index]); out_diff[index] = in_diff[index] * sigmoid_x * (1 - sigmoid_x); } @@ -91,6 +58,7 @@ Dtype SigmoidLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) SigmoidBackward<<>>( count, top_diff, bottom_data, bottom_diff); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp new file mode 100644 index 00000000000..69e95ff6385 --- /dev/null +++ b/src/caffe/layers/softmax_layer.cpp @@ -0,0 +1,89 @@ +// Copyright 2013 Yangqing Jia +// +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +using std::max; + +namespace caffe { + +template +void SoftmaxLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_EQ(bottom.size(), 1) << "Softmax Layer takes a single blob as input."; + CHECK_EQ(top->size(), 1) << "Softmax Layer takes a single blob as output."; + (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + sum_multiplier_.Reshape(1, bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); + for (int i = 0; i < sum_multiplier_.count(); ++i) { + multiplier_data[i] = 1.; + } + scale_.Reshape(bottom[0]->num(), 1, 1, 1); +} + +template +void SoftmaxLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + memcpy(top_data, bottom_data, sizeof(Dtype) * bottom[0]->count()); + // we need to subtract the max to avoid numerical issues, compute the exp, + // and then normalize. + for (int i = 0; i < num; ++i) { + scale_data[i] = bottom_data[i*dim]; + for (int j = 0; j < dim; ++j) { + scale_data[i] = max(scale_data[i], bottom_data[i * dim + j]); + } + } + // subtraction + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + scale_data, sum_multiplier_.cpu_data(), 1., top_data); + // Perform exponentiation + caffe_exp(num * dim, top_data, top_data); + // sum after exp + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_data, + sum_multiplier_.cpu_data(), 0., scale_data); + // Do division + for (int i = 0; i < num; ++i) { + caffe_scal(dim, Dtype(1.) / scale_data[i], top_data + i * dim); + } +} + +template +Dtype SoftmaxLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* top_data = top[0]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = top[0]->num(); + int dim = top[0]->count() / top[0]->num(); + memcpy(bottom_diff, top_diff, sizeof(Dtype) * top[0]->count()); + // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff + for (int i = 0; i < num; ++i) { + scale_data[i] = caffe_cpu_dot(dim, top_diff + i * dim, + top_data + i * dim); + } + // subtraction + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + scale_data, sum_multiplier_.cpu_data(), 1., bottom_diff); + // elementwise multiplication + caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); + return Dtype(0); +} + + +INSTANTIATE_CLASS(SoftmaxLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index a7659697a06..2e41a1794df 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -3,7 +3,8 @@ #include #include #include -#include + +#include "thrust/device_vector.h" #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" @@ -13,58 +14,10 @@ using std::max; namespace caffe { -template -void SoftmaxLayer::SetUp(const vector*>& bottom, - vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Softmax Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Softmax Layer takes a single blob as output."; - (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); - sum_multiplier_.Reshape(1, bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); - Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); - for (int i = 0; i < sum_multiplier_.count(); ++i) { - multiplier_data[i] = 1.; - } - scale_.Reshape(bottom[0]->num(), 1, 1, 1); -}; - -template -void SoftmaxLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = bottom[0]->num(); - int dim = bottom[0]->count() / bottom[0]->num(); - memcpy(top_data, bottom_data, sizeof(Dtype) * bottom[0]->count()); - // we need to subtract the max to avoid numerical issues, compute the exp, - // and then normalize. - for (int i = 0; i < num; ++i) { - scale_data[i] = bottom_data[i*dim]; - for (int j = 0; j < dim; ++j) { - scale_data[i] = max(scale_data[i], bottom_data[i * dim + j]); - } - } - // subtraction - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_data, sum_multiplier_.cpu_data(), 1., top_data); - // Perform exponentiation - caffe_exp(num * dim, top_data, top_data); - // sum after exp - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_data, - sum_multiplier_.cpu_data(), 0., scale_data); - // Do division - for (int i = 0; i < num; ++i) { - caffe_scal(dim, Dtype(1.) / scale_data[i], top_data + i * dim); - } -} - template __global__ void kernel_get_max(const int num, const int dim, const Dtype* data, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < num) { + CUDA_KERNEL_LOOP(index, num) { Dtype maxval = -FLT_MAX; for (int i = 0; i < dim; ++i) { maxval = max(data[index * dim + i], maxval); @@ -76,8 +29,7 @@ __global__ void kernel_get_max(const int num, const int dim, template __global__ void kernel_softmax_div(const int num, const int dim, const Dtype* scale, Dtype* data) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < num * dim) { + CUDA_KERNEL_LOOP(index, num * dim) { int n = index / dim; data[index] /= scale[n]; } @@ -85,8 +37,7 @@ __global__ void kernel_softmax_div(const int num, const int dim, template __global__ void kernel_exp(const int num, const Dtype* data, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < num) { + CUDA_KERNEL_LOOP(index, num) { out[index] = exp(data[index]); } } @@ -104,46 +55,26 @@ void SoftmaxLayer::Forward_gpu(const vector*>& bottom, // we need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. // Compute max + // NOLINT_NEXT_LINE(whitespace/operators) kernel_get_max<<>>( num, dim, bottom_data, scale_data); // subtraction caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., scale_data, sum_multiplier_.gpu_data(), 1., top_data); // Perform exponentiation + // NOLINT_NEXT_LINE(whitespace/operators) kernel_exp<<>>( num * dim, top_data, top_data); // sum after exp caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_data, sum_multiplier_.gpu_data(), 0., scale_data); // Do division - kernel_softmax_div<<>>( + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_softmax_div<<>>( num, dim, scale_data, top_data); } -template -Dtype SoftmaxLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* top_data = top[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = top[0]->num(); - int dim = top[0]->count() / top[0]->num(); - memcpy(bottom_diff, top_diff, sizeof(Dtype) * top[0]->count()); - // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff - for (int i = 0; i < num; ++i) { - scale_data[i] = caffe_cpu_dot(dim, top_diff + i * dim, - top_data + i * dim); - } - // subtraction - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_data, sum_multiplier_.cpu_data(), 1., bottom_diff); - // elementwise multiplication - caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); - return Dtype(0); -} - // TODO(Yangqing): implement the GPU version of softmax. template Dtype SoftmaxLayer::Backward_gpu(const vector*>& top, diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp new file mode 100644 index 00000000000..6fdaea5a1dd --- /dev/null +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -0,0 +1,60 @@ +// Copyright 2013 Yangqing Jia + +#include +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +using std::max; + +namespace caffe { + +template +void SoftmaxWithLossLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_EQ(bottom.size(), 2) << "SoftmaxLoss Layer takes two blobs as input."; + CHECK_EQ(top->size(), 0) << "SoftmaxLoss Layer takes no blob as output."; + softmax_bottom_vec_.clear(); + softmax_bottom_vec_.push_back(bottom[0]); + softmax_top_vec_.push_back(&prob_); + softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); +} + +template +void SoftmaxWithLossLayer::Forward_cpu( + const vector*>& bottom, vector*>* top) { + // The forward pass computes the softmax prob values. + softmax_bottom_vec_[0] = bottom[0]; + softmax_layer_->Forward(softmax_bottom_vec_, &softmax_top_vec_); +} + +template +Dtype SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + // First, compute the diff + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* prob_data = prob_.cpu_data(); + memcpy(bottom_diff, prob_data, sizeof(Dtype) * prob_.count()); + const Dtype* label = (*bottom)[1]->cpu_data(); + int num = prob_.num(); + int dim = prob_.count() / num; + Dtype loss = 0; + for (int i = 0; i < num; ++i) { + bottom_diff[i * dim + static_cast(label[i])] -= 1; + loss += -log(max(prob_data[i * dim + static_cast(label[i])], + Dtype(FLT_MIN))); + } + // Scale down gradient + caffe_scal(prob_.count(), Dtype(1) / num, bottom_diff); + return loss / num; +} + + +INSTANTIATE_CLASS(SoftmaxWithLossLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index 9bb2313abe1..100393caa3d 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -13,53 +13,13 @@ using std::max; namespace caffe { template -void SoftmaxWithLossLayer::SetUp(const vector*>& bottom, - vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "SoftmaxLoss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "SoftmaxLoss Layer takes no blob as output."; - softmax_bottom_vec_.clear(); - softmax_bottom_vec_.push_back(bottom[0]); - softmax_top_vec_.push_back(&prob_); - softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); -}; - -template -void SoftmaxWithLossLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { +void SoftmaxWithLossLayer::Forward_gpu( + const vector*>& bottom, vector*>* top) { // The forward pass computes the softmax prob values. softmax_bottom_vec_[0] = bottom[0]; softmax_layer_->Forward(softmax_bottom_vec_, &softmax_top_vec_); } -template -void SoftmaxWithLossLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - // The forward pass computes the softmax prob values. - softmax_bottom_vec_[0] = bottom[0]; - softmax_layer_->Forward(softmax_bottom_vec_, &softmax_top_vec_); -} - -template -Dtype SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - // First, compute the diff - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const Dtype* prob_data = prob_.cpu_data(); - memcpy(bottom_diff, prob_data, sizeof(Dtype) * prob_.count()); - const Dtype* label = (*bottom)[1]->cpu_data(); - int num = prob_.num(); - int dim = prob_.count() / num; - Dtype loss = 0; - for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] -= 1; - loss += -log(max(prob_data[i * dim + static_cast(label[i])], FLT_MIN)); - } - // Scale down gradient - caffe_scal(prob_.count(), Dtype(1) / num, bottom_diff); - return loss / num; -} - template Dtype SoftmaxWithLossLayer::Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 5accdd08e32..f9fc461a11f 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -25,7 +25,7 @@ void SplitLayer::SetUp(const vector*>& bottom, bottom[0]->height(), bottom[0]->width()); CHECK_EQ(count_, (*top)[i]->count()); } -}; +} template void SplitLayer::Forward_cpu(const vector*>& bottom, @@ -40,19 +40,6 @@ void SplitLayer::Forward_cpu(const vector*>& bottom, } } -template -void SplitLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - for (int i = 0; i < top->size(); ++i) { - if (i == 0 && (*top)[i] == bottom[0]) { - continue; - } - Dtype* top_data = (*top)[i]->mutable_gpu_data(); - caffe_gpu_copy(count_, bottom_data, top_data); - } -} - template Dtype SplitLayer::Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { @@ -75,27 +62,6 @@ Dtype SplitLayer::Backward_cpu(const vector*>& top, } -template -Dtype SplitLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (propagate_down) { - const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - // Initialize by copying first top blob diff to our diff, unless we're - // doing in-place computation for the first blob, in which case the diff is - // already initialized. - if (top[0] != (*bottom)[0]) { - caffe_gpu_copy(count_, top_diff, bottom_diff); - } - // Add remaining top blob diffs. - for (int i = 1; i < top.size(); ++i) { - top_diff = top[i]->gpu_diff(); - caffe_gpu_axpy(count_, Dtype(1.), top_diff, bottom_diff); - } - } - return Dtype(0.); -} - INSTANTIATE_CLASS(SplitLayer); } // namespace caffe diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu new file mode 100644 index 00000000000..5f25a460a6a --- /dev/null +++ b/src/caffe/layers/split_layer.cu @@ -0,0 +1,48 @@ +// Copyright 2014 Jeff Donahue + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void SplitLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + for (int i = 0; i < top->size(); ++i) { + if (i == 0 && (*top)[i] == bottom[0]) { + continue; + } + Dtype* top_data = (*top)[i]->mutable_gpu_data(); + caffe_gpu_copy(count_, bottom_data, top_data); + } +} + +template +Dtype SplitLayer::Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + if (propagate_down) { + const Dtype* top_diff = top[0]->gpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + // Initialize by copying first top blob diff to our diff, unless we're + // doing in-place computation for the first blob, in which case the diff is + // already initialized. + if (top[0] != (*bottom)[0]) { + caffe_gpu_copy(count_, top_diff, bottom_diff); + } + // Add remaining top blob diffs. + for (int i = 1; i < top.size(); ++i) { + top_diff = top[i]->gpu_diff(); + caffe_gpu_axpy(count_, Dtype(1.), top_diff, bottom_diff); + } + } + return Dtype(0.); +} + + +INSTANTIATE_CLASS(SplitLayer); + +} // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp new file mode 100644 index 00000000000..d6f99560082 --- /dev/null +++ b/src/caffe/layers/tanh_layer.cpp @@ -0,0 +1,48 @@ +// Copyright 2014 Aravindh Mahendran +// TanH neuron activation function layer. +// Adapted from ReLU layer code written by Yangqing Jia + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +void TanHLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype exp2x; + const int count = bottom[0]->count(); + for (int i = 0; i < count; ++i) { + exp2x = exp(2*bottom_data[i]); + top_data[i] = (exp2x - Dtype(1))/(exp2x + Dtype(1)); + } +} + +template +Dtype TanHLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + if (propagate_down) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const int count = (*bottom)[0]->count(); + Dtype exp2x; + Dtype tanhx; + for (int i = 0; i < count; ++i) { + exp2x = exp(2*bottom_data[i]); + tanhx = (exp2x - Dtype(1))/(exp2x + Dtype(1)); + bottom_diff[i] = top_diff[i] * (1 - tanhx*tanhx); + } + } + return Dtype(0); +} + +INSTANTIATE_CLASS(TanHLayer); + +} // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index 22e0831afb7..c1f8a29cc5c 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -1,49 +1,18 @@ // Copyright 2014 Aravindh Mahendran -// TanH neuron activation function layer. Adapted from ReLU layer code written by Yangqing Jia +// TanH neuron activation function layer. +// Adapted from ReLU layer code written by Yangqing Jia + +#include +#include #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -#include namespace caffe { -template -void TanHLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - Dtype exp2x; - const int count = bottom[0]->count(); - for (int i = 0; i < count; ++i) { - exp2x = exp(2*bottom_data[i]); - top_data[i] = (exp2x - Dtype(1))/(exp2x + Dtype(1)); - } -} - -template -Dtype TanHLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); - Dtype exp2x; - Dtype tanhx; - for (int i = 0; i < count; ++i) { - exp2x = exp(2*bottom_data[i]); - tanhx = (exp2x - Dtype(1))/(exp2x + Dtype(1)); - bottom_diff[i] = top_diff[i] * (1 - tanhx*tanhx); - } - } - return Dtype(0); -} - template __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { Dtype exp2x = exp(2*in[index]); out[index] = (exp2x - Dtype(1))/(exp2x + Dtype(1)); } @@ -55,11 +24,13 @@ void TanHLayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) TanHForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; // << " count: " << count << " bottom_data: " - // << (unsigned long)bottom_data << " top_data: " << (unsigned long)top_data + // << (unsigned long)bottom_data + // << " top_data: " << (unsigned long)top_data // << " blocks: " << CAFFE_GET_BLOCKS(count) // << " threads: " << CAFFE_CUDA_NUM_THREADS; } @@ -67,8 +38,7 @@ void TanHLayer::Forward_gpu(const vector*>& bottom, template __global__ void TanHBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { Dtype exp2x = exp(2*in_data[index]); Dtype tanhx = (exp2x - Dtype(1))/(exp2x + Dtype(1)); out_diff[index] = in_diff[index] * (1 - tanhx*tanhx); @@ -84,6 +54,7 @@ Dtype TanHLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) TanHBackward<<>>( count, top_diff, bottom_data, bottom_diff); CUDA_POST_KERNEL_CHECK; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e976dfd5fd0..1837b0768ae 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -41,6 +41,7 @@ void Net::Init(const NetParameter& in_param) { int num_layers = param.layers_size(); CHECK_EQ(param.input_size() * 4, param.input_dim_size()) << "Incorrect bottom blob dimension specifications."; + size_t memory_used = 0; // set the input blobs for (int i = 0; i < param.input_size(); ++i) { const string& blob_name = param.input(i); @@ -56,13 +57,16 @@ void Net::Init(const NetParameter& in_param) { net_input_blobs_.push_back(blob_pointer.get()); blob_name_to_idx[blob_name] = i; available_blobs.insert(blob_name); + memory_used += blob_pointer->count(); } + DLOG(INFO) << "Memory required for Data" << memory_used*sizeof(Dtype); // For each layer, set up their input and output bottom_vecs_.resize(param.layers_size()); top_vecs_.resize(param.layers_size()); bottom_id_vecs_.resize(param.layers_size()); top_id_vecs_.resize(param.layers_size()); for (int i = 0; i < param.layers_size(); ++i) { + bool in_place = false; const LayerConnection& layer_connection = param.layers(i); const LayerParameter& layer_param = layer_connection.layer(); layers_.push_back(shared_ptr >(GetLayer(layer_param))); @@ -92,6 +96,7 @@ void Net::Init(const NetParameter& in_param) { blob_name == layer_connection.bottom(j)) { // In-place computation LOG(INFO) << layer_param.name() << " -> " << blob_name << " (in-place)"; + in_place = true; available_blobs.insert(blob_name); top_vecs_[i].push_back( blobs_[blob_name_to_idx[blob_name]].get()); @@ -117,10 +122,15 @@ void Net::Init(const NetParameter& in_param) { // LOG(INFO) << "Setting up " << layer_names_[i]; layers_[i]->SetUp(bottom_vecs_[i], &top_vecs_[i]); for (int topid = 0; topid < top_vecs_[i].size(); ++topid) { - LOG(INFO) << "Top shape: " << top_vecs_[i][topid]->channels() << " " + LOG(INFO) << "Top shape: " << top_vecs_[i][topid]->num() << " " + << top_vecs_[i][topid]->channels() << " " << top_vecs_[i][topid]->height() << " " - << top_vecs_[i][topid]->width(); + << top_vecs_[i][topid]->width() << " (" + << top_vecs_[i][topid]->count() << ")"; + if (!in_place) + memory_used += top_vecs_[i][topid]->count(); } + DLOG(INFO) << "Memory required for Data " << memory_used*sizeof(Dtype); int blobs_lr_size = layers_[i]->layer_param().blobs_lr_size(); CHECK(blobs_lr_size == layers_[i]->blobs().size() || blobs_lr_size == 0) << "Incorrect blobs lr size: should be either 0 or the same as " @@ -154,6 +164,7 @@ void Net::Init(const NetParameter& in_param) { } GetLearningRateAndWeightDecay(); LOG(INFO) << "Network initialization done."; + LOG(INFO) << "Memory required for Data " << memory_used*sizeof(Dtype); } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 183cf626805..e0bccdde70c 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -80,8 +80,8 @@ message LayerParameter { // The blobs containing the numeric parameters of the layer repeated BlobProto blobs = 50; - // The ratio that is multiplied on the global learning rate. If you want to set - // the learning ratio for one blob, you need to set it for all blobs. + // The ratio that is multiplied on the global learning rate. If you want to + // set the learning ratio for one blob, you need to set it for all blobs. repeated float blobs_lr = 51; // The weight decay that is multiplied on the global weight decay. repeated float weight_decay = 52; @@ -92,16 +92,20 @@ message LayerParameter { // be larger than the number of keys in the leveldb. optional uint32 rand_skip = 53 [ default = 0 ]; - // For the Reshape Layer one need to specify the new dimensions + // For ReshapeLayer, one needs to specify the new dimensions. optional int32 new_num = 60 [default = 0]; optional int32 new_channels = 61 [default = 0]; optional int32 new_height = 62 [default = 0]; optional int32 new_width = 63 [default = 0]; - // Used by ImageLayer to shuffle the list of files at every epoch it will also - // resize images if new_height or new_width are not zero + // Whether or not ImageLayer should shuffle the list of files at every epoch. + // It will also resize images if new_height or new_width are not zero. optional bool shuffle_images = 64 [default = false]; + // For ConcatLayer, one needs to specify the dimension for concatenation, and + // the other dimensions must be the same for all the bottom blobs. + // By default it will concatenate blobs along the channels dimension. + optional uint32 concat_dim = 65 [default = 1]; } message LayerConnection { diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 340bbe1dc04..eb024856841 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -123,8 +123,9 @@ void Solver::Snapshot() { // For intermediate results, we will also dump the gradient values. net_->ToProto(&net_param, param_.snapshot_diff()); string filename(param_.snapshot_prefix()); - char iter_str_buffer[20]; - sprintf(iter_str_buffer, "_iter_%d", iter_); + const int kBufferSize = 20; + char iter_str_buffer[kBufferSize]; + snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_); filename += iter_str_buffer; LOG(INFO) << "Snapshotting to " << filename; WriteProtoToBinaryFile(net_param, filename.c_str()); diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp new file mode 100644 index 00000000000..8614f4823b1 --- /dev/null +++ b/src/caffe/test/test_benchmark.cpp @@ -0,0 +1,169 @@ +// Copyright 2014 kloud@github + +#include // for usleep +#include +#include + +#include "caffe/common.hpp" +#include "caffe/util/benchmark.hpp" +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +class BenchmarkTest : public ::testing::Test {}; + +TEST_F(BenchmarkTest, TestTimerConstructorCPU) { + Caffe::set_mode(Caffe::CPU); + Timer timer; + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerConstructorGPU) { + Caffe::set_mode(Caffe::GPU); + Timer timer; + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerStartCPU) { + Caffe::set_mode(Caffe::CPU); + Timer timer; + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Stop(); + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerStartGPU) { + Caffe::set_mode(Caffe::GPU); + Timer timer; + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Stop(); + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Start(); + EXPECT_TRUE(timer.initted()); + EXPECT_TRUE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerStopCPU) { + Caffe::set_mode(Caffe::CPU); + Timer timer; + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerStopGPU) { + Caffe::set_mode(Caffe::GPU); + Timer timer; + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); + timer.Stop(); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerMilliSecondsCPU) { + Caffe::set_mode(Caffe::CPU); + Timer timer; + CHECK_EQ(timer.MilliSeconds(), 0); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + usleep(300 * 1000); + CHECK_GE(timer.MilliSeconds(), 298); + CHECK_LE(timer.MilliSeconds(), 302); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerMilliSecondsGPU) { + Caffe::set_mode(Caffe::GPU); + Timer timer; + CHECK_EQ(timer.MilliSeconds(), 0); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + usleep(300 * 1000); + CHECK_GE(timer.MilliSeconds(), 298); + CHECK_LE(timer.MilliSeconds(), 302); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerSecondsCPU) { + Caffe::set_mode(Caffe::CPU); + Timer timer; + CHECK_EQ(timer.Seconds(), 0); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + usleep(300 * 1000); + CHECK_GE(timer.Seconds(), 0.298); + CHECK_LE(timer.Seconds(), 0.302); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +TEST_F(BenchmarkTest, TestTimerSecondsGPU) { + Caffe::set_mode(Caffe::GPU); + Timer timer; + CHECK_EQ(timer.Seconds(), 0); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_FALSE(timer.has_run_at_least_once()); + timer.Start(); + usleep(300 * 1000); + CHECK_GE(timer.Seconds(), 0.298); + CHECK_LE(timer.Seconds(), 0.302); + EXPECT_TRUE(timer.initted()); + EXPECT_FALSE(timer.running()); + EXPECT_TRUE(timer.has_run_at_least_once()); +} + +} // namespace caffe diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index 7c3084e88d2..7ce1a38480b 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -1,8 +1,8 @@ // Copyright 2013 Yangqing Jia #include -#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/blob.hpp" @@ -17,7 +17,7 @@ class BlobSimpleTest : public ::testing::Test { protected: BlobSimpleTest() : blob_(new Blob()), - blob_preshaped_(new Blob(2, 3, 4, 5)) {}; + blob_preshaped_(new Blob(2, 3, 4, 5)) {} virtual ~BlobSimpleTest() { delete blob_; delete blob_preshaped_; } Blob* const blob_; Blob* const blob_preshaped_; @@ -57,4 +57,4 @@ TYPED_TEST(BlobSimpleTest, TestReshape) { EXPECT_EQ(this->blob_->count(), 120); } -} +} // namespace caffe diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp new file mode 100644 index 00000000000..4674bb4e625 --- /dev/null +++ b/src/caffe/test/test_caffe_main.cpp @@ -0,0 +1,32 @@ +// Copyright 2013 Yangqing Jia + +// The main caffe test code. Your test cpp code should include this hpp +// to allow a main function to be compiled into the binary. + +#include "test_caffe_main.hpp" + +namespace caffe { + cudaDeviceProp CAFFE_TEST_CUDA_PROP; +} + +using caffe::CAFFE_TEST_CUDA_PROP; + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ::google::InitGoogleLogging(argv[0]); + // Before starting testing, let's first print out a few cuda defice info. + int device; + cudaGetDeviceCount(&device); + cout << "Cuda number of devices: " << device << endl; + if (argc > 1) { + // Use the given device + device = atoi(argv[1]); + cudaSetDevice(device); + cout << "Setting to use device " << device << endl; + } + cudaGetDevice(&device); + cout << "Current device id: " << device << endl; + cudaGetDeviceProperties(&CAFFE_TEST_CUDA_PROP, device); + // invoke the test. + return RUN_ALL_TESTS(); +} diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp index a8c16573c79..68374ae6a9a 100644 --- a/src/caffe/test/test_caffe_main.hpp +++ b/src/caffe/test/test_caffe_main.hpp @@ -11,36 +11,10 @@ #include #include -#include +using std::cout; +using std::endl; -namespace caffe { - -cudaDeviceProp CAFFE_TEST_CUDA_PROP; - -} // namespace caffe - -using namespace caffe; -using namespace std; - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - ::google::InitGoogleLogging(argv[0]); - // Before starting testing, let's first print out a few cuda defice info. - int device; - cudaGetDeviceCount(&device); - cout << "Cuda number of devices: " << device << endl; - if (argc > 1) { - // Use the given device - device = atoi(argv[1]); - cudaSetDevice(device); - cout << "Setting to use device " << device << endl; - } - cudaGetDevice(&device); - cout << "Current device id: " << device << endl; - cudaGetDeviceProperties(&CAFFE_TEST_CUDA_PROP, device); - // invoke the test. - return RUN_ALL_TESTS(); -} +int main(int argc, char** argv); #endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index 3afd6d09af5..275c6e1bf73 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -1,8 +1,8 @@ // Copyright 2013 Yangqing Jia #include -#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" @@ -24,6 +24,7 @@ TEST_F(CommonTest, TestVslStream) { } TEST_F(CommonTest, TestBrewMode) { + Caffe::set_mode(Caffe::CPU); EXPECT_EQ(Caffe::mode(), Caffe::CPU); Caffe::set_mode(Caffe::GPU); EXPECT_EQ(Caffe::mode(), Caffe::GPU); @@ -40,10 +41,10 @@ TEST_F(CommonTest, TestRandSeedCPU) { SyncedMemory data_b(10 * sizeof(int)); Caffe::set_random_seed(1701); viRngBernoulli(VSL_RNG_METHOD_BERNOULLI_ICDF, Caffe::vsl_stream(), - 10, (int*)data_a.mutable_cpu_data(), 0.5); + 10, reinterpret_cast(data_a.mutable_cpu_data()), 0.5); Caffe::set_random_seed(1701); viRngBernoulli(VSL_RNG_METHOD_BERNOULLI_ICDF, Caffe::vsl_stream(), - 10, (int*)data_b.mutable_cpu_data(), 0.5); + 10, reinterpret_cast(data_b.mutable_cpu_data()), 0.5); for (int i = 0; i < 10; ++i) { EXPECT_EQ(((const int*)(data_a.cpu_data()))[i], ((const int*)(data_b.cpu_data()))[i]); @@ -56,10 +57,10 @@ TEST_F(CommonTest, TestRandSeedGPU) { SyncedMemory data_b(10 * sizeof(unsigned int)); Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), - (unsigned int*)data_a.mutable_gpu_data(), 10)); + reinterpret_cast(data_a.mutable_gpu_data()), 10)); Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), - (unsigned int*)data_b.mutable_gpu_data(), 10)); + reinterpret_cast(data_b.mutable_gpu_data()), 10)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(((const unsigned int*)(data_a.cpu_data()))[i], ((const unsigned int*)(data_b.cpu_data()))[i]); diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp new file mode 100644 index 00000000000..3515ef96592 --- /dev/null +++ b/src/caffe/test/test_concat_layer.cpp @@ -0,0 +1,130 @@ +// Copyright 2014 Sergio Guadarrama + +#include +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class ConcatLayerTest : public ::testing::Test { + protected: + ConcatLayerTest() + : blob_bottom_0(new Blob(2, 3, 6, 5)), + blob_bottom_1(new Blob(2, 5, 6, 5)), + blob_bottom_2(new Blob(5, 3, 6, 5)), + blob_top_(new Blob()) {} + virtual void SetUp() { + // fill the values + FillerParameter filler_param; + filler_param.set_value(1.); + ConstantFiller filler(filler_param); + filler.Fill(this->blob_bottom_0); + filler_param.set_value(2.); + filler.Fill(this->blob_bottom_1); + filler_param.set_value(3.); + filler.Fill(this->blob_bottom_2); + blob_bottom_vec_0.push_back(blob_bottom_0); + blob_bottom_vec_0.push_back(blob_bottom_1); + blob_bottom_vec_1.push_back(blob_bottom_0); + blob_bottom_vec_1.push_back(blob_bottom_2); + blob_top_vec_.push_back(blob_top_); + } + + virtual ~ConcatLayerTest() { + delete blob_bottom_0; delete blob_bottom_1; + delete blob_bottom_2; delete blob_top_; + } + + Blob* const blob_bottom_0; + Blob* const blob_bottom_1; + Blob* const blob_bottom_2; + Blob* const blob_top_; + vector*> blob_bottom_vec_0, blob_bottom_vec_1; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(ConcatLayerTest, Dtypes); + +TYPED_TEST(ConcatLayerTest, TestSetupNum) { + LayerParameter layer_param; + layer_param.set_concat_dim(0); + ConcatLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_1, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), + this->blob_bottom_0->num() + this->blob_bottom_2->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_0->channels()); + EXPECT_EQ(this->blob_top_->height(), this->blob_bottom_0->height()); + EXPECT_EQ(this->blob_top_->width(), this->blob_bottom_0->width()); +} + +TYPED_TEST(ConcatLayerTest, TestSetupChannels) { + LayerParameter layer_param; + ConcatLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_0->num()); + EXPECT_EQ(this->blob_top_->channels(), + this->blob_bottom_0->channels()+this->blob_bottom_1->channels()); + EXPECT_EQ(this->blob_top_->height(), this->blob_bottom_0->height()); + EXPECT_EQ(this->blob_top_->width(), this->blob_bottom_0->width()); +} + + +TYPED_TEST(ConcatLayerTest, TestCPUNum) { + LayerParameter layer_param; + ConcatLayer layer(layer_param); + Caffe::set_mode(Caffe::CPU); + layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_0, &(this->blob_top_vec_)); + for (int n = 0; n < this->blob_top_->num(); ++n) { + for (int c = 0; c < this->blob_bottom_0->channels(); ++c) { + for (int h = 0; h < this->blob_top_->height(); ++h) { + for (int w = 0; w < this->blob_top_->width(); ++w) { + EXPECT_EQ(this->blob_top_->data_at(n, c, h, w), + this->blob_bottom_vec_0[0]->data_at(n, c, h, w)); + } + } + } + for (int c = 0; c < this->blob_bottom_1->channels(); ++c) { + for (int h = 0; h < this->blob_top_->height(); ++h) { + for (int w = 0; w < this->blob_top_->width(); ++w) { + EXPECT_EQ(this->blob_top_->data_at(n, c+3, h, w), + this->blob_bottom_vec_0[1]->data_at(n, c, h, w)); + } + } + } + } +} + + +TYPED_TEST(ConcatLayerTest, TestCPUGradient) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ConcatLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), + &(this->blob_top_vec_)); +} + +TYPED_TEST(ConcatLayerTest, TestGPUGradient) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + ConcatLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), + &(this->blob_top_vec_)); +} + +} // namespace caffe diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index ebd3cf45810..e1a36183b49 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -21,7 +22,7 @@ class ConvolutionLayerTest : public ::testing::Test { protected: ConvolutionLayerTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {}; + blob_top_(new Blob()) {} virtual void SetUp() { blob_bottom_->Reshape(2, 3, 6, 5); // fill the values @@ -31,7 +32,7 @@ class ConvolutionLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~ConvolutionLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; @@ -174,7 +175,8 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUGradient) { Caffe::set_mode(Caffe::CPU); ConvolutionLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(ConvolutionLayerTest, TestCPUGradientGroup) { @@ -188,7 +190,8 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUGradientGroup) { Caffe::set_mode(Caffe::CPU); ConvolutionLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(ConvolutionLayerTest, TestGPUGradient) { @@ -201,7 +204,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUGradient) { Caffe::set_mode(Caffe::GPU); ConvolutionLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(ConvolutionLayerTest, TestGPUGradientGroup) { @@ -215,7 +219,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUGradientGroup) { Caffe::set_mode(Caffe::GPU); ConvolutionLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_data/generate_sample_data.py b/src/caffe/test/test_data/generate_sample_data.py new file mode 100644 index 00000000000..0d8f5aa98e3 --- /dev/null +++ b/src/caffe/test/test_data/generate_sample_data.py @@ -0,0 +1,39 @@ +""" +Generate data used in the HDF5DataLayer test. +""" +import os +import numpy as np +import h5py + +num_cols = 8 +num_rows = 10 +height = 5 +width = 5 +total_size = num_cols * num_rows * height * width + +data = np.arange(total_size) +data = data.reshape(num_rows, num_cols, height, width) +data = data.astype('float32') +label = np.arange(num_rows)[:, np.newaxis] +label = label.astype('float32') + +print data +print label + +with h5py.File(os.path.dirname(__file__) + '/sample_data.h5', 'w') as f: + f['data'] = data + f['label'] = label + +with h5py.File(os.path.dirname(__file__) + '/sample_data_2_gzip.h5', 'w') as f: + f.create_dataset( + 'data', data=data + total_size, + compression='gzip', compression_opts=1 + ) + f.create_dataset( + 'label', data=label, + compression='gzip', compression_opts=1 + ) + +with open(os.path.dirname(__file__) + '/sample_data_list.txt', 'w') as f: + f.write(os.path.dirname(__file__) + '/sample_data.h5\n') + f.write(os.path.dirname(__file__) + '/sample_data_2_gzip.h5\n') diff --git a/src/caffe/test/test_data/sample_data.h5 b/src/caffe/test/test_data/sample_data.h5 new file mode 100644 index 00000000000..a1f923a71ae Binary files /dev/null and b/src/caffe/test/test_data/sample_data.h5 differ diff --git a/src/caffe/test/test_data/sample_data_2_gzip.h5 b/src/caffe/test/test_data/sample_data_2_gzip.h5 new file mode 100644 index 00000000000..56c0a740ec2 Binary files /dev/null and b/src/caffe/test/test_data/sample_data_2_gzip.h5 differ diff --git a/src/caffe/test/test_data/sample_data_list.txt b/src/caffe/test/test_data/sample_data_list.txt new file mode 100644 index 00000000000..cdf343fc988 --- /dev/null +++ b/src/caffe/test/test_data/sample_data_list.txt @@ -0,0 +1,2 @@ +src/caffe/test/test_data/sample_data.h5 +src/caffe/test/test_data/sample_data_2_gzip.h5 diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 66e9956838b..35c34395ee7 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -1,10 +1,10 @@ // Copyright 2013 Yangqing Jia -#include -#include - #include +#include +#include "cuda_runtime.h" +#include "leveldb/db.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -14,6 +14,7 @@ #include "caffe/test/test_caffe_main.hpp" using std::string; +using std::stringstream; namespace caffe { @@ -25,12 +26,12 @@ class DataLayerTest : public ::testing::Test { DataLayerTest() : blob_top_data_(new Blob()), blob_top_label_(new Blob()), - filename(NULL) {}; + filename(NULL) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); // Create the leveldb - filename = tmpnam(NULL); // get temp name + filename = tmpnam(NULL); // get temp name LOG(INFO) << "Using temporary leveldb " << filename; leveldb::DB* db; leveldb::Options options; @@ -53,7 +54,7 @@ class DataLayerTest : public ::testing::Test { db->Put(leveldb::WriteOptions(), ss.str(), datum.SerializeAsString()); } delete db; - }; + } virtual ~DataLayerTest() { delete blob_top_data_; delete blob_top_label_; } @@ -81,6 +82,7 @@ TYPED_TEST(DataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->channels(), 1); EXPECT_EQ(this->blob_top_label_->height(), 1); EXPECT_EQ(this->blob_top_label_->width(), 1); + // Go through the data 100 times for (int iter = 0; iter < 100; ++iter) { layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); @@ -94,6 +96,21 @@ TYPED_TEST(DataLayerTest, TestRead) { } } } -} + // Same test, in GPU mode. + Caffe::set_mode(Caffe::GPU); + for (int iter = 0; iter < 100; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 24; ++j) { + EXPECT_EQ(i, this->blob_top_data_->cpu_data()[i * 24 + j]) + << "debug: i " << i << " j " << j; + } + } + } } + +} // namespace caffe diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index 82ea682fcc0..d408860c3ab 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -3,8 +3,9 @@ #include #include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -51,8 +52,8 @@ TYPED_TEST(EuclideanLossLayerTest, TestGradientCPU) { EuclideanLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(layer, this->blob_bottom_vec_, - this->blob_top_vec_, 0, -1, -1); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); } -} +} // namespace caffe diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp index 7738ce4570a..c4388c2752f 100644 --- a/src/caffe/test/test_filler.cpp +++ b/src/caffe/test/test_filler.cpp @@ -1,8 +1,8 @@ // Copyright 2013 Yangqing Jia #include -#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/filler.hpp" @@ -21,7 +21,7 @@ class ConstantFillerTest : public ::testing::Test { filler_param_.set_value(10.); filler_.reset(new ConstantFiller(filler_param_)); filler_->Fill(blob_); - }; + } virtual ~ConstantFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; @@ -50,7 +50,7 @@ class UniformFillerTest : public ::testing::Test { filler_param_.set_max(2.); filler_.reset(new UniformFiller(filler_param_)); filler_->Fill(blob_); - }; + } virtual ~UniformFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; @@ -77,7 +77,7 @@ class PositiveUnitballFillerTest : public ::testing::Test { filler_param_() { filler_.reset(new PositiveUnitballFiller(filler_param_)); filler_->Fill(blob_); - }; + } virtual ~PositiveUnitballFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; @@ -116,7 +116,7 @@ class GaussianFillerTest : public ::testing::Test { filler_param_.set_std(0.1); filler_.reset(new GaussianFiller(filler_param_)); filler_->Fill(blob_); - }; + } virtual ~GaussianFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; @@ -146,4 +146,4 @@ TYPED_TEST(GaussianFillerTest, TestFill) { EXPECT_LE(var, target_var * 5.); } -} +} // namespace caffe diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index 805fd72eb5b..41c0453696c 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -28,7 +29,7 @@ class FlattenLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~FlattenLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -80,7 +81,8 @@ TYPED_TEST(FlattenLayerTest, TestCPUGradient) { Caffe::set_mode(Caffe::CPU); FlattenLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(FlattenLayerTest, TestGPUGradient) { @@ -88,8 +90,9 @@ TYPED_TEST(FlattenLayerTest, TestGPUGradient) { Caffe::set_mode(Caffe::GPU); FlattenLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_gradient_check_util.hpp b/src/caffe/test/test_gradient_check_util.hpp index d7360085d40..895e9965a9a 100644 --- a/src/caffe/test/test_gradient_check_util.hpp +++ b/src/caffe/test/test_gradient_check_util.hpp @@ -31,27 +31,28 @@ class GradientChecker { // layers. // Note that after the gradient check, we do not guarantee that the data // stored in the layer parameters and the blobs are unchanged. - void CheckGradient(Layer& layer, vector*>& bottom, - vector*>& top, int check_bottom = -1) { - layer.SetUp(bottom, &top); + void CheckGradient(Layer* layer, vector*>* bottom, + vector*>* top, int check_bottom = -1) { + layer->SetUp(*bottom, top); CheckGradientSingle(layer, bottom, top, check_bottom, -1, -1); } - void CheckGradientExhaustive(Layer& layer, - vector*>& bottom, vector*>& top, + void CheckGradientExhaustive(Layer* layer, + vector*>* bottom, vector*>* top, int check_bottom = -1); - void CheckGradientSingle(Layer& layer, vector*>& bottom, - vector*>& top, int check_bottom, int top_id, + void CheckGradientSingle(Layer* layer, vector*>* bottom, + vector*>* top, int check_bottom, int top_id, int top_data_id); // Checks the gradient of a network. This network should not have any data // layers or loss layers, since the function does not explicitly deal with // such cases yet. All input blobs and parameter blobs are going to be // checked, layer-by-layer to avoid numerical problems to accumulate. - void CheckGradientNet(Net& net, vector*>& input); + void CheckGradientNet(const Net& net, + const vector*>& input); protected: - Dtype GetObjAndGradient(vector*>& top, int top_id = -1, + Dtype GetObjAndGradient(vector*>* top, int top_id = -1, int top_data_id = -1); Dtype stepsize_; Dtype threshold_; @@ -65,21 +66,21 @@ class GradientChecker { template -void GradientChecker::CheckGradientSingle(Layer& layer, - vector*>& bottom, vector*>& top, +void GradientChecker::CheckGradientSingle(Layer* layer, + vector*>* bottom, vector*>* top, int check_bottom, int top_id, int top_data_id) { // First, figure out what blobs we need to check against. vector*> blobs_to_check; - for (int i = 0; i < layer.blobs().size(); ++i) { - blobs_to_check.push_back(layer.blobs()[i].get()); + for (int i = 0; i < layer->blobs().size(); ++i) { + blobs_to_check.push_back(layer->blobs()[i].get()); } if (check_bottom < 0) { - for (int i = 0; i < bottom.size(); ++i) { - blobs_to_check.push_back(bottom[i]); + for (int i = 0; i < bottom->size(); ++i) { + blobs_to_check.push_back((*bottom)[i]); } } else { - CHECK(check_bottom < bottom.size()); - blobs_to_check.push_back(bottom[check_bottom]); + CHECK(check_bottom < bottom->size()); + blobs_to_check.push_back((*bottom)[check_bottom]); } // go through the bottom and parameter blobs // LOG(ERROR) << "Checking " << blobs_to_check.size() << " blobs."; @@ -91,23 +92,23 @@ void GradientChecker::CheckGradientSingle(Layer& layer, for (int feat_id = 0; feat_id < current_blob->count(); ++feat_id) { // First, obtain the original data Caffe::set_random_seed(seed_); - layer.Forward(bottom, &top); + layer->Forward(*bottom, top); Dtype computed_objective = GetObjAndGradient(top, top_id, top_data_id); // Get any additional loss from the layer - computed_objective += layer.Backward(top, true, &bottom); + computed_objective += layer->Backward(*top, true, bottom); Dtype computed_gradient = current_blob->cpu_diff()[feat_id]; // compute score by adding stepsize current_blob->mutable_cpu_data()[feat_id] += stepsize_; Caffe::set_random_seed(seed_); - layer.Forward(bottom, &top); + layer->Forward(*bottom, top); Dtype positive_objective = GetObjAndGradient(top, top_id, top_data_id); - positive_objective += layer.Backward(top, true, &bottom); + positive_objective += layer->Backward(*top, true, bottom); // compute score by subtracting stepsize current_blob->mutable_cpu_data()[feat_id] -= stepsize_ * 2; Caffe::set_random_seed(seed_); - layer.Forward(bottom, &top); + layer->Forward(*bottom, top); Dtype negative_objective = GetObjAndGradient(top, top_id, top_data_id); - negative_objective += layer.Backward(top, true, &bottom); + negative_objective += layer->Backward(*top, true, bottom); // Recover stepsize current_blob->mutable_cpu_data()[feat_id] += stepsize_; Dtype estimated_gradient = (positive_objective - negative_objective) / @@ -120,10 +121,7 @@ void GradientChecker::CheckGradientSingle(Layer& layer, // the scale factor by 1. Dtype scale = max( max(fabs(computed_gradient), fabs(estimated_gradient)), 1.); - EXPECT_GT(computed_gradient, estimated_gradient - threshold_ * scale) - << "debug: (top_id, top_data_id, blob_id, feat_id)=" - << top_id << "," << top_data_id << "," << blobid << "," << feat_id; - EXPECT_LT(computed_gradient, estimated_gradient + threshold_ * scale) + EXPECT_NEAR(computed_gradient, estimated_gradient, threshold_ * scale) << "debug: (top_id, top_data_id, blob_id, feat_id)=" << top_id << "," << top_data_id << "," << blobid << "," << feat_id; } @@ -135,14 +133,13 @@ void GradientChecker::CheckGradientSingle(Layer& layer, } template -void GradientChecker::CheckGradientExhaustive(Layer& layer, - vector*>& bottom, vector*>& top, - int check_bottom) { - layer.SetUp(bottom, &top); +void GradientChecker::CheckGradientExhaustive(Layer* layer, + vector*>* bottom, vector*>* top, int check_bottom) { + layer->SetUp(*bottom, top); // LOG(ERROR) << "Exhaustive Mode."; - for (int i = 0; i < top.size(); ++i) { + for (int i = 0; i < top->size(); ++i) { // LOG(ERROR) << "Exhaustive: blob " << i << " size " << top[i]->count(); - for (int j = 0; j < top[i]->count(); ++j) { + for (int j = 0; j < (*top)[i]->count(); ++j) { // LOG(ERROR) << "Exhaustive: blob " << i << " data " << j; CheckGradientSingle(layer, bottom, top, check_bottom, i, j); } @@ -151,7 +148,7 @@ void GradientChecker::CheckGradientExhaustive(Layer& layer, template void GradientChecker::CheckGradientNet( - Net& net, vector*>& input) { + const Net& net, const vector*>& input) { const vector > >& layers = net.layers(); vector*> >& bottom_vecs = net.bottom_vecs(); vector*> >& top_vecs = net.top_vecs(); @@ -163,13 +160,13 @@ void GradientChecker::CheckGradientNet( } template -Dtype GradientChecker::GetObjAndGradient(vector*>& top, +Dtype GradientChecker::GetObjAndGradient(vector*>* top, int top_id, int top_data_id) { Dtype loss = 0; if (top_id < 0) { // the loss will be half of the sum of squares of all outputs - for (int i = 0; i < top.size(); ++i) { - Blob* top_blob = top[i]; + for (int i = 0; i < top->size(); ++i) { + Blob* top_blob = (*top)[i]; const Dtype* top_blob_data = top_blob->cpu_data(); Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); int count = top_blob->count(); @@ -182,13 +179,13 @@ Dtype GradientChecker::GetObjAndGradient(vector*>& top, loss /= 2.; } else { // the loss will be the top_data_id-th element in the top_id-th blob. - for (int i = 0; i < top.size(); ++i) { - Blob* top_blob = top[i]; + for (int i = 0; i < top->size(); ++i) { + Blob* top_blob = (*top)[i]; Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); memset(top_blob_diff, 0, sizeof(Dtype) * top_blob->count()); } - loss = top[top_id]->cpu_data()[top_data_id]; - top[top_id]->mutable_cpu_diff()[top_data_id] = 1.; + loss = (*top)[top_id]->cpu_data()[top_data_id]; + (*top)[top_id]->mutable_cpu_diff()[top_data_id] = 1.; } return loss; } diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp new file mode 100644 index 00000000000..51ef5440ff9 --- /dev/null +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -0,0 +1,131 @@ +// Copyright 2013 Yangqing Jia + +#include +#include + +#include "cuda_runtime.h" +#include "leveldb/db.h" + +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/test/test_caffe_main.hpp" + +using std::string; + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class HDF5DataLayerTest : public ::testing::Test { + protected: + HDF5DataLayerTest() + : blob_top_data_(new Blob()), + blob_top_label_(new Blob()), + filename(NULL) {} + virtual void SetUp() { + blob_top_vec_.push_back(blob_top_data_); + blob_top_vec_.push_back(blob_top_label_); + + // Check out generate_sample_data.py in the same directory. + filename = new string("src/caffe/test/test_data/sample_data_list.txt"); + LOG(INFO) << "Using sample HDF5 data file " << filename; + } + + virtual ~HDF5DataLayerTest() { + delete blob_top_data_; + delete blob_top_label_; + delete filename; + } + + string* filename; + Blob* const blob_top_data_; + Blob* const blob_top_label_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(HDF5DataLayerTest, Dtypes); + +TYPED_TEST(HDF5DataLayerTest, TestRead) { + // Create LayerParameter with the known parameters. + // The data file we are reading has 10 rows and 8 columns, + // with values from 0 to 10*8 reshaped in row-major order. + LayerParameter param; + int batchsize = 5; + param.set_batchsize(batchsize); + param.set_source(*(this->filename)); + int num_rows = 10; + int num_cols = 8; + int height = 5; + int width = 5; + + // Test that the layer setup got the correct parameters. + HDF5DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), batchsize); + EXPECT_EQ(this->blob_top_data_->channels(), num_cols); + EXPECT_EQ(this->blob_top_data_->height(), height); + EXPECT_EQ(this->blob_top_data_->width(), width); + + EXPECT_EQ(this->blob_top_label_->num(), batchsize); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int t = 0; t < 2; ++t) { + // TODO: make this a TypedTest instead of this silly loop. + if (t == 0) { + Caffe::set_mode(Caffe::CPU); + } else { + Caffe::set_mode(Caffe::GPU); + } + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + + // Go through the data 10 times (5 batches). + const int data_size = num_cols * height * width; + for (int iter = 0; iter < 10; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + + // On even iterations, we're reading the first half of the data. + // On odd iterations, we're reading the second half of the data. + int label_offset = (iter % 2 == 0) ? 0 : batchsize; + int data_offset = (iter % 2 == 0) ? 0 : batchsize * data_size; + + // Every two iterations we are reading the second file, + // which has the same labels, but data is offset by total data size, + // which is 2000 (see generate_sample_data). + int file_offset = (iter % 4 < 2) ? 0 : 2000; + + for (int i = 0; i < batchsize; ++i) { + EXPECT_EQ( + label_offset + i, + this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < batchsize; ++i) { + for (int j = 0; j < num_cols; ++j) { + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + int idx = ( + i * num_cols * height * width + + j * height * width + + h * width + w); + EXPECT_EQ( + file_offset + data_offset + idx, + this->blob_top_data_->cpu_data()[idx]) + << "debug: i " << i << " j " << j + << " iter " << iter << " t " << t; + } + } + } + } + } + } +} + +} // namespace caffe diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index dc6445d6106..ac2f8fe25e2 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -28,7 +29,7 @@ class Im2colLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~Im2colLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -88,7 +89,8 @@ TYPED_TEST(Im2colLayerTest, TestCPUGradient) { Caffe::set_mode(Caffe::CPU); Im2colLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(Im2colLayerTest, TestGPUGradient) { @@ -98,8 +100,9 @@ TYPED_TEST(Im2colLayerTest, TestGPUGradient) { Caffe::set_mode(Caffe::GPU); Im2colLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_images_layer.cpp b/src/caffe/test/test_images_layer.cpp index af5f81d7e89..594a654de42 100644 --- a/src/caffe/test/test_images_layer.cpp +++ b/src/caffe/test/test_images_layer.cpp @@ -1,10 +1,11 @@ // Copyright 2014 Sergio Guadarrama #include -#include -#include +#include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include +#include #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -26,19 +27,19 @@ class ImagesLayerTest : public ::testing::Test { ImagesLayerTest() : blob_top_data_(new Blob()), blob_top_label_(new Blob()), - filename(NULL) {}; + filename(NULL) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); // Create a Vector of files with labels - filename = tmpnam(NULL); // get temp name + filename = tmpnam(NULL); // get temp name std::ofstream outfile(filename, std::ofstream::out); LOG(INFO) << "Using temporary file " << filename; for (int i = 0; i < 5; ++i) { - outfile << "data/cat.jpg " << i; + outfile << "examples/images/cat.jpg " << i; } outfile.close(); - }; + } virtual ~ImagesLayerTest() { delete blob_top_data_; delete blob_top_label_; } @@ -121,9 +122,10 @@ TYPED_TEST(ImagesLayerTest, TestShuffle) { for (int iter = 0; iter < 5; ++iter) { layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); for (int i = 0; i < 5; ++i) { - EXPECT_GE(this->blob_top_label_->cpu_data()[i],0); - EXPECT_LE(this->blob_top_label_->cpu_data()[i],5); + EXPECT_GE(this->blob_top_label_->cpu_data()[i], 0); + EXPECT_LE(this->blob_top_label_->cpu_data()[i], 5); } } } -} + +} // namespace caffe diff --git a/src/caffe/test/test_innerproduct_layer.cpp b/src/caffe/test/test_innerproduct_layer.cpp index 0e2b612f722..eac33b9c9cb 100644 --- a/src/caffe/test/test_innerproduct_layer.cpp +++ b/src/caffe/test/test_innerproduct_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -28,7 +29,7 @@ class InnerProductLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~InnerProductLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -43,7 +44,7 @@ TYPED_TEST(InnerProductLayerTest, TestSetUp) { LayerParameter layer_param; layer_param.set_num_output(10); shared_ptr > layer( - new InnerProductLayer(layer_param)); + new InnerProductLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->height(), 1); @@ -60,37 +61,37 @@ TYPED_TEST(InnerProductLayerTest, TestCPU) { layer_param.mutable_bias_filler()->set_min(1); layer_param.mutable_bias_filler()->set_max(2); shared_ptr > layer( - new InnerProductLayer(layer_param)); + new InnerProductLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); const TypeParam* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); for (int i = 0; i < count; ++i) { - EXPECT_GE(data[i], 1.); + EXPECT_GE(data[i], 1.); } } TYPED_TEST(InnerProductLayerTest, TestGPU) { - if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - layer_param.set_num_output(10); - layer_param.mutable_weight_filler()->set_type("uniform"); - layer_param.mutable_bias_filler()->set_type("uniform"); - layer_param.mutable_bias_filler()->set_min(1); - layer_param.mutable_bias_filler()->set_max(2); - shared_ptr > layer( - new InnerProductLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - for (int i = 0; i < count; ++i) { - EXPECT_GE(data[i], 1.); - } - } else { - LOG(ERROR) << "Skipping test due to old architecture."; - } + if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + layer_param.set_num_output(10); + layer_param.mutable_weight_filler()->set_type("uniform"); + layer_param.mutable_bias_filler()->set_type("uniform"); + layer_param.mutable_bias_filler()->set_min(1); + layer_param.mutable_bias_filler()->set_max(2); + shared_ptr > layer( + new InnerProductLayer(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + for (int i = 0; i < count; ++i) { + EXPECT_GE(data[i], 1.); + } + } else { + LOG(ERROR) << "Skipping test due to old architecture."; + } } TYPED_TEST(InnerProductLayerTest, TestCPUGradient) { @@ -103,7 +104,8 @@ TYPED_TEST(InnerProductLayerTest, TestCPUGradient) { layer_param.mutable_bias_filler()->set_max(2); InnerProductLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(InnerProductLayerTest, TestGPUGradient) { @@ -115,10 +117,11 @@ TYPED_TEST(InnerProductLayerTest, TestGPUGradient) { layer_param.mutable_bias_filler()->set_type("gaussian"); InnerProductLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradient(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } else { LOG(ERROR) << "Skipping test due to old architecture."; } } -} +} // namespace caffe diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 757bac33073..cbdb7d1468f 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -2,9 +2,9 @@ #include #include -#include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -26,7 +26,7 @@ class LRNLayerTest : public ::testing::Test { protected: LRNLayerTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {}; + blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); blob_bottom_->Reshape(2, 7, 3, 3); @@ -36,7 +36,7 @@ class LRNLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~LRNLayerTest() { delete blob_bottom_; delete blob_top_; } void ReferenceLRNForward(const Blob& blob_bottom, const LayerParameter& layer_param, Blob* blob_top); @@ -135,10 +135,12 @@ TYPED_TEST(LRNLayerTest, TestCPUGradient) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); - //for (int i = 0; i < this->blob_bottom_->count(); ++i) { - // std::cout << "CPU diff " << this->blob_bottom_->cpu_diff()[i] << std::endl; - //} - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + // for (int i = 0; i < this->blob_bottom_->count(); ++i) { + // std::cout << "CPU diff " << this->blob_bottom_->cpu_diff()[i] + // << std::endl; + // } + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(LRNLayerTest, TestGPUGradient) { @@ -152,10 +154,12 @@ TYPED_TEST(LRNLayerTest, TestGPUGradient) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); - //for (int i = 0; i < this->blob_bottom_->count(); ++i) { - // std::cout << "GPU diff " << this->blob_bottom_->cpu_diff()[i] << std::endl; - //} - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + // for (int i = 0; i < this->blob_bottom_->count(); ++i) { + // std::cout << "GPU diff " << this->blob_bottom_->cpu_diff()[i] + // << std::endl; + // } + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index 5595c84fea3..5169b708520 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -3,8 +3,9 @@ #include #include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -30,6 +31,7 @@ class MultinomialLogisticLossLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_data_); blob_bottom_vec_.push_back(blob_bottom_data_); for (int i = 0; i < blob_bottom_label_->count(); ++i) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) blob_bottom_label_->mutable_cpu_data()[i] = rand() % 5; } blob_bottom_vec_.push_back(blob_bottom_label_); @@ -54,8 +56,8 @@ TYPED_TEST(MultinomialLogisticLossLayerTest, TestGradientCPU) { MultinomialLogisticLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701, 0, 0.05); - checker.CheckGradientSingle(layer, this->blob_bottom_vec_, - this->blob_top_vec_, 0, -1, -1); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); } -} +} // namespace caffe diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 8674519fa4d..b23670297ab 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -28,7 +29,7 @@ class NeuronLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~NeuronLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -60,7 +61,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientCPU) { Caffe::set_mode(Caffe::CPU); ReLULayer layer(layer_param); GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -85,7 +87,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientGPU) { Caffe::set_mode(Caffe::GPU); ReLULayer layer(layer_param); GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -100,7 +103,7 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidCPU) { const TypeParam* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_FLOAT_EQ(top_data[i], 1. / (1 + exp(-bottom_data[i]))); - //check that we squashed the value between 0 and 1 + // check that we squashed the value between 0 and 1 EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); } @@ -112,7 +115,8 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGradientCPU) { Caffe::set_mode(Caffe::CPU); SigmoidLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(NeuronLayerTest, TestSigmoidGPU) { @@ -126,7 +130,7 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGPU) { const TypeParam* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_FLOAT_EQ(top_data[i], 1. / (1 + exp(-bottom_data[i]))); - //check that we squashed the value between 0 and 1 + // check that we squashed the value between 0 and 1 EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); } @@ -138,7 +142,8 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGradientGPU) { Caffe::set_mode(Caffe::GPU); SigmoidLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -167,7 +172,8 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientCPU) { Caffe::set_mode(Caffe::CPU); DropoutLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -217,7 +223,8 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPU) { GradientChecker checker(1e-2, 1e-3); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. - checker.CheckGradient(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } else { LOG(ERROR) << "Skipping test to spare my laptop."; } @@ -264,7 +271,8 @@ TYPED_TEST(NeuronLayerTest, TestBNLLGradientCPU) { Caffe::set_mode(Caffe::CPU); BNLLLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -289,10 +297,9 @@ TYPED_TEST(NeuronLayerTest, TestBNLLGradientGPU) { Caffe::set_mode(Caffe::GPU); BNLLLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } - - -} +} // namespace caffe diff --git a/src/caffe/test/test_padding_layer.cpp b/src/caffe/test/test_padding_layer.cpp index da48111a66d..ad1f6bf5928 100644 --- a/src/caffe/test/test_padding_layer.cpp +++ b/src/caffe/test/test_padding_layer.cpp @@ -1,7 +1,8 @@ // Copyright 2013 Yangqing Jia -#include #include +#include +#include #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -28,7 +29,7 @@ class PaddingLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~PaddingLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -68,7 +69,8 @@ TYPED_TEST(PaddingLayerTest, TestCPUGrad) { Caffe::set_mode(Caffe::CPU); PaddingLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(PaddingLayerTest, TestGPU) { @@ -105,10 +107,11 @@ TYPED_TEST(PaddingLayerTest, TestGPUGrad) { Caffe::set_mode(Caffe::GPU); PaddingLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } else { LOG(ERROR) << "Skipping test (gpu version too low)."; } } -} +} // namespace caffe diff --git a/src/caffe/test/test_platform.cpp b/src/caffe/test/test_platform.cpp index ea3cee2f69f..bd2dcd3363a 100644 --- a/src/caffe/test/test_platform.cpp +++ b/src/caffe/test/test_platform.cpp @@ -2,11 +2,10 @@ #include #include -#include -#include -#include -#include +#include "cuda_runtime.h" +#include "glog/logging.h" +#include "gtest/gtest.h" #include "caffe/test/test_caffe_main.hpp" namespace caffe { @@ -19,22 +18,35 @@ TEST_F(PlatformTest, TestInitialization) { printf("Major revision number: %d\n", CAFFE_TEST_CUDA_PROP.major); printf("Minor revision number: %d\n", CAFFE_TEST_CUDA_PROP.minor); printf("Name: %s\n", CAFFE_TEST_CUDA_PROP.name); - printf("Total global memory: %lu\n", CAFFE_TEST_CUDA_PROP.totalGlobalMem); - printf("Total shared memory per block: %lu\n", CAFFE_TEST_CUDA_PROP.sharedMemPerBlock); - printf("Total registers per block: %d\n", CAFFE_TEST_CUDA_PROP.regsPerBlock); - printf("Warp size: %d\n", CAFFE_TEST_CUDA_PROP.warpSize); - printf("Maximum memory pitch: %lu\n", CAFFE_TEST_CUDA_PROP.memPitch); - printf("Maximum threads per block: %d\n", CAFFE_TEST_CUDA_PROP.maxThreadsPerBlock); + printf("Total global memory: %lu\n", + CAFFE_TEST_CUDA_PROP.totalGlobalMem); + printf("Total shared memory per block: %lu\n", + CAFFE_TEST_CUDA_PROP.sharedMemPerBlock); + printf("Total registers per block: %d\n", + CAFFE_TEST_CUDA_PROP.regsPerBlock); + printf("Warp size: %d\n", + CAFFE_TEST_CUDA_PROP.warpSize); + printf("Maximum memory pitch: %lu\n", + CAFFE_TEST_CUDA_PROP.memPitch); + printf("Maximum threads per block: %d\n", + CAFFE_TEST_CUDA_PROP.maxThreadsPerBlock); for (int i = 0; i < 3; ++i) - printf("Maximum dimension %d of block: %d\n", i, CAFFE_TEST_CUDA_PROP.maxThreadsDim[i]); + printf("Maximum dimension %d of block: %d\n", i, + CAFFE_TEST_CUDA_PROP.maxThreadsDim[i]); for (int i = 0; i < 3; ++i) - printf("Maximum dimension %d of grid: %d\n", i, CAFFE_TEST_CUDA_PROP.maxGridSize[i]); - printf("Clock rate: %d\n", CAFFE_TEST_CUDA_PROP.clockRate); - printf("Total constant memory: %lu\n", CAFFE_TEST_CUDA_PROP.totalConstMem); - printf("Texture alignment: %lu\n", CAFFE_TEST_CUDA_PROP.textureAlignment); - printf("Concurrent copy and execution: %s\n", (CAFFE_TEST_CUDA_PROP.deviceOverlap ? "Yes" : "No")); - printf("Number of multiprocessors: %d\n", CAFFE_TEST_CUDA_PROP.multiProcessorCount); - printf("Kernel execution timeout: %s\n", (CAFFE_TEST_CUDA_PROP.kernelExecTimeoutEnabled ? "Yes" : "No")); + printf("Maximum dimension %d of grid: %d\n", i, + CAFFE_TEST_CUDA_PROP.maxGridSize[i]); + printf("Clock rate: %d\n", CAFFE_TEST_CUDA_PROP.clockRate); + printf("Total constant memory: %lu\n", + CAFFE_TEST_CUDA_PROP.totalConstMem); + printf("Texture alignment: %lu\n", + CAFFE_TEST_CUDA_PROP.textureAlignment); + printf("Concurrent copy and execution: %s\n", + (CAFFE_TEST_CUDA_PROP.deviceOverlap ? "Yes" : "No")); + printf("Number of multiprocessors: %d\n", + CAFFE_TEST_CUDA_PROP.multiProcessorCount); + printf("Kernel execution timeout: %s\n", + (CAFFE_TEST_CUDA_PROP.kernelExecTimeoutEnabled ? "Yes" : "No")); EXPECT_TRUE(true); } diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 67cae13100c..ae2e51ed993 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -21,7 +22,7 @@ class PoolingLayerTest : public ::testing::Test { protected: PoolingLayerTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {}; + blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); blob_bottom_->Reshape(2, 3, 6, 5); @@ -31,7 +32,7 @@ class PoolingLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~PoolingLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -89,7 +90,8 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { Caffe::set_mode(Caffe::CPU); PoolingLayer layer(layer_param); GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { @@ -100,7 +102,8 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { Caffe::set_mode(Caffe::GPU); PoolingLayer layer(layer_param); GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -112,7 +115,8 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientAve) { Caffe::set_mode(Caffe::CPU); PoolingLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } @@ -124,8 +128,9 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientAve) { Caffe::set_mode(Caffe::GPU); PoolingLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_protobuf.cpp b/src/caffe/test/test_protobuf.cpp index 11cdcf69048..d8d511dd3bb 100644 --- a/src/caffe/test/test_protobuf.cpp +++ b/src/caffe/test/test_protobuf.cpp @@ -4,7 +4,7 @@ // format. Nothing special here and no actual code is being tested. #include -#include +#include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/test/test_caffe_main.hpp" #include "caffe/proto/caffe.pb.h" @@ -26,4 +26,4 @@ TEST_F(ProtoTest, TestSerialization) { EXPECT_TRUE(true); } -} +} // namespace caffe diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index fc1c1b70163..1d4260a5620 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -2,8 +2,9 @@ #include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -29,7 +30,7 @@ class SoftmaxLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~SoftmaxLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -77,7 +78,8 @@ TYPED_TEST(SoftmaxLayerTest, TestGradientCPU) { Caffe::set_mode(Caffe::CPU); SoftmaxLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 328f64b976b..77668e54b79 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -3,8 +3,9 @@ #include #include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -31,6 +32,7 @@ class SoftmaxWithLossLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_data_); blob_bottom_vec_.push_back(blob_bottom_data_); for (int i = 0; i < blob_bottom_label_->count(); ++i) { + // NOLINT_NEXT_LINE(runtime/threadsafe_fn) blob_bottom_label_->mutable_cpu_data()[i] = rand() % 5; } blob_bottom_vec_.push_back(blob_bottom_label_); @@ -55,8 +57,8 @@ TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientCPU) { SoftmaxWithLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(layer, this->blob_bottom_vec_, - this->blob_top_vec_, 0, -1, -1); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); } TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientGPU) { @@ -65,8 +67,8 @@ TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientGPU) { SoftmaxWithLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(layer, this->blob_bottom_vec_, - this->blob_top_vec_, 0, -1, -1); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); } -} +} // namespace caffe diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 3311c9ac76c..afec9c9dc4a 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -1,9 +1,11 @@ // Copyright 2014 Jeff Donahue #include -#include -#include +#include +#include +#include "cuda_runtime.h" +#include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -32,7 +34,7 @@ class SplitLayerTest : public ::testing::Test { blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_a_); blob_top_vec_.push_back(blob_top_b_); - }; + } virtual ~SplitLayerTest() { delete blob_bottom_; delete blob_top_a_; @@ -119,8 +121,8 @@ TYPED_TEST(SplitLayerTest, TestCPUGradient) { Caffe::set_mode(Caffe::CPU); SplitLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, - this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(SplitLayerTest, TestGPUGradient) { @@ -128,8 +130,8 @@ TYPED_TEST(SplitLayerTest, TestGPUGradient) { Caffe::set_mode(Caffe::GPU); SplitLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, - this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(SplitLayerTest, TestCPUGradientInPlace) { @@ -138,8 +140,8 @@ TYPED_TEST(SplitLayerTest, TestCPUGradientInPlace) { SplitLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, - this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(SplitLayerTest, TestGPUGradientInPlace) { @@ -148,15 +150,14 @@ TYPED_TEST(SplitLayerTest, TestGPUGradientInPlace) { SplitLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, - this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } template class SplitLayerInsertionTest : public ::testing::Test { protected: - SplitLayerInsertionTest() { }; void RunInsertionTest( const string& input_param_string, const string& output_param_string) { // Test that insert_splits called on the proto specified by @@ -1125,4 +1126,4 @@ TYPED_TEST(SplitLayerInsertionTest, TestWithInPlace) { this->RunInsertionTest(input_proto, expected_output_proto); } -} +} // namespace caffe diff --git a/src/caffe/test/test_stochastic_pooing.cpp b/src/caffe/test/test_stochastic_pooling.cpp similarity index 94% rename from src/caffe/test/test_stochastic_pooing.cpp rename to src/caffe/test/test_stochastic_pooling.cpp index e2b60eeec34..d60d04e8df7 100644 --- a/src/caffe/test/test_stochastic_pooing.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -1,8 +1,10 @@ // Copyright 2013 Yangqing Jia +#include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -12,6 +14,8 @@ #include "caffe/test/test_caffe_main.hpp" +using std::min; + namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; @@ -21,7 +25,7 @@ class StochasticPoolingLayerTest : public ::testing::Test { protected: StochasticPoolingLayerTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {}; + blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); blob_bottom_->Reshape(2, 3, 6, 5); @@ -33,7 +37,7 @@ class StochasticPoolingLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~StochasticPoolingLayerTest() { delete blob_bottom_; delete blob_top_; @@ -89,7 +93,8 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPU) { bool has_equal = false; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { - has_equal |= (pooled == bottom_data[this->blob_bottom_->offset(n, c, h, w)]); + has_equal |= (pooled == bottom_data[this->blob_bottom_-> + offset(n, c, h, w)]); } } EXPECT_TRUE(has_equal); @@ -130,7 +135,8 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPUTestPhase) { bool smaller_than_max = false; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { - smaller_than_max |= (pooled <= bottom_data[this->blob_bottom_->offset(n, c, h, w)]); + smaller_than_max |= (pooled <= bottom_data[this->blob_bottom_-> + offset(n, c, h, w)]); } } EXPECT_TRUE(smaller_than_max); @@ -154,9 +160,10 @@ TYPED_TEST(StochasticPoolingLayerTest, TestGradientGPU) { GradientChecker checker(1e-2, 1e-3); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. - checker.CheckGradient(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index b8347107b73..161ca458ab9 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -1,8 +1,9 @@ // Copyright 2013 Yangqing Jia #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" @@ -36,29 +37,31 @@ TEST_F(SyncedMemoryTest, TestCPUWrite) { EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 1, mem.size()); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)cpu_data)[i], 1); + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 1); } const void* gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same char* recovered_value = new char[10]; - cudaMemcpy((void*)recovered_value, gpu_data, 10, cudaMemcpyDeviceToHost); + cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, + cudaMemcpyDeviceToHost); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)recovered_value)[i], 1); + EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); } // do another round cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 2, mem.size()); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)cpu_data)[i], 2); + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); } gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same - cudaMemcpy((void*)recovered_value, gpu_data, 10, cudaMemcpyDeviceToHost); + cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, + cudaMemcpyDeviceToHost); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)recovered_value)[i], 2); + EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); } delete[] recovered_value; } @@ -70,7 +73,7 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { CUDA_CHECK(cudaMemset(gpu_data, 1, mem.size())); const void* cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)cpu_data)[i], 1); + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 1); } EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); @@ -79,9 +82,9 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { CUDA_CHECK(cudaMemset(gpu_data, 2, mem.size())); cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ(((char*)cpu_data)[i], 2); + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); } EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); } -} +} // namespace caffe diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index a4226a28b22..6248e508fad 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -1,10 +1,11 @@ // Copyright 2014 Aravindh Mahendran -// Adapted from other test files +// Adapted from other test files #include #include -#include +#include +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -30,7 +31,7 @@ class TanHLayerTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~TanHLayerTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -52,10 +53,12 @@ TYPED_TEST(TanHLayerTest, TestForwardCPU) { for (int j = 0; j < this->blob_bottom_->channels(); ++j) { for (int k = 0; k < this->blob_bottom_->height(); ++k) { for (int l = 0; l < this->blob_bottom_->width(); ++l) { - EXPECT_GE(this->blob_top_->data_at(i,j,k,l) + 1e-4, - (exp(2*this->blob_bottom_->data_at(i,j,k,l))-1)/(exp(2*this->blob_bottom_->data_at(i,j,k,l))+1)); - EXPECT_LE(this->blob_top_->data_at(i,j,k,l) - 1e-4, - (exp(2*this->blob_bottom_->data_at(i,j,k,l))-1)/(exp(2*this->blob_bottom_->data_at(i,j,k,l))+1)); + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); } } } @@ -67,7 +70,8 @@ TYPED_TEST(TanHLayerTest, TestGradientCPU) { Caffe::set_mode(Caffe::CPU); TanHLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } TYPED_TEST(TanHLayerTest, TestForwardGPU) { @@ -81,10 +85,12 @@ TYPED_TEST(TanHLayerTest, TestForwardGPU) { for (int j = 0; j < this->blob_bottom_->channels(); ++j) { for (int k = 0; k < this->blob_bottom_->height(); ++k) { for (int l = 0; l < this->blob_bottom_->width(); ++l) { - EXPECT_GE(this->blob_top_->data_at(i,j,k,l) + 1e-4, - (exp(2*this->blob_bottom_->data_at(i,j,k,l))-1)/(exp(2*this->blob_bottom_->data_at(i,j,k,l))+1)); - EXPECT_LE(this->blob_top_->data_at(i,j,k,l) - 1e-4, - (exp(2*this->blob_bottom_->data_at(i,j,k,l))-1)/(exp(2*this->blob_bottom_->data_at(i,j,k,l))+1)); + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); } } } @@ -96,7 +102,8 @@ TYPED_TEST(TanHLayerTest, TestGradientGPU) { Caffe::set_mode(Caffe::GPU); TanHLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(layer, this->blob_bottom_vec_, this->blob_top_vec_); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } -} +} // namespace caffe diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index 3fed148c0b4..3f3ff8b3a69 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -1,9 +1,10 @@ // Copyright 2013 Yangqing Jia #include -#include -#include -#include + +#include "cuda_runtime.h" +#include "mkl.h" +#include "cublas_v2.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -23,18 +24,18 @@ class GemmTest : public ::testing::Test {}; TYPED_TEST_CASE(GemmTest, Dtypes); TYPED_TEST(GemmTest, TestGemm) { - Blob A(1,1,2,3); - Blob B(1,1,3,4); - Blob C(1,1,2,4); + Blob A(1, 1, 2, 3); + Blob B(1, 1, 3, 4); + Blob C(1, 1, 2, 4); TypeParam data[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; TypeParam A_reshape_data[6] = {1, 4, 2, 5, 3, 6}; - TypeParam B_reshape_data[12] = {1,5,9,2,6,10,3,7,11,4,8,12}; - TypeParam result[8] = {38,44,50,56,83,98,113,128}; + TypeParam B_reshape_data[12] = {1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12}; + TypeParam result[8] = {38, 44, 50, 56, 83, 98, 113, 128}; memcpy(A.mutable_cpu_data(), data, 6 * sizeof(TypeParam)); memcpy(B.mutable_cpu_data(), data, 12 * sizeof(TypeParam)); if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { - //[1,2,3; 4 5 6] * [1,2,3,4; 5,6,7,8; 9,10,11,12]; + // [1, 2, 3; 4 5 6] * [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12]; caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); for (int i = 0; i < 8; ++i) { @@ -47,7 +48,7 @@ TYPED_TEST(GemmTest, TestGemm) { } // Test when we have a transposed A - A.Reshape(1,1,3,2); + A.Reshape(1, 1, 3, 2); memcpy(A.mutable_cpu_data(), A_reshape_data, 6 * sizeof(TypeParam)); caffe_cpu_gemm(CblasTrans, CblasNoTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); @@ -61,7 +62,7 @@ TYPED_TEST(GemmTest, TestGemm) { } // Test when we have a transposed A and a transposed B too - B.Reshape(1,1,4,3); + B.Reshape(1, 1, 4, 3); memcpy(B.mutable_cpu_data(), B_reshape_data, 12 * sizeof(TypeParam)); caffe_cpu_gemm(CblasTrans, CblasTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); @@ -75,7 +76,7 @@ TYPED_TEST(GemmTest, TestGemm) { } // Test when we have a transposed B - A.Reshape(1,1,2,3); + A.Reshape(1, 1, 2, 3); memcpy(A.mutable_cpu_data(), data, 6 * sizeof(TypeParam)); caffe_cpu_gemm(CblasNoTrans, CblasTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); @@ -94,9 +95,9 @@ TYPED_TEST(GemmTest, TestGemm) { TYPED_TEST(GemmTest, TestGemv) { - Blob A(1,1,2,3); - Blob x(1,1,1,3); - Blob y(1,1,1,2); + Blob A(1, 1, 2, 3); + Blob x(1, 1, 1, 3); + Blob y(1, 1, 1, 2); TypeParam data[6] = {1, 2, 3, 4, 5, 6}; TypeParam result_2[2] = {14, 32}; TypeParam result_3[3] = {9, 12, 15}; @@ -132,4 +133,4 @@ TYPED_TEST(GemmTest, TestGemv) { } } -} +} // namespace caffe diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp new file mode 100644 index 00000000000..21c38ad36fe --- /dev/null +++ b/src/caffe/util/benchmark.cpp @@ -0,0 +1,80 @@ +// Copyright 2014 kloud@github + +#include +#include + +#include "caffe/common.hpp" +#include "caffe/util/benchmark.hpp" + +namespace caffe { + +Timer::Timer() + : initted_(false), + running_(false), + has_run_at_least_once_(false) { + Init(); +} + +Timer::~Timer() { + if (Caffe::mode() == Caffe::GPU) { + CUDA_CHECK(cudaEventDestroy(start_gpu_)); + CUDA_CHECK(cudaEventDestroy(stop_gpu_)); + } +} + +void Timer::Start() { + if (!running()) { + if (Caffe::mode() == Caffe::GPU) { + CUDA_CHECK(cudaEventRecord(start_gpu_, 0)); + } else { + start_cpu_ = boost::posix_time::microsec_clock::local_time(); + } + running_ = true; + has_run_at_least_once_ = true; + } +} + +void Timer::Stop() { + if (running()) { + if (Caffe::mode() == Caffe::GPU) { + CUDA_CHECK(cudaEventRecord(stop_gpu_, 0)); + CUDA_CHECK(cudaEventSynchronize(stop_gpu_)); + } else { + stop_cpu_ = boost::posix_time::microsec_clock::local_time(); + } + running_ = false; + } +} + +float Timer::MilliSeconds() { + if (!has_run_at_least_once()) { + LOG(WARNING) << "Timer has never been run before reading time."; + return 0; + } + if (running()) { + Stop(); + } + if (Caffe::mode() == Caffe::GPU) { + CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, + stop_gpu_)); + } else { + elapsed_milliseconds_ = (stop_cpu_ - start_cpu_).total_milliseconds(); + } + return elapsed_milliseconds_; +} + +float Timer::Seconds() { + return MilliSeconds() / 1000.; +} + +void Timer::Init() { + if (!initted()) { + if (Caffe::mode() == Caffe::GPU) { + CUDA_CHECK(cudaEventCreate(&start_gpu_)); + CUDA_CHECK(cudaEventCreate(&stop_gpu_)); + } + initted_ = true; + } +} + +} // namespace caffe diff --git a/src/caffe/util/im2col.cpp b/src/caffe/util/im2col.cpp index db79bb2cdc9..4ed3af8a062 100644 --- a/src/caffe/util/im2col.cpp +++ b/src/caffe/util/im2col.cpp @@ -10,10 +10,10 @@ namespace caffe { template void im2col_cpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_col) { - int height_col = (height - ksize) / stride + 1; - int width_col = (width - ksize) / stride + 1; + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_col) { + int height_col = (height + 2 * pad - ksize) / stride + 1; + int width_col = (width + 2 * pad - ksize) / stride + 1; int channels_col = channels * ksize * ksize; for (int c = 0; c < channels_col; ++c) { int w_offset = c % ksize; @@ -21,9 +21,13 @@ void im2col_cpu(const Dtype* data_im, const int channels, int c_im = c / ksize / ksize; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { - data_col[(c * height_col + h) * width_col + w] = - data_im[(c_im * height + h * stride + h_offset) * width - + w * stride + w_offset]; + int h_pad = h * stride - pad + h_offset; + int w_pad = w * stride - pad + w_offset; + if (h_pad >= 0 && h_pad < height && w_pad >= 0 && w_pad < width) + data_col[(c * height_col + h) * width_col + w] = + data_im[(c_im * height + h_pad) * width + w_pad]; + else + data_col[(c * height_col + h) * width_col + w] = 0; } } } @@ -31,19 +35,19 @@ void im2col_cpu(const Dtype* data_im, const int channels, // Explicit instantiation template void im2col_cpu(const float* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - float* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, float* data_col); template void im2col_cpu(const double* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - double* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, double* data_col); template void col2im_cpu(const Dtype* data_col, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_im) { + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_im) { memset(data_im, 0, sizeof(Dtype) * height * width * channels); - int height_col = (height - ksize) / stride + 1; - int width_col = (width - ksize) / stride + 1; + int height_col = (height + 2 * pad - ksize) / stride + 1; + int width_col = (width + 2 * pad - ksize) / stride + 1; int channels_col = channels * ksize * ksize; for (int c = 0; c < channels_col; ++c) { int w_offset = c % ksize; @@ -51,8 +55,11 @@ void col2im_cpu(const Dtype* data_col, const int channels, int c_im = c / ksize / ksize; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { - data_im[(c_im * height + h * stride + h_offset) * width + w * stride - + w_offset] += data_col[(c * height_col + h) * width_col + w]; + int h_pad = h * stride - pad + h_offset; + int w_pad = w * stride - pad + w_offset; + if (h_pad >= 0 && h_pad < height && w_pad >= 0 && w_pad < width) + data_im[(c_im * height + h_pad) * width + w_pad] += + data_col[(c * height_col + h) * width_col + w]; } } } @@ -60,10 +67,10 @@ void col2im_cpu(const Dtype* data_col, const int channels, // Explicit instantiation template void col2im_cpu(const float* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - float* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, float* data_im); template void col2im_cpu(const double* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - double* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, double* data_im); } // namespace caffe diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index 0b0c8b8354f..8776e8e50f7 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -1,5 +1,6 @@ // Copyright 2013 Yangqing Jia +#include #include #include #include @@ -9,25 +10,27 @@ namespace caffe { - template __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, - const int height, const int width, const int ksize, - const int stride, const int height_col, const int width_col, Dtype* data_col) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + const int height, const int width, const int ksize, const int pad, + const int stride, const int height_col, const int width_col, + Dtype* data_col) { + CUDA_KERNEL_LOOP(index, n) { int w_out = index % width_col; index /= width_col; int h_out = index % height_col; int channel_in = index / height_col; int channel_out = channel_in * ksize * ksize; - int h_in = h_out * stride; - int w_in = w_out * stride; + int h_in = h_out * stride - pad; + int w_in = w_out * stride - pad; data_col += (channel_out * height_col + h_out) * width_col + w_out; data_im += (channel_in * height + h_in) * width + w_in; for (int i = 0; i < ksize; ++i) { for (int j = 0; j < ksize; ++j) { - *data_col = data_im[i * width + j]; + int h = h_in + i; + int w = w_in + j; + *data_col = (h >= 0 && w >= 0 && h < width && w < height) ? + data_im[i * width + j] : 0; data_col += height_col * width_col; } } @@ -36,37 +39,39 @@ __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, template void im2col_gpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_col) { + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_col) { // We are going to launch channels * height_col * width_col kernels, each // kernel responsible for copying a single-channel grid. - int height_col = (height - ksize) / stride + 1; - int width_col = (width - ksize) / stride + 1; + int height_col = (height + 2 * pad - ksize) / stride + 1; + int width_col = (width + 2 * pad - ksize) / stride + 1; int num_kernels = channels * height_col * width_col; - im2col_gpu_kernel<<>>( - num_kernels, data_im, height, width, ksize, stride, height_col, width_col, - data_col); + // NOLINT_NEXT_LINE(whitespace/operators) + im2col_gpu_kernel<<>>( + num_kernels, data_im, height, width, ksize, pad, stride, height_col, + width_col, data_col); CUDA_POST_KERNEL_CHECK; } // Explicit instantiation template void im2col_gpu(const float* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - float* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, float* data_col); template void im2col_gpu(const double* data_im, const int channels, - const int height, const int width, const int ksize, const int stride, - double* data_col); + const int height, const int width, const int ksize, const int pad, + const int stride, double* data_col); template __global__ void col2im_gpu_kernel(const int n, const Dtype* data_col, - const int height, const int width, const int channels, const int ksize, - const int stride, const int height_col, const int width_col, Dtype* data_im) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + const int height, const int width, const int channels, const int ksize, + const int pad, const int stride, const int height_col, const int width_col, + Dtype* data_im) { + CUDA_KERNEL_LOOP(index, n) { Dtype val = 0; - int w = index % width; - int h = (index / width) % height; + int w = index % width + pad; + int h = (index / width) % height + pad; int c = index / (width * height); // compute the start and end of the output int w_col_start = (w < ksize) ? 0 : (w - ksize) / stride + 1; @@ -97,16 +102,19 @@ __global__ void col2im_gpu_kernel(const int n, const Dtype* data_col, template void col2im_gpu(const Dtype* data_col, const int channels, - const int height, const int width, const int ksize, const int stride, - Dtype* data_im) { - //CUDA_CHECK(cudaMemset(data_im, 0, sizeof(Dtype) * height * width * channels)); - int height_col = (height - ksize) / stride + 1; - int width_col = (width - ksize) / stride + 1; + const int height, const int width, const int ksize, const int pad, + const int stride, Dtype* data_im) { + // CUDA_CHECK(cudaMemset(data_im, 0, + // sizeof(Dtype) * height * width * channels)); + int height_col = (height + 2 * pad - ksize) / stride + 1; + int width_col = (width + 2 * pad - ksize) / stride + 1; int num_kernels = channels * height * width; // To avoid involving atomic operations, we will launch one kernel per // bottom dimension, and then in the kernel add up the top dimensions. - col2im_gpu_kernel<<>>( - num_kernels, data_col, height, width, channels, ksize, stride, + // NOLINT_NEXT_LINE(whitespace/operators) + col2im_gpu_kernel<<>>( + num_kernels, data_col, height, width, channels, ksize, pad, stride, height_col, width_col, data_im); CUDA_POST_KERNEL_CHECK; } @@ -114,11 +122,11 @@ void col2im_gpu(const Dtype* data_col, const int channels, // Explicit instantiation template void col2im_gpu(const float* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - float* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, float* data_im); template void col2im_gpu(const double* data_col, const int channels, - const int height, const int width, const int psize, const int stride, - double* data_im); + const int height, const int width, const int psize, const int pad, + const int stride, double* data_im); } // namespace caffe diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index 6db6458c4af..d208bcd27e4 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "caffe/common.hpp" #include "caffe/util/insert_splits.hpp" diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 0f0060aeb1c..3ac69f9744e 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -12,8 +12,8 @@ #include #include -#include -#include +#include +#include // NOLINT(readability/streams) #include "caffe/common.hpp" #include "caffe/util/io.hpp" @@ -81,9 +81,6 @@ bool ReadImageToDatum(const string& filename, const int label, if (!cv_img.data) { LOG(ERROR) << "Could not open or find file " << filename; return false; - } - if (height > 0 && width > 0) { - } datum->set_channels(3); datum->set_height(cv_img.rows); @@ -95,11 +92,54 @@ bool ReadImageToDatum(const string& filename, const int label, for (int c = 0; c < 3; ++c) { for (int h = 0; h < cv_img.rows; ++h) { for (int w = 0; w < cv_img.cols; ++w) { - datum_string->push_back(static_cast(cv_img.at(h, w)[c])); + datum_string->push_back( + static_cast(cv_img.at(h, w)[c])); } } } return true; } +// Verifies format of data stored in HDF5 file and reshapes blob accordingly. +template +void hdf5_load_nd_dataset_helper( + hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, + Blob* blob) { + // Verify that the number of dimensions is in the accepted range. + herr_t status; + int ndims; + status = H5LTget_dataset_ndims(file_id, dataset_name_, &ndims); + CHECK_GE(ndims, min_dim); + CHECK_LE(ndims, max_dim); + + // Verify that the data format is what we expect: float or double. + std::vector dims(ndims); + H5T_class_t class_; + status = H5LTget_dataset_info( + file_id, dataset_name_, dims.data(), &class_, NULL); + CHECK_EQ(class_, H5T_FLOAT) << "Expected float or double data"; + + blob->Reshape( + dims[0], + (dims.size() > 1) ? dims[1] : 1, + (dims.size() > 2) ? dims[2] : 1, + (dims.size() > 3) ? dims[3] : 1); +} + +template <> +void hdf5_load_nd_dataset(hid_t file_id, const char* dataset_name_, + int min_dim, int max_dim, Blob* blob) { + hdf5_load_nd_dataset_helper(file_id, dataset_name_, min_dim, max_dim, blob); + herr_t status = H5LTread_dataset_float( + file_id, dataset_name_, blob->mutable_cpu_data()); +} + +template <> +void hdf5_load_nd_dataset(hid_t file_id, const char* dataset_name_, + int min_dim, int max_dim, Blob* blob) { + hdf5_load_nd_dataset_helper(file_id, dataset_name_, min_dim, max_dim, blob); + herr_t status = H5LTread_dataset_double( + file_id, dataset_name_, blob->mutable_cpu_data()); +} + } // namespace caffe diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index e9305810e81..5491e246c48 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -12,8 +12,7 @@ namespace caffe { template __global__ void mul_kernel(const int n, const Dtype* a, const Dtype* b, Dtype* y) { - int index = threadIdx.x + blockIdx.x * blockDim.x; - if (index < n) { + CUDA_KERNEL_LOOP(index, n) { y[index] = a[index] * b[index]; } } @@ -21,6 +20,7 @@ __global__ void mul_kernel(const int n, const Dtype* a, template <> void caffe_gpu_mul(const int N, const float* a, const float* b, float* y) { + // NOLINT_NEXT_LINE(whitespace/operators) mul_kernel<<>>( N, a, b, y); } @@ -28,6 +28,7 @@ void caffe_gpu_mul(const int N, const float* a, template <> void caffe_gpu_mul(const int N, const double* a, const double* b, double* y) { + // NOLINT_NEXT_LINE(whitespace/operators) mul_kernel<<>>( N, a, b, y); } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 3c243d67724..cb494f2500e 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -1,8 +1,10 @@ // Copyright 2013 Yangqing Jia + #include #include #include +#include #include #include "caffe/proto/caffe.pb.h" @@ -10,6 +12,7 @@ using caffe::Datum; using caffe::BlobProto; +using std::max; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); @@ -40,7 +43,9 @@ int main(int argc, char** argv) { sum_blob.set_height(datum.height()); sum_blob.set_width(datum.width()); const int data_size = datum.channels() * datum.height() * datum.width(); - for (int i = 0; i < datum.data().size(); ++i) { + int size_in_datum = std::max(datum.data().size(), + datum.float_data_size()); + for (int i = 0; i < size_in_datum; ++i) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; @@ -48,15 +53,27 @@ int main(int argc, char** argv) { // just a dummy operation datum.ParseFromString(it->value().ToString()); const string& data = datum.data(); - CHECK_EQ(data.size(), data_size) << "Incorrect data field size " << data.size(); - for (int i = 0; i < data.size(); ++i) { - sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); + size_in_datum = std::max(datum.data().size(), datum.float_data_size()); + CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << + size_in_datum; + if (data.size() != 0) { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); + } + } else { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + + static_cast(datum.float_data(i))); + } } ++count; if (count % 10000 == 0) { LOG(ERROR) << "Processed " << count << " files."; } } + if (count % 10000 != 0) { + LOG(ERROR) << "Processed " << count << " files."; + } for (int i = 0; i < sum_blob.data_size(); ++i) { sum_blob.set_data(i, sum_blob.data(i) / count); } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index e73971614e8..50b53e6d98e 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -16,14 +16,15 @@ #include #include +#include // NOLINT(readability/streams) #include -#include -#include +#include +#include #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) using std::pair; using std::string; @@ -66,25 +67,27 @@ int main(int argc, char** argv) { string root_folder(argv[1]); Datum datum; int count = 0; - const int maxKeyLength = 256; - char key_cstr[maxKeyLength]; + const int kMaxKeyLength = 256; + char key_cstr[kMaxKeyLength]; leveldb::WriteBatch* batch = new leveldb::WriteBatch(); int data_size; bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { - if (!ReadImageToDatum(root_folder + lines[line_id].first, lines[line_id].second, - &datum)) { + if (!ReadImageToDatum(root_folder + lines[line_id].first, + lines[line_id].second, &datum)) { continue; - }; + } if (!data_size_initialized) { data_size = datum.channels() * datum.height() * datum.width(); data_size_initialized = true; } else { const string& data = datum.data(); - CHECK_EQ(data.size(), data_size) << "Incorrect data field size " << data.size(); + CHECK_EQ(data.size(), data_size) << "Incorrect data field size " + << data.size(); } // sequential - snprintf(key_cstr, maxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); + snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, + lines[line_id].first.c_str()); string value; // get the value datum.SerializeToString(&value); diff --git a/tools/device_query.cpp b/tools/device_query.cpp index 88bf5aaafb9..920e81b185a 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -5,7 +5,7 @@ #include "caffe/net.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { if (argc > 2) { diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index 0d6e2d0a73a..48804f29928 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -4,16 +4,18 @@ // all the intermediate blobs produced by the net to individual binary // files stored in protobuffer binary formats. // Usage: -// dump_network input_net_param trained_net_param input_blob output_prefix 0/1 +// dump_network input_net_param trained_net_param \ +// input_blob output_prefix 0/1 // if input_net_param is 'none', we will directly load the network from // trained_net_param. If the last argv is 1, we will do a forward-backward pass // before dumping everyting, and also dump the who network. -#include -#include -#include +#include +#include -#include +#include "cuda_runtime.h" +#include "fcntl.h" +#include "google/protobuf/text_format.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -23,7 +25,7 @@ #include "caffe/util/io.hpp" #include "caffe/solver.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { cudaSetDevice(1); @@ -63,7 +65,8 @@ int main(int argc, char** argv) { // Dump the network NetParameter output_net_param; caffe_net->ToProto(&output_net_param, true); - WriteProtoToBinaryFile(output_net_param, output_prefix + output_net_param.name()); + WriteProtoToBinaryFile(output_net_param, + output_prefix + output_net_param.name()); } // Now, let's dump all the layers @@ -74,7 +77,8 @@ int main(int argc, char** argv) { LOG(ERROR) << "Dumping " << blob_names[blobid]; BlobProto output_blob_proto; blobs[blobid]->ToProto(&output_blob_proto); - WriteProtoToBinaryFile(output_blob_proto, output_prefix + blob_names[blobid]); + WriteProtoToBinaryFile(output_blob_proto, + output_prefix + blob_names[blobid]); } return 0; diff --git a/tools/extra/parselog.sh b/tools/extra/parselog.sh index 8b7ce473d3a..39927a64fcc 100755 --- a/tools/extra/parselog.sh +++ b/tools/extra/parselog.sh @@ -3,6 +3,9 @@ # It creates two files one caffe.log.test that contains the loss and test accuracy of the test and # another one caffe.log.loss that contains the loss computed during the training +#get the dirname of the script +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + if [ "$#" -lt 1 ] then echo "Usage parselog.sh /path/to/your.log" @@ -18,7 +21,7 @@ grep 'Test score #1' aux.txt | awk '{print $8}' > aux2.txt # For extraction of time since this line constains the start time grep '] Solving ' $1 > aux3.txt grep 'Testing net' $1 >> aux3.txt -./extract_seconds.py aux3.txt aux4.txt +$DIR/extract_seconds.py aux3.txt aux4.txt # Generating echo '# Iters Seconds TestAccuracy TestLoss'> $LOG.test @@ -33,7 +36,7 @@ grep ', loss = ' $1 | awk '{print $9}' > aux1.txt grep ', lr = ' $1 | awk '{print $9}' > aux2.txt # Extracting elpased seconds -./extract_seconds.py aux.txt aux3.txt +$DIR/extract_seconds.py aux.txt aux3.txt # Generating echo '# Iters Seconds TrainingLoss LearningRate'> $LOG.train diff --git a/tools/extra/plot_training_log.py.example b/tools/extra/plot_training_log.py.example index b40cbc77067..a68ab2f6c32 100755 --- a/tools/extra/plot_training_log.py.example +++ b/tools/extra/plot_training_log.py.example @@ -1,4 +1,5 @@ #!/usr/bin/env python +import inspect import os import random import sys @@ -9,7 +10,8 @@ import matplotlib.legend as lgd import matplotlib.markers as mks def get_log_parsing_script(): - return './parselog.sh' + dirname = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) + return dirname + '/parselog.sh' def get_log_file_suffix(): return '.log' @@ -22,7 +24,7 @@ def is_x_axis_field(field): return field in x_axis_fields def create_field_index(): - train_key = 'Training' + train_key = 'Train' test_key = 'Test' field_index = {train_key:{'Iters':0, 'Seconds':1, train_key + ' loss':2, train_key + ' learning rate':3}, @@ -59,7 +61,7 @@ def get_data_file_type(chart_type): return data_file_type def get_data_file(chart_type, path_to_log): - return path_to_log + '.' + get_data_file_type(chart_type).lower() + return os.path.basename(path_to_log) + '.' + get_data_file_type(chart_type).lower() def get_field_descriptions(chart_type): description = get_chart_type_description(chart_type).split( diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index 559715d6707..2aad7385bff 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -6,11 +6,11 @@ #include -#include +#include #include "caffe/caffe.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index dd6f3ed2c00..96d40a2eb37 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -6,23 +6,25 @@ #include #include +#include +#include #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/net.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/solver.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { - int total_iter = 50; - if (argc < 2) { - LOG(ERROR) << "net_speed_benchmark net_proto [iterations=50] [CPU/GPU] [Device_id=0]"; + LOG(ERROR) << "net_speed_benchmark net_proto [iterations=50]" + " [CPU/GPU] [Device_id=0]"; return 0; } @@ -64,29 +66,37 @@ int main(int argc, char** argv) { vector*> >& bottom_vecs = caffe_net.bottom_vecs(); vector*> >& top_vecs = caffe_net.top_vecs(); LOG(ERROR) << "*** Benchmark begins ***"; - clock_t forward_start = clock(); + Timer total_timer; + total_timer.Start(); + Timer forward_timer; + forward_timer.Start(); + Timer timer; for (int i = 0; i < layers.size(); ++i) { const string& layername = layers[i]->layer_param().name(); - clock_t start = clock(); + timer.Start(); for (int j = 0; j < total_iter; ++j) { layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); } - LOG(ERROR) << layername << "\tforward: " - << float(clock() - start) / CLOCKS_PER_SEC << " seconds."; + LOG(ERROR) << layername << "\tforward: " << timer.MilliSeconds() << + " milli seconds."; } - LOG(ERROR) << "Forward pass: " << float(clock() - forward_start) / CLOCKS_PER_SEC << " seconds."; - clock_t backward_start = clock(); + LOG(ERROR) << "Forward pass: " << forward_timer.MilliSeconds() << + " milli seconds."; + Timer backward_timer; + backward_timer.Start(); for (int i = layers.size() - 1; i >= 0; --i) { const string& layername = layers[i]->layer_param().name(); - clock_t start = clock(); + timer.Start(); for (int j = 0; j < total_iter; ++j) { layers[i]->Backward(top_vecs[i], true, &bottom_vecs[i]); } LOG(ERROR) << layername << "\tbackward: " - << float(clock() - start) / CLOCKS_PER_SEC << " seconds."; + << timer.MilliSeconds() << " milli seconds."; } - LOG(ERROR) << "Backward pass: " << float(clock() - backward_start) / CLOCKS_PER_SEC << " seconds."; - LOG(ERROR) << "Total Time: " << float(clock() - forward_start) / CLOCKS_PER_SEC << " seconds."; + LOG(ERROR) << "Backward pass: " << backward_timer.MilliSeconds() << + " milli seconds."; + LOG(ERROR) << "Total Time: " << total_timer.MilliSeconds() << + " milli seconds."; LOG(ERROR) << "*** Benchmark ends ***"; return 0; } diff --git a/tools/test_net.cpp b/tools/test_net.cpp index 5b8305af8b8..c4c992aa776 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -10,14 +10,16 @@ #include #include +#include #include "caffe/caffe.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { if (argc < 4) { - LOG(ERROR) << "test_net net_proto pretrained_net_proto iterations [CPU/GPU]"; + LOG(ERROR) << "test_net net_proto pretrained_net_proto iterations " + << "[CPU/GPU]"; return 0; } diff --git a/tools/train_net.cpp b/tools/train_net.cpp index ce62616b118..3bd4f8783ac 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -11,7 +11,7 @@ #include "caffe/caffe.hpp" -using namespace caffe; +using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]);