30 #ifndef SHARK_UNSUPERVISED_RBM_CONVOLUTIONALRBM_H 31 #define SHARK_UNSUPERVISED_RBM_CONVOLUTIONALRBM_H 35 #include <shark/Unsupervised/RBM/Impl/ConvolutionalEnergyGradient.h> 38 #include <boost/serialization/string.hpp> 45 template<
class VisibleLayerT,
class H
iddenLayerT,
class RngT>
50 typedef detail::ConvolutionalEnergyGradient<ConvolutionalRBM>
GradientType;
60 std::size_t m_inputSize1;
61 std::size_t m_inputSize2;
64 std::vector<RealMatrix> m_filters;
67 HiddenType m_hiddenNeurons;
70 VisibleType m_visibleNeurons;
80 void evalForward(BatchInputType
const& state,BatchOutputType& output)
const{
82 typename HiddenType::StatisticsBatch statisticsBatch(batchSize,
numberOfHN());
101 void evalBackward(BatchInputType
const& state,BatchOutputType& output)
const{
103 typename VisibleType::StatisticsBatch statisticsBatch(batchSize,
numberOfVN());
104 RealMatrix inputBatch(batchSize,
numberOfVN());
123 {
return "ConvolutionalRBM"; }
128 parameters += m_hiddenNeurons.numberOfParameters();
129 parameters += m_visibleNeurons.numberOfParameters();
154 std::size_t newInputSize1, std::size_t newInputSize2,
155 std::size_t newNumFilters,
156 std::size_t filterSize
162 std::size_t numVisible = newInputSize1*newInputSize2;
163 std::size_t numHidden = (newInputSize1-filterSize+1)*(newInputSize2-filterSize+1)*newNumFilters;
166 m_filters.resize(newNumFilters,RealMatrix(filterSize,filterSize,0.0));
168 m_hiddenNeurons.resize(numHidden);
169 m_visibleNeurons.resize(numVisible);
171 m_inputSize1 = newInputSize1;
172 m_inputSize2 = newInputSize2;
177 return m_hiddenNeurons;
181 return m_hiddenNeurons;
185 return m_visibleNeurons;
189 return m_visibleNeurons;
193 return m_filters.size();
196 return m_filters.size1();
199 return m_filters.size2();
212 return m_inputSize1-m_filters.size1()+1;
215 return m_inputSize2-m_filters.size2()+1;
250 m_evalMean = evalMean;
254 return boost::shared_ptr<State>(
new EmptyState());
269 void eval(BatchInputType
const& patterns,BatchOutputType& outputs)
const{
271 evalForward(patterns,outputs);
274 evalBackward(patterns,outputs);
279 void eval(BatchInputType
const& patterns, BatchOutputType& outputs,
State& state)
const{
280 eval(patterns,outputs);
287 void inputHidden(RealMatrix& inputs, RealMatrix
const& visibleStates)
const{
288 SIZE_CHECK(visibleStates.size1() == inputs.size1());
293 for(std::size_t i= 0; i != inputs.size1();++i){
294 blas::dense_matrix_adaptor<double const> visibleState =
296 blas::dense_matrix_adaptor<double> responses =
301 std::size_t end1= x1+m_filters.size1();
302 std::size_t end2= x2+m_filters.size2();
303 for(std::size_t f = 0; f != m_filters.size();++f){
316 void inputVisible(RealMatrix& inputs, RealMatrix
const& hiddenStates)
const{
317 SIZE_CHECK(hiddenStates.size1() == inputs.size1());
320 typedef blas::dense_matrix_adaptor<double> Response;
325 for(std::size_t i= 0; i != inputs.size1();++i){
326 blas::dense_matrix_adaptor<double const> hiddenState =
333 std::size_t end1= x1+m_filters.size1();
334 std::size_t end2= x2+m_filters.size2();
335 blas::matrix_range<Response> receptiveArea =
subrange(responses,x1,end1,x2,end2);
337 for(std::size_t f = 0; f != m_filters.size();++f){
338 double neuronResponse = hiddenState(f*
responseSize1()+x1,x2);
339 if(neuronResponse == 0.0)
continue;
340 noalias(receptiveArea) += neuronResponse * m_filters[f];
352 return m_hiddenNeurons.size();
356 return m_visibleNeurons.size();
361 archive >> m_filters;
362 archive >> m_hiddenNeurons;
363 archive >> m_visibleNeurons;
369 std::stringstream stream(str);
375 archive << m_filters;
376 archive << m_hiddenNeurons;
377 archive << m_visibleNeurons;
379 std::stringstream stream;
381 std::string str = stream.str();