1 // Copyright 2013 Yangqing Jia
3 #include <cuda_runtime.h>
5 #include <google/protobuf/text_format.h>
6 #include <google/protobuf/io/zero_copy_stream_impl.h>
7 #include <gtest/gtest.h>
11 #include "caffe/blob.hpp"
12 #include "caffe/common.hpp"
13 #include "caffe/net.hpp"
14 #include "caffe/filler.hpp"
15 #include "caffe/proto/caffe.pb.h"
16 #include "caffe/util/io.hpp"
17 #include "caffe/optimization/solver.hpp"
19 #include "caffe/test/test_caffe_main.hpp"
23 template <typename Dtype>
24 class SolverTest : public ::testing::Test {};
26 typedef ::testing::Types<float, double> Dtypes;
27 TYPED_TEST_CASE(SolverTest, Dtypes);
29 TYPED_TEST(SolverTest, TestSolveGPU) {
30 Caffe::set_mode(Caffe::GPU);
32 NetParameter net_param;
33 ReadProtoFromTextFile("data/linear_regression.prototxt",
35 // check if things are right
36 EXPECT_EQ(net_param.layers_size(), 3);
37 EXPECT_EQ(net_param.input_size(), 0);
38 vector<Blob<TypeParam>*> bottom_vec;
39 Net<TypeParam> caffe_net(net_param, bottom_vec);
40 EXPECT_EQ(caffe_net.layer_names().size(), 3);
41 EXPECT_EQ(caffe_net.blob_names().size(), 3);
43 // Run the network without training.
44 LOG(INFO) << "Performing Forward";
45 caffe_net.Forward(bottom_vec);
46 LOG(INFO) << "Performing Backward";
47 LOG(INFO) << "Initial loss: " << caffe_net.Backward();
49 SolverParameter solver_param;
50 solver_param.set_base_lr(0.1);
51 solver_param.set_display(0);
52 solver_param.set_max_iter(100);
53 solver_param.set_lr_policy("inv");
54 solver_param.set_gamma(1.);
55 solver_param.set_power(0.75);
56 solver_param.set_momentum(0.9);
58 LOG(INFO) << "Starting Optimization";
59 SGDSolver<TypeParam> solver(solver_param);
60 solver.Solve(&caffe_net);
61 LOG(INFO) << "Optimization Done.";
62 LOG(INFO) << "Weight: " << caffe_net.params()[0]->cpu_data()[0] << ", "
63 << caffe_net.params()[0]->cpu_data()[1];
64 LOG(INFO) << "Bias: " << caffe_net.params()[1]->cpu_data()[0];
66 EXPECT_GE(caffe_net.params()[0]->cpu_data()[0], 0.3);
67 EXPECT_LE(caffe_net.params()[0]->cpu_data()[0], 0.35);
69 EXPECT_GE(caffe_net.params()[0]->cpu_data()[1], 0.3);
70 EXPECT_LE(caffe_net.params()[0]->cpu_data()[1], 0.35);
72 EXPECT_GE(caffe_net.params()[1]->cpu_data()[0], -0.01);
73 EXPECT_LE(caffe_net.params()[1]->cpu_data()[0], 0.01);
78 TYPED_TEST(SolverTest, TestSolveCPU) {
79 Caffe::set_mode(Caffe::CPU);
81 NetParameter net_param;
82 ReadProtoFromTextFile("data/linear_regression.prototxt",
84 // check if things are right
85 EXPECT_EQ(net_param.layers_size(), 3);
86 EXPECT_EQ(net_param.input_size(), 0);
87 vector<Blob<TypeParam>*> bottom_vec;
88 Net<TypeParam> caffe_net(net_param, bottom_vec);
89 EXPECT_EQ(caffe_net.layer_names().size(), 3);
90 EXPECT_EQ(caffe_net.blob_names().size(), 3);
92 // Run the network without training.
93 LOG(INFO) << "Performing Forward";
94 caffe_net.Forward(bottom_vec);
95 LOG(INFO) << "Performing Backward";
96 LOG(INFO) << "Initial loss: " << caffe_net.Backward();
98 SolverParameter solver_param;
99 solver_param.set_base_lr(0.1);
100 solver_param.set_display(0);
101 solver_param.set_max_iter(100);
102 solver_param.set_lr_policy("inv");
103 solver_param.set_gamma(1.);
104 solver_param.set_power(0.75);
105 solver_param.set_momentum(0.9);
107 LOG(INFO) << "Starting Optimization";
108 SGDSolver<TypeParam> solver(solver_param);
109 solver.Solve(&caffe_net);
110 LOG(INFO) << "Optimization Done.";
111 LOG(INFO) << "Weight: " << caffe_net.params()[0]->cpu_data()[0] << ", "
112 << caffe_net.params()[0]->cpu_data()[1];
113 LOG(INFO) << "Bias: " << caffe_net.params()[1]->cpu_data()[0];
115 EXPECT_GE(caffe_net.params()[0]->cpu_data()[0], 0.3);
116 EXPECT_LE(caffe_net.params()[0]->cpu_data()[0], 0.35);
118 EXPECT_GE(caffe_net.params()[0]->cpu_data()[1], 0.3);
119 EXPECT_LE(caffe_net.params()[0]->cpu_data()[1], 0.35);
121 EXPECT_GE(caffe_net.params()[1]->cpu_data()[0], -0.01);
122 EXPECT_LE(caffe_net.params()[1]->cpu_data()[0], 0.01);