- refactored

git-svn-id: http://moon:8086/svn/software/trunk/projects/Rbm@818 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2022-01-17 15:03:50 +00:00
parent a372f1a30d
commit bd88074994
8 changed files with 100 additions and 59 deletions
+8 -32
View File
@@ -197,43 +197,19 @@ bool AStack::saveWeights()
return true; return true;
} }
arma::mat AStack::upPass(size_t layerId, const arma::mat& v) arma::mat AStack::trainingBatchFrom(size_t layerId, const arma::mat& batch)
{ {
arma::mat h = arma::zeros(0,0); arma::mat thisBatch = batch;
arma::mat tv = v; Layer *pLayer = getLayer(0);
Layer *pLayer = getLayer(layerId); while (pLayer)
while(pLayer)
{ {
if (pLayer->isEnable()) if (pLayer->id() == layerId)
{ {
h = pLayer->to_h_gibbs(tv); break;
tv = h;
} }
thisBatch = pLayer->toHiddenProbs(thisBatch);
pLayer = pLayer->next; pLayer = pLayer->next;
} }
return h; return thisBatch;
} }
arma::mat AStack::downPass(size_t layerId, const arma::mat& h)
{
arma::mat v = arma::zeros(0,0);
arma::mat th = h;
Layer *pLayer = getLayer(layerId);
while(pLayer)
{
if (pLayer->isEnable())
{
v = pLayer->to_v_gibbs(th);
th = v;
}
pLayer = pLayer->prev;
}
return v;
}
arma::mat AStack::upDownPass(size_t layerId, const arma::mat& v)
{
arma::mat h = upPass(layerId, v);
arma::mat r = downPass(numLayers()-1, h);
return r;
}
+6 -3
View File
@@ -19,6 +19,7 @@
#include <armadillo> #include <armadillo>
#include <jsoncpp/json/json.h> #include <jsoncpp/json/json.h>
#include "Layer.hpp" #include "Layer.hpp"
#include <forward_list>
class LayerConstructor class LayerConstructor
{ {
@@ -63,9 +64,9 @@ public:
bool loadWeights(); bool loadWeights();
bool saveWeights(); bool saveWeights();
arma::mat upPass(size_t layerId, arma::mat const &v); virtual void train(size_t layerId, const arma::mat& batch, Rbm::IListener* pListener) = 0;
arma::mat downPass(size_t layerId, arma::mat const &h); virtual void train(const arma::mat& batch, Rbm::IListener* pListener) = 0;
arma::mat upDownPass(size_t layerId, arma::mat const &v); arma::mat trainingBatchFrom(size_t layerId, const arma::mat& batch);
protected: protected:
StackType m_type; StackType m_type;
@@ -73,6 +74,8 @@ protected:
Layer *m_pLayers; Layer *m_pLayers;
std::string m_dir; std::string m_dir;
private:
}; };
#endif /* ASTACK_HPP */ #endif /* ASTACK_HPP */
+69
View File
@@ -123,3 +123,72 @@ void DeepStack::delTraining(int index)
m_trainingBatch.shed_row(index); m_trainingBatch.shed_row(index);
} }
void DeepStack::train(const arma::mat& batch, Rbm::IListener* pListener)
{
arma::mat thisBatch = batch;
Layer *pLayer = getLayer(0);
while (pLayer)
{
pLayer->train(thisBatch, pListener);
thisBatch = pLayer->toHiddenProbs(thisBatch);
pLayer = pLayer->next;
}
}
void DeepStack::train(size_t layerId, const arma::mat& batch, Rbm::IListener* pListener)
{
arma::mat thisBatch = batch;
Layer *pLayer = getLayer(0);
while (pLayer)
{
if (pLayer->id() == layerId)
{
break;
}
thisBatch = pLayer->toHiddenProbs(thisBatch);
pLayer = pLayer->next;
}
pLayer->train(thisBatch, pListener);
}
arma::mat DeepStack::upPass(size_t layerId, const arma::mat& v)
{
arma::mat h = arma::zeros(0,0);
arma::mat tv = v;
Layer *pLayer = getLayer(layerId);
while(pLayer)
{
if (pLayer->isEnable())
{
h = pLayer->to_h_gibbs(tv);
tv = h;
}
pLayer = pLayer->next;
}
return h;
}
arma::mat DeepStack::downPass(size_t layerId, const arma::mat& h)
{
arma::mat v = arma::zeros(0,0);
arma::mat th = h;
Layer *pLayer = getLayer(layerId);
while(pLayer)
{
if (pLayer->isEnable())
{
v = pLayer->to_v_gibbs(th);
th = v;
}
pLayer = pLayer->prev;
}
return v;
}
arma::mat DeepStack::upDownPass(size_t layerId, const arma::mat& v)
{
arma::mat h = upPass(layerId, v);
arma::mat r = downPass(numLayers()-1, h);
return r;
}
+7
View File
@@ -38,6 +38,13 @@ public:
arma::mat& trainingBatch(); arma::mat& trainingBatch();
arma::mat trainingBatch(Layer *pLayer); arma::mat trainingBatch(Layer *pLayer);
arma::mat upPass(size_t layerId, arma::mat const &v);
arma::mat downPass(size_t layerId, arma::mat const &h);
arma::mat upDownPass(size_t layerId, arma::mat const &v);
void train(const arma::mat& batch, Rbm::IListener* pListener) override;
void train(size_t layerId, const arma::mat& batch, Rbm::IListener* pListener) override;
private: private:
arma::mat m_trainingBatch; arma::mat m_trainingBatch;
}; };
+2 -17
View File
@@ -143,23 +143,8 @@ void Layer::calcContextBatch(arma::mat& batch)
void Layer::train(const arma::mat& batch, IListener* pListener) void Layer::train(const arma::mat& batch, IListener* pListener)
{ {
Rbm::train(trainingData(batch), pListener); std::cout << m_name << ": " << " Training of layer " << std::to_string(id()) << std::endl;
} Rbm::train(batch, pListener);
arma::mat Layer::trainingData(const arma::mat& batch)
{
arma::mat thisBatch = batch;
Layer *pLayer = root();
while (pLayer)
{
if (pLayer == this)
{
break;
}
thisBatch = pLayer->toHiddenProbs(thisBatch);
pLayer = pLayer->next;
}
return thisBatch;
} }
bool Layer::weightsLoad(std::string const &dir, std::string const &prj) bool Layer::weightsLoad(std::string const &dir, std::string const &prj)
+4 -3
View File
@@ -684,7 +684,7 @@ void MainComponent::sliderValueChanged (Slider* sliderThatWasMoved)
{ {
//[UserSliderCode_patterSlider] -- add your slider handling code here.. //[UserSliderCode_patterSlider] -- add your slider handling code here..
m_trainingIndex = (int)sliderThatWasMoved->getValue(); m_trainingIndex = (int)sliderThatWasMoved->getValue();
m_pLayer->setTrainingData(trainingAt(m_trainingIndex)); m_stack->upDownPass(m_pLayer->id(), m_stack->trainingBatchFrom(m_pLayer->id(), trainingAt(m_trainingIndex)));
//[/UserSliderCode_patterSlider] //[/UserSliderCode_patterSlider]
} }
else if (sliderThatWasMoved == WeightsSlider) else if (sliderThatWasMoved == WeightsSlider)
@@ -818,7 +818,7 @@ void MainComponent::comboBoxChanged (ComboBox* comboBoxThatHasChanged)
m_pLayer->redrawWeights(m_weightIndex); m_pLayer->redrawWeights(m_weightIndex);
if (m_stack->trainingBatch().n_rows > 0) if (m_stack->trainingBatch().n_rows > 0)
{ {
m_pLayer->setTrainingData(trainingAt(m_trainingIndex)); m_stack->upDownPass(index, m_stack->trainingBatchFrom(index, trainingAt(m_trainingIndex)));
} }
//[/UserComboBoxCode_m_rbmSelect] //[/UserComboBoxCode_m_rbmSelect]
} }
@@ -902,7 +902,8 @@ void MainComponent::run()
{ {
trainButton->setButtonText (TRANS("Stop")); trainButton->setButtonText (TRANS("Stop"));
m_pLayer->calcContextBatch(m_stack->trainingBatch()); m_pLayer->calcContextBatch(m_stack->trainingBatch());
m_pLayer->train(m_stack->trainingBatch(), this); // m_pLayer->train(m_stack->trainingBatch(), this);
m_stack->train(m_pLayer->id(), m_stack->trainingBatch(), this);
trainButton->setButtonText (TRANS("Train")); trainButton->setButtonText (TRANS("Train"));
} }
+1 -1
View File
@@ -25,7 +25,7 @@
//============================================================================== //==============================================================================
RbmComponent::RbmComponent (AStack &stack, const std::string &name, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, size_t numContext) RbmComponent::RbmComponent (AStack &stack, const std::string &name, size_t id, size_t numVisibleX, size_t numVisibleY, size_t numHidden, size_t numContext)
: Layer(name, id, numVisibleX, numVisibleY, numHidden, numContext) : Layer(name, id, numVisibleX, numVisibleY, numHidden, numContext)
, m_stack(stack) , m_stack(dynamic_cast<DeepStack&>(stack))
, m_currWeightIndexToDraw(0) , m_currWeightIndexToDraw(0)
, DrawVisibleTrain(nullptr) , DrawVisibleTrain(nullptr)
, DrawVisibleReconst(nullptr) , DrawVisibleReconst(nullptr)
+2 -2
View File
@@ -24,7 +24,7 @@
#include "JuceHeader.h" #include "JuceHeader.h"
#include "DrawComponent.hpp" #include "DrawComponent.hpp"
#include "Layer.hpp" #include "Layer.hpp"
#include "AStack.hpp" #include "DeepStack.hpp"
//[/Headers] //[/Headers]
@@ -87,7 +87,7 @@ private:
void onUpPass(const arma::mat& v) override; void onUpPass(const arma::mat& v) override;
void onDownPass(const arma::mat& h) override; void onDownPass(const arma::mat& h) override;
AStack &m_stack; DeepStack &m_stack;
size_t m_currWeightIndexToDraw; size_t m_currWeightIndexToDraw;
void onDraw(DrawComponent &obj) override; void onDraw(DrawComponent &obj) override;
void buttonClicked(Button* buttonThatWasClicked) override; void buttonClicked(Button* buttonThatWasClicked) override;