camenduru's picture
thanks to openpose ❤
f5bb0c0
classdef Solver < handle
% Wrapper class of caffe::SGDSolver in matlab
properties (Access = private)
hSolver_self
attributes
% attribute fields
% hNet_net
% hNet_test_nets
end
properties (SetAccess = private)
net
test_nets
end
methods
function self = Solver(varargin)
% decide whether to construct a solver from solver_file or handle
if ~(nargin == 1 && isstruct(varargin{1}))
% construct a solver from solver_file
self = caffe.get_solver(varargin{:});
return
end
% construct a solver from handle
hSolver_solver = varargin{1};
CHECK(is_valid_handle(hSolver_solver), 'invalid Solver handle');
% setup self handle and attributes
self.hSolver_self = hSolver_solver;
self.attributes = caffe_('solver_get_attr', self.hSolver_self);
% setup net and test_nets
self.net = caffe.Net(self.attributes.hNet_net);
self.test_nets = caffe.Net.empty();
for n = 1:length(self.attributes.hNet_test_nets)
self.test_nets(n) = caffe.Net(self.attributes.hNet_test_nets(n));
end
end
function delete (self)
caffe_('delete_solver', self.hSolver_self);
end
function iter = iter(self)
iter = caffe_('solver_get_iter', self.hSolver_self);
end
function restore(self, snapshot_filename)
CHECK(ischar(snapshot_filename), 'snapshot_filename must be a string');
CHECK_FILE_EXIST(snapshot_filename);
caffe_('solver_restore', self.hSolver_self, snapshot_filename);
end
function solve(self)
caffe_('solver_solve', self.hSolver_self);
end
function step(self, iters)
CHECK(isscalar(iters) && iters > 0, 'iters must be positive integer');
iters = double(iters);
caffe_('solver_step', self.hSolver_self, iters);
end
end
end