28 #ifndef SHARK_MODELS_AUTOENCODER_H 29 #define SHARK_MODELS_AUTOENCODER_H 33 #include <boost/serialization/vector.hpp> 45 template<
class H
iddenNeuron,
class OutputNeuron>
48 struct InternalState:
public State{
50 RealMatrix outputResponses;
100 return m_encoderMatrix;
104 return m_encoderMatrix;
109 return m_decoderMatrix;
113 return m_decoderMatrix;
124 init(parameters) <<
toVector(m_encoderMatrix),
toVector(m_decoderMatrix),m_hiddenBias,m_outputBias;
130 init(newParameters) >>
toVector(m_encoderMatrix),
toVector(m_decoderMatrix),m_hiddenBias,m_outputBias;
138 InternalState
const& s = state.
toState<InternalState>();
139 return s.hiddenResponses;
144 return m_hiddenNeuron;
148 return m_outputNeuron;
153 return m_hiddenNeuron;
157 return m_outputNeuron;
161 return boost::shared_ptr<State>(
new InternalState());
164 void evalLayer(std::size_t layer,RealMatrix
const& patterns,RealMatrix& outputs)
const{
166 std::size_t numPatterns = patterns.size1();
171 outputs.resize(numPatterns,numOutputs);
174 noalias(outputs) = m_hiddenNeuron(outputs);
179 outputs.resize(numPatterns,numOutputs);
182 noalias(outputs) = m_outputNeuron(outputs);
208 template<
class Label>
215 template<
class Label>
223 void eval(RealMatrix
const& patterns,RealMatrix& output,
State& state)
const{
224 InternalState& s = state.
toState<InternalState>();
226 evalLayer(1,s.hiddenResponses,s.outputResponses);
227 output = s.outputResponses;
232 BatchInputType const& patterns, RealMatrix
const& coefficients,
State const& state, RealVector& gradient
235 SIZE_CHECK(coefficients.size1() == patterns.size1());
237 RealMatrix outputDelta = coefficients;
238 RealMatrix hiddenDelta;
239 computeDelta(state,outputDelta,hiddenDelta);
240 computeParameterDerivative(patterns,outputDelta,hiddenDelta,state,gradient);
247 SIZE_CHECK(coefficients.size1() == patterns.size1());
249 RealMatrix outputDelta = coefficients;
250 RealMatrix hiddenDelta;
251 computeDelta(state,outputDelta,hiddenDelta,inputDerivative);
258 RealVector& parameterDerivative,
262 SIZE_CHECK(coefficients.size1() == patterns.size1());
264 RealMatrix outputDelta = coefficients;
265 RealMatrix hiddenDelta;
266 computeDelta(state,outputDelta,hiddenDelta,inputDerivative);
267 computeParameterDerivative(patterns,outputDelta,hiddenDelta,state,parameterDerivative);
271 std::size_t in,std::size_t hidden
273 m_encoderMatrix.resize(hidden,in);
274 m_decoderMatrix.resize(in,hidden);
275 m_hiddenBias.resize(hidden);
276 m_outputBias.resize(in);
281 archive>>m_encoderMatrix;
282 archive>>m_decoderMatrix;
283 archive>>m_hiddenBias;
284 archive>>m_outputBias;
289 archive<<m_encoderMatrix;
290 archive<<m_decoderMatrix;
291 archive<<m_hiddenBias;
292 archive<<m_outputBias;
299 State const& state, RealMatrix& outputDelta, RealMatrix& hiddenDelta
301 InternalState
const& s = state.
toState<InternalState>();
303 noalias(outputDelta) *= m_outputNeuron.derivative(s.outputResponses);
306 noalias(hiddenDelta) *= m_hiddenNeuron.derivative(s.hiddenResponses);
310 State const& state, RealMatrix& outputDelta, RealMatrix& hiddenDelta, RealMatrix& inputDelta
312 computeDelta(state,outputDelta,hiddenDelta);
313 inputDelta.resize(outputDelta.size1(),
inputSize());
317 void computeParameterDerivative(
318 RealMatrix
const& patterns, RealMatrix
const& outputDelta, RealMatrix
const& hiddenDelta,
319 State const& state, RealVector& gradient
321 InternalState
const& s = state.
toState<InternalState>();
337 std::size_t hiddenBiasPos = 2*hiddenParams;
338 std::size_t outputBiasPos = hiddenBiasPos+numHidden;
344 RealMatrix m_encoderMatrix;
346 RealMatrix m_decoderMatrix;
348 RealVector m_hiddenBias;
350 RealVector m_outputBias;
353 HiddenNeuron m_hiddenNeuron;
355 OutputNeuron m_outputNeuron;