1
classdef Solver < handle
2
% Wrapper class of caffe::SGDSolver in matlab
4
properties (Access = private)
11
properties (SetAccess = private)
17
function self = Solver(varargin)
18
% decide whether to construct a solver from solver_file or handle
19
if ~(nargin == 1 && isstruct(varargin{1}))
20
% construct a solver from solver_file
21
self = caffe.get_solver(varargin{:});
24
% construct a solver from handle
25
hSolver_solver = varargin{1};
26
CHECK(is_valid_handle(hSolver_solver), 'invalid Solver handle');
28
% setup self handle and attributes
29
self.hSolver_self = hSolver_solver;
30
self.attributes = caffe_('solver_get_attr', self.hSolver_self);
32
% setup net and test_nets
33
self.net = caffe.Net(self.attributes.hNet_net);
34
self.test_nets = caffe.Net.empty();
35
for n = 1:length(self.attributes.hNet_test_nets)
36
self.test_nets(n) = caffe.Net(self.attributes.hNet_test_nets(n));
39
function delete (self)
40
caffe_('delete_solver', self.hSolver_self);
42
function iter = iter(self)
43
iter = caffe_('solver_get_iter', self.hSolver_self);
45
function restore(self, snapshot_filename)
46
CHECK(ischar(snapshot_filename), 'snapshot_filename must be a string');
47
CHECK_FILE_EXIST(snapshot_filename);
48
caffe_('solver_restore', self.hSolver_self, snapshot_filename);
51
caffe_('solver_solve', self.hSolver_self);
53
function step(self, iters)
54
CHECK(isscalar(iters) && iters > 0, 'iters must be positive integer');
55
iters = double(iters);
56
caffe_('solver_step', self.hSolver_self, iters);