Working on a model that recognizes handwritten digits from the MNIST dataset. Did my code in visual studio. After training the data i get Nan and inf in the output layer everytime.
std::string fileNameImages = fileLocation;
std::string fileNameLabels = fileLocation;
std::vector<std::vector<unsigned char>> images = readImages(fileNameImages);
std::vector<std::vector<unsigned char>> labels = readLabels(fileNameLabels);
std::vector<cv::Mat> imagesData;
std::vector<int> labelsData;
for (auto i = 0u; i < 2; ++i)
{
cv::Mat m(28, 28, CV_8UC1, cv::Scalar(0));
for (int row = 0; row < m.rows; ++row)
for (int col = 0; col < m.cols; ++col)
m.at<uchar>(row, col) = images[i][row * m.cols + col];
imagesData.push_back(std::move(m));
labelsData.push_back(labels[i].front());
}
cv::Ptr<cv::ml::ANN_MLP> mlp = cv::ml::ANN_MLP::create();
mlp->setActivationFunction(cv::ml::ANN_MLP::SIGMOID_SYM, 1, 1);
int inputLayerSize = imagesData[0].total();
if (inputLayerSize > std::numeric_limits<int>::max()) {
throw std::overflow_error("inputLayerSize exceeds the maximum value for int");
}
int hiddenLayerSize = 100;
int outputLayerSize = 10;
cv::Mat layers = (cv::Mat_<int>(3, 1)<<inputLayerSize, hiddenLayerSize, outputLayerSize);
mlp->setLayerSizes(layers);
int numSamples = imagesData.size();
cv::Mat trainingData(numSamples, inputLayerSize, CV_32F);
cv::Mat labelData(numSamples, outputLayerSize, CV_32F);
for (int i = 0; i < numSamples; i++) {
cv::Mat image = imagesData[i].reshape(1, 1);
image.convertTo(trainingData.row(i), CV_32F);
cv::Mat label = cv::Mat::zeros(1, outputLayerSize, CV_32F);
label.at<float>(0, labelsData[i]) = 1.0;
label.copyTo(labelData.row(i));
}
mlp->setTrainMethod(cv::ml::ANN_MLP::BACKPROP, 0.01, 0.1);
cv::TermCriteria termCrit(cv::TermCriteria::MAX_ITER+cv::TermCriteria::EPS, 10, 0.01);
mlp->setTermCriteria(termCrit);
mlp->train(trainingData, cv::ml::ROW_SAMPLE, labelData);
Anybody has any ideas why this is happening?