28 #ifndef SHARK_MODELS_TIEDAUTOENCODER_H 29 #define SHARK_MODELS_TIEDAUTOENCODER_H 34 #include <boost/serialization/vector.hpp> 44 template<
class H
iddenNeuron,
class OutputNeuron>
47 struct InternalState:
public State{
49 RealMatrix outputResponses;
61 return "TiedAutoencoder";
99 return m_weightMatrix;
103 return m_weightMatrix;
109 return trans(m_weightMatrix);
115 return trans(m_weightMatrix);
126 init(parameters) <<
toVector(m_weightMatrix),m_hiddenBias,m_outputBias;
132 init(newParameters) >>
toVector(m_weightMatrix),m_hiddenBias,m_outputBias;
137 return m_hiddenNeuron;
141 return m_outputNeuron;
146 return m_hiddenNeuron;
150 return m_outputNeuron;
158 InternalState
const& s = state.
toState<InternalState>();
159 return s.hiddenResponses;
163 return boost::shared_ptr<State>(
new InternalState());
166 void evalLayer(std::size_t layer,RealMatrix
const& patterns,RealMatrix& outputs)
const{
168 std::size_t numPatterns = patterns.size1();
173 outputs.resize(numPatterns,numOutputs);
175 noalias(outputs) = m_hiddenNeuron(outputs);
180 outputs.resize(numPatterns,numOutputs);
182 noalias(outputs) = m_outputNeuron(outputs);
208 template<
class Label>
215 template<
class Label>
222 void eval(RealMatrix
const& patterns,RealMatrix& output,
State& state)
const{
223 InternalState& s = state.
toState<InternalState>();
225 evalLayer(1,s.hiddenResponses,s.outputResponses);
226 output = s.outputResponses;
231 BatchInputType const& patterns, RealMatrix
const& coefficients,
State const& state, RealVector& gradient
234 SIZE_CHECK(coefficients.size1() == patterns.size1());
236 RealMatrix outputDelta = coefficients;
237 RealMatrix hiddenDelta;
238 computeDelta(state,outputDelta,hiddenDelta);
239 computeParameterDerivative(patterns,outputDelta,hiddenDelta,state,gradient);
246 SIZE_CHECK(coefficients.size1() == patterns.size1());
248 RealMatrix outputDelta = coefficients;
249 RealMatrix hiddenDelta;
250 computeDelta(state,outputDelta,hiddenDelta,inputDerivative);
257 RealVector& parameterDerivative,
261 SIZE_CHECK(coefficients.size1() == patterns.size1());
263 RealMatrix outputDelta = coefficients;
264 RealMatrix hiddenDelta;
265 computeDelta(state,outputDelta,hiddenDelta,inputDerivative);
266 computeParameterDerivative(patterns,outputDelta,hiddenDelta,state,parameterDerivative);
270 std::size_t in,std::size_t hidden
272 m_weightMatrix.resize(hidden,in);
273 m_hiddenBias.resize(hidden);
274 m_outputBias.resize(in);
279 archive>>m_weightMatrix;
280 archive>>m_hiddenBias;
281 archive>>m_outputBias;
286 archive<<m_weightMatrix;
287 archive<<m_hiddenBias;
288 archive<<m_outputBias;
295 State const& state, RealMatrix& outputDelta, RealMatrix& hiddenDelta
297 InternalState
const& s = state.
toState<InternalState>();
299 noalias(outputDelta) *= m_outputNeuron.derivative(s.outputResponses);
302 noalias(hiddenDelta) *= m_hiddenNeuron.derivative(s.hiddenResponses);
306 State const& state, RealMatrix& outputDelta, RealMatrix& hiddenDelta, RealMatrix& inputDelta
308 computeDelta(state,outputDelta,hiddenDelta);
309 inputDelta.resize(outputDelta.size1(),
inputSize());
313 void computeParameterDerivative(
314 RealMatrix
const& patterns, RealMatrix
const& outputDelta, RealMatrix
const& hiddenDelta,
315 State const& state, RealVector& gradient
317 InternalState
const& s = state.
toState<InternalState>();
323 trans(s.hiddenResponses),
333 std::size_t hiddenBiasPos = hiddenParams;
334 std::size_t outputBiasPos = hiddenBiasPos+numHidden;
340 RealMatrix m_weightMatrix;
342 RealVector m_hiddenBias;
344 RealVector m_outputBias;
347 HiddenNeuron m_hiddenNeuron;
349 OutputNeuron m_outputNeuron;