misc update. Moved the data to caffe/src/ and will not store it in the repo any more...
authorYangqing Jia <jiayq84@gmail.com>
Wed, 9 Oct 2013 17:57:02 +0000 (10:57 -0700)
committerYangqing Jia <jiayq84@gmail.com>
Wed, 9 Oct 2013 17:57:02 +0000 (10:57 -0700)
15 files changed:
src/caffe/layers/pooling_layer.cpp
src/caffe/layers/pooling_layer.cu
src/caffe/test/data/lena_256.jpg [deleted file]
src/caffe/test/data/lenet.prototxt [deleted file]
src/caffe/test/data/lenet_test.prototxt [deleted file]
src/caffe/test/data/lenet_traintest.prototxt [deleted file]
src/caffe/test/data/linear_regression.prototxt [deleted file]
src/caffe/test/data/mnist.py [deleted file]
src/caffe/test/data/simple_conv.prototxt [deleted file]
src/caffe/test/data/simple_linear_regression_data.py [deleted file]
src/caffe/test/test_net_proto.cpp
src/caffe/test/test_simple_conv.cpp
src/caffe/test/test_solver_linear_regression.cpp
src/programs/demo_mnist.cpp
src/programs/train_alexnet.cpp

index e8bc9b7..7de2a64 100644 (file)
@@ -92,6 +92,8 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
                     bottom_data[h * WIDTH_ + w];
               }
             }
+            top_data[ph * POOLED_WIDTH_ + pw] /=
+                (hend - hstart) * (wend - wstart);
           }
         }
         // compute offset
@@ -99,12 +101,6 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
         top_data += (*top)[0]->offset(0, 1);
       }
     }
-    // Our implementation simply divides the pooled values by KSIZE^2,
-    // regardless of the actual pooling region. This would allow one to not
-    // trust too much on the border pooling regions, but I am not sure what
-    // benefit / harm it would bring to the actual code.
-    caffe_scal<Dtype>(top_count, Dtype(1.) / KSIZE_ / KSIZE_,
-        (*top)[0]->mutable_cpu_data());
     break;
   default:
     LOG(FATAL) << "Unknown pooling method.";
@@ -164,10 +160,11 @@ Dtype PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
             int wstart = pw * STRIDE_;
             int hend = min(hstart + KSIZE_, HEIGHT_);
             int wend = min(wstart + KSIZE_, WIDTH_);
+            int poolsize = (hend - hstart) * (wend - wstart);
             for (int h = hstart; h < hend; ++h) {
               for (int w = wstart; w < wend; ++w) {
                 bottom_diff[h * WIDTH_ + w] +=
-                  top_diff[ph * POOLED_WIDTH_ + pw];
+                  top_diff[ph * POOLED_WIDTH_ + pw] / poolsize;
               }
             }
           }
@@ -179,12 +176,6 @@ Dtype PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
         top_diff += top[0]->offset(0, 1);
       }
     }
-    // Our implementation simply divides the pooled values by KSIZE^2,
-    // regardless of the actual pooling region. This would allow one to not
-    // trust too much on the border pooling regions, but I am not sure what
-    // benefit / harm it would bring to the actual code.
-    caffe_scal<Dtype>((*bottom)[0]->count(), Dtype(1.) / KSIZE_ / KSIZE_,
-        (*bottom)[0]->mutable_cpu_diff());
     break;
   default:
     LOG(FATAL) << "Unknown pooling method.";
index 3e0cb38..43d1ab5 100644 (file)
@@ -61,7 +61,7 @@ __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data,
         aveval += bottom_data[h * width + w];
       }
     }
-    top_data[index] = aveval / ksize / ksize;
+    top_data[index] = aveval / (hend - hstart) / (wend - wstart);
   }  // (if index < nthreads)
 }
 
@@ -109,7 +109,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data,
     int pwstart = (w < ksize) ? 0 : (w - ksize) / stride + 1;
     int pwend = min(w / stride + 1, pooled_width);
     Dtype gradient = 0;
-    Dtype bottom_datum = 
+    Dtype bottom_datum =
         bottom_data[((n * channels + c) * height + h) * width + w];
     top_data += (n * channels + c) * pooled_height * pooled_width;
     top_diff += (n * channels + c) * pooled_height * pooled_width;
@@ -146,10 +146,16 @@ __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff,
     top_diff += (n * channels + c) * pooled_height * pooled_width;
     for (int ph = phstart; ph < phend; ++ph) {
       for (int pw = pwstart; pw < pwend; ++pw) {
-        gradient += top_diff[ph * pooled_width + pw];
+        // figure out the pooling size
+        int poolsize = (min(ph * stride + ksize, height) - ph * stride) *
+            (min(pw * stride + ksize, width) - pw * stride);
+        if (poolsize <= 0) {
+          printf("error: %d %d %d %d %d\n", ph, pw, ksize, height, width);
+        }
+        gradient += top_diff[ph * pooled_width + pw] / poolsize;
       }
     }
-    bottom_diff[index] = gradient / ksize / ksize;
+    bottom_diff[index] = gradient;
   }  // (if index < nthreads)
 }
 
diff --git a/src/caffe/test/data/lena_256.jpg b/src/caffe/test/data/lena_256.jpg
deleted file mode 100644 (file)
index 7b834b6..0000000
Binary files a/src/caffe/test/data/lena_256.jpg and /dev/null differ
diff --git a/src/caffe/test/data/lenet.prototxt b/src/caffe/test/data/lenet.prototxt
deleted file mode 100644 (file)
index 26f53f0..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-name: "LeNet"
-layers {
-  layer {
-    name: "mnist"
-    type: "data"
-    source: "caffe/test/data/mnist-train-leveldb"
-    batchsize: 128
-    scale: 0.00390625
-    cropsize: 26
-  }
-  top: "data"
-  top: "label"
-}
-layers {
-  layer {
-    name: "conv1"
-    type: "conv"
-    num_output: 20
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "data"
-  top: "conv1"
-}
-layers {
-  layer {
-    name: "pool1"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv1"
-  top: "pool1"
-}
-layers {
-  layer {
-    name: "conv2"
-    type: "conv"
-    num_output: 50
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool1"
-  top: "conv2"
-}
-layers {
-  layer {
-    name: "pool2"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv2"
-  top: "pool2"
-}
-layers {
-  layer {
-    name: "ip1"
-    type: "innerproduct"
-    num_output: 500
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool2"
-  top: "ip1"
-}
-layers {
-  layer {
-    name: "relu1"
-    type: "relu"
-  }
-  bottom: "ip1"
-  top: "relu1"
-}
-layers {
-  layer {
-    name: "ip2"
-    type: "innerproduct"
-    num_output: 10
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "relu1"
-  top: "ip2"
-}
-layers {
-  layer {
-    name: "prob"
-    type: "softmax"
-  }
-  bottom: "ip2"
-  top: "prob"
-}
-layers {
-  layer {
-    name: "loss"
-    type: "multinomial_logistic_loss"
-  }
-  bottom: "prob"
-  bottom: "label"
-}
diff --git a/src/caffe/test/data/lenet_test.prototxt b/src/caffe/test/data/lenet_test.prototxt
deleted file mode 100644 (file)
index a714d85..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-name: "LeNet-test"
-layers {
-  layer {
-    name: "mnist"
-    type: "data"
-    source: "caffe/test/data/mnist-test-leveldb"
-    batchsize: 100
-    scale: 0.00390625
-    cropsize: 26
-  }
-  top: "data"
-  top: "label"
-}
-layers {
-  layer {
-    name: "conv1"
-    type: "conv"
-    num_output: 20
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "data"
-  top: "conv1"
-}
-layers {
-  layer {
-    name: "pool1"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv1"
-  top: "pool1"
-}
-layers {
-  layer {
-    name: "conv2"
-    type: "conv"
-    num_output: 50
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool1"
-  top: "conv2"
-}
-layers {
-  layer {
-    name: "pool2"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv2"
-  top: "pool2"
-}
-layers {
-  layer {
-    name: "ip1"
-    type: "innerproduct"
-    num_output: 500
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool2"
-  top: "ip1"
-}
-layers {
-  layer {
-    name: "relu1"
-    type: "relu"
-  }
-  bottom: "ip1"
-  top: "relu1"
-}
-layers {
-  layer {
-    name: "ip2"
-    type: "innerproduct"
-    num_output: 10
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "relu1"
-  top: "ip2"
-}
-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/src/caffe/test/data/lenet_traintest.prototxt b/src/caffe/test/data/lenet_traintest.prototxt
deleted file mode 100644 (file)
index 029b0fd..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-name: "LeNet-test"
-layers {
-  layer {
-    name: "mnist"
-    type: "data"
-    source: "caffe/test/data/mnist-train-leveldb"
-    batchsize: 100
-    scale: 0.00390625
-    cropsize: 26
-  }
-  top: "data"
-  top: "label"
-}
-layers {
-  layer {
-    name: "conv1"
-    type: "conv"
-    num_output: 20
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "data"
-  top: "conv1"
-}
-layers {
-  layer {
-    name: "pool1"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv1"
-  top: "pool1"
-}
-layers {
-  layer {
-    name: "conv2"
-    type: "conv"
-    num_output: 50
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool1"
-  top: "conv2"
-}
-layers {
-  layer {
-    name: "pool2"
-    type: "pool"
-    kernelsize: 2
-    stride: 2
-    pool: MAX
-  }
-  bottom: "conv2"
-  top: "pool2"
-}
-layers {
-  layer {
-    name: "ip1"
-    type: "innerproduct"
-    num_output: 500
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "pool2"
-  top: "ip1"
-}
-layers {
-  layer {
-    name: "relu1"
-    type: "relu"
-  }
-  bottom: "ip1"
-  top: "relu1"
-}
-layers {
-  layer {
-    name: "ip2"
-    type: "innerproduct"
-    num_output: 10
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "relu1"
-  top: "ip2"
-}
-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/src/caffe/test/data/linear_regression.prototxt b/src/caffe/test/data/linear_regression.prototxt
deleted file mode 100644 (file)
index d509a55..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-name: "linear_regression_net"
-layers {
-  layer {
-    name: "datalayer"
-    type: "data"
-    source: "caffe/test/data/simple-linear-regression-leveldb"
-    batchsize: 32
-  }
-  top: "data"
-  top: "label"
-}
-layers {
-  layer {
-    name: "ip"
-    type: "innerproduct"
-    num_output: 1
-    weight_filler {
-      type: "xavier"
-    }
-    bias_filler {
-      type: "constant"
-    }
-  }
-  bottom: "data"
-  top: "ip"
-}
-layers {
-  layer {
-    name: "loss"
-    type: "euclidean_loss"
-  }
-  bottom: "ip"
-  bottom: "label"
-}
diff --git a/src/caffe/test/data/mnist.py b/src/caffe/test/data/mnist.py
deleted file mode 100644 (file)
index 02ae7f5..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-"""This script generates the mnist train and test leveldbs used in the
-test.
-"""
-from caffe.pyutil import convert
-from decaf.layers import core_layers
-import numpy as np
-import leveldb
-
-# the folder that has the MNIST data
-MNIST_ROOT = 'mnist'
-
-mnist = core_layers.MNISTDataLayer(
-    rootfolder=MNIST_ROOT, name='mnist', is_training = True)
-db = leveldb.LevelDB('mnist-train-leveldb')
-
-for i in range(60000):
-  datum = convert.array_to_datum((mnist._data[i] * 255).reshape(1,28,28).astype(np.uint8))
-  datum.label = mnist._label[i]
-  db.Put('%d' % (i), datum.SerializeToString())
-del db
-
-mnist = core_layers.MNISTDataLayer(
-    rootfolder=MNIST_ROOT, name='mnist', is_training = False)
-db = leveldb.LevelDB('mnist-test-leveldb')
-
-for i in range(10000):
-  datum = convert.array_to_datum((mnist._data[i] * 255).reshape(1,28,28).astype(np.uint8))
-  datum.label = mnist._label[i]
-  db.Put('%d' % (i), datum.SerializeToString())
-del db
diff --git a/src/caffe/test/data/simple_conv.prototxt b/src/caffe/test/data/simple_conv.prototxt
deleted file mode 100644 (file)
index 4000da6..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-name: "SimpleConv"
-input: "data"
-layers {
-  layer {
-    name: "conv"
-    type: "conv"
-    num_output: 1
-    kernelsize: 5
-    stride: 1
-    weight_filler {
-      type: "constant"
-      value: 0.01333333
-    }
-    biasterm: false
-  }
-  bottom: "data"
-  top: "smooth"
-}
diff --git a/src/caffe/test/data/simple_linear_regression_data.py b/src/caffe/test/data/simple_linear_regression_data.py
deleted file mode 100644 (file)
index e8fe840..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-"""This script generates the mnist train and test leveldbs used in the
-test.
-"""
-from caffe.pyutil import convert
-import numpy as np
-import leveldb
-
-db = leveldb.LevelDB('simple-linear-regression-leveldb')
-
-for i in range(1000):
-  label = np.random.randint(2) * 2 - 1
-  arr = np.random.randn(2,1,1) + label
-  datum = convert.array_to_datum(arr)
-  datum.label = label
-  db.Put('%d' % (i), datum.SerializeToString())
-del db
index 8cfbd77..642ce30 100644 (file)
@@ -27,7 +27,7 @@ TYPED_TEST_CASE(NetProtoTest, Dtypes);
 
 TYPED_TEST(NetProtoTest, TestSetup) {
   NetParameter net_param;
-  ReadProtoFromTextFile("caffe/test/data/lenet.prototxt", &net_param);
+  ReadProtoFromTextFile("data/lenet.prototxt", &net_param);
   // check if things are right
   EXPECT_EQ(net_param.layers_size(), 10);
   EXPECT_EQ(net_param.input_size(), 0);
index 98dfa3c..f5fe489 100644 (file)
@@ -22,9 +22,9 @@ TYPED_TEST_CASE(NetProtoTest, Dtypes);
 
 TYPED_TEST(NetProtoTest, TestLoadFromText) {
   NetParameter net_param;
-  ReadProtoFromTextFile("caffe/test/data/simple_conv.prototxt", &net_param);
+  ReadProtoFromTextFile("data/simple_conv.prototxt", &net_param);
   Blob<TypeParam> lena_image;
-  ReadImageToBlob<TypeParam>(string("caffe/test/data/lena_256.jpg"), &lena_image);
+  ReadImageToBlob<TypeParam>(string("data/lena_256.jpg"), &lena_image);
   vector<Blob<TypeParam>*> bottom_vec;
   bottom_vec.push_back(&lena_image);
 
index f368908..fbd53f3 100644 (file)
@@ -30,7 +30,7 @@ TYPED_TEST(SolverTest, TestSolve) {
   Caffe::set_mode(Caffe::GPU);
 
   NetParameter net_param;
-  ReadProtoFromTextFile("caffe/test/data/linear_regression.prototxt",
+  ReadProtoFromTextFile("data/linear_regression.prototxt",
       &net_param);
   // check if things are right
   EXPECT_EQ(net_param.layers_size(), 3);
index e5712a8..6d15d75 100644 (file)
@@ -21,7 +21,7 @@ int main(int argc, char** argv) {
   Caffe::set_mode(Caffe::GPU);
 
   NetParameter net_param;
-  ReadProtoFromTextFile("caffe/test/data/lenet.prototxt",
+  ReadProtoFromTextFile("data/lenet.prototxt",
       &net_param);
   vector<Blob<float>*> bottom_vec;
   Net<float> caffe_net(net_param, bottom_vec);
@@ -58,7 +58,7 @@ int main(int argc, char** argv) {
   caffe_net.ToProto(&trained_net_param);
 
   NetParameter traintest_net_param;
-  ReadProtoFromTextFile("caffe/test/data/lenet_traintest.prototxt",
+  ReadProtoFromTextFile("data/lenet_traintest.prototxt",
       &traintest_net_param);
   Net<float> caffe_traintest_net(traintest_net_param, bottom_vec);
   caffe_traintest_net.CopyTrainedLayersFrom(trained_net_param);
@@ -75,7 +75,7 @@ int main(int argc, char** argv) {
   LOG(ERROR) << "Train accuracy:" << train_accuracy;
 
   NetParameter test_net_param;
-  ReadProtoFromTextFile("caffe/test/data/lenet_test.prototxt", &test_net_param);
+  ReadProtoFromTextFile("data/lenet_test.prototxt", &test_net_param);
   Net<float> caffe_test_net(test_net_param, bottom_vec);
   caffe_test_net.CopyTrainedLayersFrom(trained_net_param);
 
index 6b2260a..2063efd 100644 (file)
@@ -33,9 +33,9 @@ int main(int argc, char** argv) {
   LOG(ERROR) << "Initial loss: " << caffe_net.Backward();
 
   SolverParameter solver_param;
-  solver_param.set_base_lr(0.002);
+  solver_param.set_base_lr(0.001);
   solver_param.set_display(1);
-  solver_param.set_max_iter(600000);
+  solver_param.set_max_iter(60000);
   solver_param.set_lr_policy("fixed");
   solver_param.set_momentum(0.9);
   solver_param.set_weight_decay(0.0005);