commit e8a15ac4dd5aff2b7f7f629ba2e613edc0413979
parent 1b2ae40382763a7096bf2a19041bb4ed20ec8d75
Author: David Freifeld <freifeld.david@gmail.com>
Date: Fri, 3 Jul 2020 13:15:07 -0700
Slight fixes + more in list_net()
Diffstat:
3 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/bpnn.cpp b/bpnn.cpp
@@ -58,6 +58,7 @@ void Network::add_layer(int nodes, char* name)
{
length++;
layers.emplace_back(batch_size, nodes);
+ strcpy(layers[length-1].activation_str, name);
if (strcmp(name, "sigmoid") == 0) {
layers[length-1].activation = sigmoid;
layers[length-1].activation_deriv = sigmoid_deriv;
diff --git a/bpnn.hpp b/bpnn.hpp
@@ -23,6 +23,7 @@ public:
std::vector<Eigen::MatrixXd> prev_updates;
std::function<double(double)> activation;
std::function<double(double)> activation_deriv;
+ char activation_str[1024];
Layer(int rows, int columns);
Layer(float* vals, int rows, int columns);
@@ -47,6 +48,7 @@ public:
float bias_lr;
int batch_size;
int batches;
+
Eigen::MatrixXd* labels;
Network(char* path, int batch_sz, float learn_rate, float bias_rate, float ratio);
diff --git a/cnn.cpp b/cnn.cpp
@@ -7,16 +7,18 @@ class ConvLayer
{
public:
int stride_len;
+ int padding;
Eigen::MatrixXd* input;
Eigen::MatrixXd* kernel;
Eigen::MatrixXd* output;
- ConvLayer(int x, int y, int stride, int kernel_size);
+ ConvLayer(int x, int y, int stride, int kernel_size, int pad);
void convolute();
};
-ConvLayer::ConvLayer(int x, int y, int stride, int kern_size)
+ConvLayer::ConvLayer(int x, int y, int stride, int kern_size, int pad)
{
+ padding = pad;
stride_len = stride;
kernel = new Eigen::MatrixXd (kern_size, kern_size);
for (int i = 0; i < kern_size*kern_size; i++) {
@@ -30,13 +32,8 @@ ConvLayer::ConvLayer(int x, int y, int stride, int kern_size)
void ConvLayer::convolute()
{
- //std::cout << input->cols() << " " << input->cols() << "\n";
- // std::cout << "Conv input:\n" << *input << "\nkernel:\n" << *kernel << "\n\n";
- // std::cout << *input << "\n\n";
for (int i = 0; i < input->cols() - kernel->cols()+1; i+=stride_len) {
for (int j = 0; j < input->rows() - kernel->rows()+1; j+=stride_len) {
- //std::cout << i << j << stride_len << "\n";
- // std::cout << j << ","<< i << " vs " << input->rows() << "," << input->cols() <<"\n"<< input->block(j, i, kernel->rows(), kernel->cols()) << "\n\n";
(*output)(j, i) = (*kernel * (input->block(j, i, kernel->rows(), kernel->cols()))).sum();
}
}
@@ -46,24 +43,25 @@ class PoolingLayer
{
public:
int stride_len;
+ int padding;
Eigen::MatrixXd* input;
Eigen::MatrixXd* kernel;
Eigen::MatrixXd* output;
void pool();
- PoolingLayer(int x, int y, int stride, int kern_size);
+ PoolingLayer(int x, int y, int stride, int kern_size, int pad);
};
// Will eventually be different from ConvLayer
-PoolingLayer::PoolingLayer(int x, int y, int stride, int kern_size)
+PoolingLayer::PoolingLayer(int x, int y, int stride, int kern_size, int pad)
{
+ padding = pad;
stride_len = stride;
kernel = new Eigen::MatrixXd (kern_size, kern_size);
for (int i = 0; i < kern_size*kern_size; i++) {
(*kernel)((int)i / kern_size,i%kern_size) = (double) rand()/RAND_MAX;
}
output = new Eigen::MatrixXd (x-kern_size+1, y-kern_size+1);
- std::cout << *output;
for (int i = 0; i < (x-kern_size+1)*(y-kern_size+1); i++) {
(*output)((int)i / (y-kern_size+1),i%(y-kern_size+1)) = (double) rand()/RAND_MAX;
}
@@ -89,7 +87,6 @@ void PoolingLayer::pool()
class ConvNet : public Network
{
public:
- int stride_len;
int preprocess_length;
std::vector<ConvLayer> conv_layers;
@@ -100,8 +97,8 @@ public:
void process(); // Runs the convolutional and pooling layers.
void backpropagate();
void next_batch();
- void add_conv_layer(int x, int y, int stride, int kern_size);
- void add_pool_layer(int x, int y, int stride, int kern_size);
+ void add_conv_layer(int x, int y, int stride, int kern_size, int pad);
+ void add_pool_layer(int x, int y, int stride, int kern_size, int pad);
};
ConvNet::ConvNet(char* path, int batch_sz, float learn_rate, float bias_rate, float ratio) : Network(path, batch_sz, learn_rate, bias_rate, ratio)
@@ -109,16 +106,16 @@ ConvNet::ConvNet(char* path, int batch_sz, float learn_rate, float bias_rate, fl
preprocess_length = 0;
}
-void ConvNet::add_conv_layer(int x, int y, int stride, int kern_size)
+void ConvNet::add_conv_layer(int x, int y, int stride, int kern_size, int pad)
{
preprocess_length+=1;
- conv_layers.emplace_back(x,y,stride,kern_size);
+ conv_layers.emplace_back(x,y,stride,kern_size,pad);
}
// May make this inaccessible to user code and just have it called from add_conv_layer as pooling is basically always paired with conv.
-void ConvNet::add_pool_layer(int x, int y, int stride, int kern_size)
+void ConvNet::add_pool_layer(int x, int y, int stride, int kern_size, int pad)
{
- pool_layers.emplace_back(x,y,stride,kern_size);
+ pool_layers.emplace_back(x,y,stride,kern_size,pad);
}
// Needs a batch advancement function, 100% does not work.
@@ -146,14 +143,14 @@ void ConvNet::process()
void ConvNet::list_net()
{
for (int i = 0; i < preprocess_length; i++) {
- std::cout << "-----------------------\nCONVOLUTIONAL LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << conv_layers[i].stride_len << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *conv_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n" << *conv_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *conv_layers[i].output << "\n\n\n";
- std::cout << "-----------------------\nPOOLING LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << pool_layers[i].stride_len << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *pool_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n-" << *pool_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *pool_layers[i].output << "\n\n\n";
+ std::cout << "-----------------------\nCONVOLUTIONAL LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << conv_layers[i].stride_len << "\nPadding: " << conv_layers[i].padding << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *conv_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n" << *conv_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *conv_layers[i].output << "\n\n\n";
+ std::cout << "-----------------------\nPOOLING LAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nStride: " << pool_layers[i].stride_len << "\nPadding: " << conv_layers[i].padding << "\n\n\u001b[31mINPUT:\x1B[0;37m\n" << *pool_layers[i].input << "\n\n\u001b[31mKERNEL:\x1B[0;37m\n-" << *pool_layers[i].kernel << "\n\n\u001b[31mOUTPUT:\x1B[0;37m\n" << *pool_layers[i].output << "\n\n\n";
}
- std::cout << "-----------------------\nINPUT LAYER (LAYER 0)\n-----------------------\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[0].contents << "\n\n\u001b[31mWEIGHTS:\x1B[0;37m\n" << *layers[0].bias << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[0].weights << "\n\n\n";
+ std::cout << "-----------------------\nINPUT LAYER (LAYER 0)\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nActivation Function: " << layers[0].activation_str << "\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[0].contents << "\n\n\u001b[31mWEIGHTS:\x1B[0;37m\n" << *layers[0].weights << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[0].bias << "\n\n\n";
for (int i = 1; i < length-1; i++) {
- std::cout << "-----------------------\nLAYER " << i << "\n-----------------------\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[i].contents << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[i].bias << "\n\n\u001b[31mWEIGHTS:\x1B[0;37m\n" << *layers[i].weights << "\n\n\n";
+ std::cout << "-----------------------\nLAYER " << i << "\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nActivation Function: " << layers[i].activation_str << "\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[i].contents << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[i].bias << "\n\n\u001b[31mWEIGHTS:\x1B[0;37m\n" << *layers[i].weights << "\n\n\n";
}
- std::cout << "-----------------------\nOUTPUT LAYER (LAYER " << length-1 << ")\n-----------------------\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[length-1].contents << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[length-1].bias << "\n\n\n";
+ std::cout << "-----------------------\nOUTPUT LAYER (LAYER " << length-1 << ")\n-----------------------\n\n\u001b[31mGENERAL INFO:\x1B[0;37m\nActivation Function: " << layers[length-1].activation_str <<"\n\n\u001b[31mACTIVATIONS:\x1B[0;37m\n" << *layers[length-1].contents << "\n\n\u001b[31mBIASES:\x1B[0;37m\n" << *layers[length-1].bias << "\n\n\n";
}
void backpropagate()
@@ -165,8 +162,8 @@ void backpropagate()
int main()
{
ConvNet net ("./data_banknote_authentication.txt", 1, 0.05, 0.01, 0.9);
- net.add_conv_layer(8,8,1,4);
- net.add_pool_layer(5,5,1,2);
+ net.add_conv_layer(8,8,1,4,0);
+ net.add_pool_layer(5,5,1,2,0);
net.add_layer(16, "linear");
net.add_layer(5, "relu");
net.add_layer(1, "resig");