Deepity
Ultra-fast, SIMD-accelerated Predictive Coding
Loading...
Searching...
No Matches
DiscriminativePCNetwork.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <memory>
8
29
30namespace Deep
31{
32 class PCNDiagnostics;
37 {
38 std::vector<std::unique_ptr<DiscriminativePCLayer>> layers;
39 int batchSize;
40 bool autoSize = true;
41
42 public:
46 DiscriminativePCNetwork() : batchSize(0), autoSize(true) {}
51 DiscriminativePCNetwork(int batchSize) : batchSize(batchSize), autoSize(false) {}
52
55
60
70 void AddLayer(int size, int nextSize, float lr, float ir, float pr, float lmbda,
71 void (*act)(float *, size_t), void (*dAct)(float *, size_t, bool));
72
83 void AddLayer(int size, int nextSize, float lr, float ir, float pr, float lmbda,
85
88 void RandomizeWeights(std::mt19937 &rng);
89
92 void Clamp(const std::vector<float> &input);
93
96 float CalculateState();
97
99 void UpdateState();
100
102 void UpdateWeights();
103
105 void UpdatePrecision();
106
110 void ProjectForward() noexcept;
117 float TrainStepWithProjection(const std::vector<float> &x, const std::vector<float> &y, int inferenceSteps);
123 std::vector<float> PredictWithProjection(const std::vector<float> &x, int inferenceSteps);
124
126 void ResetState() noexcept;
127
131 const auto &GetLayers() const noexcept { return layers; }
132
135 int GetBatchSize() const noexcept { return batchSize; }
136
141 {
142 if (layers.empty())
143 return nullptr;
144 return layers.back().get();
145 }
146
150 void SetLearningRate(float lr)
151 {
152 for (auto &layer : layers)
153 layer->SetLearningRate(lr);
154 }
155
158 void SetInferenceRate(float ir)
159 {
160 for (auto &layer : layers)
161 layer->SetLearningRate(ir);
162 }
163
166 void SetPrecisionRate(float pr)
167 {
168 for (auto &layer : layers)
169 layer->SetPrecisionRate(pr);
170 }
171
174 void SetLambda(float l)
175 {
176 for (auto &layer : layers)
177 layer->SetLambda(l);
178 }
179
182 void SetOptimizer(OptimizerType opt) noexcept
183 {
184 for (auto &layer : layers)
185 layer->SetOptimizer(opt);
186 }
187
193 float TrainStep(const std::vector<float> &x, const std::vector<float> &y, int inferenceSteps);
194
199 std::vector<float> Predict(const std::vector<float> &x, int inferenceSteps);
200
204 bool Save(const std::string &filename) const noexcept;
208 bool Load(const std::string &filename) noexcept;
209
211 void Compile();
212
213 private:
214 std::unique_ptr<MemoryArena> arena;
215 friend class PCNDiagnostics;
216 };
217}
Defines the single-layer implementation of a PC model.
A 64-byte-aligned bump-pointer allocator over a single heap-allocated block, used to pack every layer...
Defines useful optimization functions of a PC model.
Definition DiscriminativePCLayer.h:50
DiscriminativePCLayer * GetTerminalLayer() const
Returns the network's terminal (final) layer.
Definition DiscriminativePCNetwork.h:140
void SetLearningRate(float lr)
Sets the learning rate used for weight updates, on every layer.
Definition DiscriminativePCNetwork.h:150
std::vector< float > PredictWithProjection(const std::vector< float > &x, int inferenceSteps)
Same as Predict(), but with ProjectForward() called once after clamping the input,...
Definition DiscriminativePCNetwork.cpp:140
void Compile()
Loads all layers into one contiguous block of memory.
Definition DiscriminativePCNetwork.cpp:215
friend class PCNDiagnostics
Definition DiscriminativePCNetwork.h:215
DiscriminativePCNetwork()
Default constructor.
Definition DiscriminativePCNetwork.h:46
void SetPrecisionRate(float pr)
Sets the learning rate used for precision updates, on every layer.
Definition DiscriminativePCNetwork.h:166
bool Save(const std::string &filename) const noexcept
Saves the network's learned parameters to disk.
Definition DiscriminativePCNetwork.cpp:228
std::vector< float > Predict(const std::vector< float > &x, int inferenceSteps)
Runs a forward prediction pass (clamp, settle, read).
Definition DiscriminativePCNetwork.cpp:188
void ResetState() noexcept
Resets each layer's state without touching learned weights.
Definition DiscriminativePCNetwork.cpp:69
const auto & GetLayers() const noexcept
Returns every layer in the network, in the order they were added.
Definition DiscriminativePCNetwork.h:131
void AddLayer(int size, int nextSize, float lr, float ir, float pr, float lmbda, void(*act)(float *, size_t), void(*dAct)(float *, size_t, bool))
Adds a layer to the network.
Definition DiscriminativePCNetwork.cpp:22
DiscriminativePCNetwork & operator=(DiscriminativePCNetwork &&other) noexcept=default
Move assignment operator.
bool Load(const std::string &filename) noexcept
Loads the network's learned parameters from disk.
Definition DiscriminativePCNetwork.cpp:233
void ProjectForward() noexcept
Seeds every hidden layer's belief from a genuine forward pass through current weights,...
Definition DiscriminativePCNetwork.cpp:106
DiscriminativePCNetwork(int batchSize)
Batched constructor.
Definition DiscriminativePCNetwork.h:51
void UpdateWeights()
Updates each layer's weights.
Definition DiscriminativePCNetwork.cpp:94
void Clamp(const std::vector< float > &input)
Clamps the input to the first layer, necessary for prediction.
Definition DiscriminativePCNetwork.cpp:75
void UpdatePrecision()
Updates each layer's precision weighting.
Definition DiscriminativePCNetwork.cpp:100
void UpdateState()
Updates each layer's state.
Definition DiscriminativePCNetwork.cpp:88
int GetBatchSize() const noexcept
Returns the batch size for the network's layers.
Definition DiscriminativePCNetwork.h:135
float TrainStep(const std::vector< float > &x, const std::vector< float > &y, int inferenceSteps)
Runs a complete training step (clamp, settle, update, unclamp).
Definition DiscriminativePCNetwork.cpp:160
void SetLambda(float l)
Sets the weight-decay (L2 regularization) coefficient, on every layer.
Definition DiscriminativePCNetwork.h:174
DiscriminativePCNetwork(DiscriminativePCNetwork &&other) noexcept=default
Move constructor.
void RandomizeWeights(std::mt19937 &rng)
Randomizes the weights of each layer.
Definition DiscriminativePCNetwork.cpp:63
float CalculateState()
Calculates the state of each layer.
Definition DiscriminativePCNetwork.cpp:80
void SetInferenceRate(float ir)
Sets the inference rate used for state updates, on every layer.
Definition DiscriminativePCNetwork.h:158
float TrainStepWithProjection(const std::vector< float > &x, const std::vector< float > &y, int inferenceSteps)
Same as TrainStep(), but with ProjectForward() called once after clamping the input,...
Definition DiscriminativePCNetwork.cpp:118
~DiscriminativePCNetwork()=default
Default constructor; deletes each layer.
void SetOptimizer(OptimizerType opt) noexcept
Sets the optimizer used for weight updates, on every layer.
Definition DiscriminativePCNetwork.h:182
This file exists to provide both Tensor.h and IComputeBackend.h with device types without introducing...
Definition Backend.cpp:10
ActivationType
Identifies an activation function or its derivative, for dispatch tables and layer/backend APIs that ...
Definition ActivationType.h:25
OptimizerType
Selects which weight-update rule a layer applies during UpdateWeights().
Definition AdamOptimizer.h:52