commit 131f4d117056a32c8c6ad5c898361262a119cee0
parent 423dfd2a492422c04063567b0f5f0164432ed475
Author: David Freifeld <freifeld.david@gmail.com>
Date: Sun, 29 Nov 2020 09:36:05 -0800
Fixed basic convolutional backprop
Diffstat:
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/cnn.cpp b/src/cnn.cpp
@@ -275,7 +275,6 @@ void ConvNet::backpropagate()
std::cout << conv_layers[layer].input->cols() << " " << gradients.back().cols() << "\n";
for (int i = 0; i < conv_layers[layer].input->rows() - gradients.back().rows() + 1; i++) {
for (int j = 0; j < conv_layers[layer].input->cols() - gradients.back().cols() + 1; j++) {
- std::cout << i << " " << j << "\n";
conv_deltas[conv_deltas.size()-1](i, j) = (gradients.back() * conv_layers[layer].input->block(i, j, gradients.back().rows(), gradients.back().cols())).sum();
}
}
@@ -284,9 +283,10 @@ void ConvNet::backpropagate()
Eigen::MatrixXf flipped_kernel =
Eigen::MatrixXf::Zero(conv_layers[layer].kernel->rows(), conv_layers[layer].kernel->cols());
flipped_kernel = conv_layers[layer].kernel->transpose().colwise().reverse().transpose().colwise().reverse();
- Eigen::MatrixXf padded_grad = Eigen::MatrixXf::Zero(gradients.back().rows() + 2, gradients.back().cols() + 2);
- padded_grad.block(1, 1, gradients.back().rows(), gradients.back().cols()) = gradients.back();
+ Eigen::MatrixXf padded_grad = Eigen::MatrixXf::Zero(gradients.back().rows() + ((flipped_kernel.rows() - 1)*2), gradients.back().cols() + ((flipped_kernel.cols() - 1)*2));
+ padded_grad.block(flipped_kernel.rows() - 1, flipped_kernel.cols() - 1, gradients.back().rows(), gradients.back().cols()) = gradients.back();
Eigen::MatrixXf final_grad (padded_grad.rows() - flipped_kernel.rows() + 1, padded_grad.cols() - flipped_kernel.cols() + 1);
+ std::cout << padded_grad.rows() << " " << flipped_kernel.rows() << "\n";
for (int i = 0; i < padded_grad.rows() - flipped_kernel.rows() + 1; i++) {
for (int j = 0; j < padded_grad.cols() - gradients.back().cols() + 1; j++) {
final_grad(i, j) = (flipped_kernel * padded_grad.block(i, j, flipped_kernel.rows(), flipped_kernel.cols())).sum();
@@ -294,7 +294,6 @@ void ConvNet::backpropagate()
}
gradients.push_back(final_grad);
}
- assert(2<1);
}
void ConvNet::train()