假设我需要消除图像缺陷(实际上这项任务更棘手)。 我希望经过训练的神经网络能够对缺陷区域进行插值。
出于这些原因,我尝试创建简单的神经网络。 它有输入:有缺陷的灰度图像(7254)和没有缺陷的相同图像。 隐藏层有 272*54 个神经元。
主要代码
cv::Ptr<cv::ml::ANN_MLP> ann = cv::ml::ANN_MLP::create();
int inputsCount = imageSizes.width * imageSizes.height;
std::vector<int> layerSizes = { inputsCount, inputsCount * 2, inputsCount};
ann->setLayerSizes(layerSizes);
ann->setActivationFunction(cv::ml::ANN_MLP::SIGMOID_SYM);
cv::TermCriteria tc(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS, 50, 0.1);
ann->setTermCriteria(tc);
ann->setTrainMethod(cv::ml::ANN_MLP::BACKPROP, 0.0001);
std::cout << "Result : " << ann->train(trainData, cv::ml::ROW_SAMPLE, resData) << std::endl;
ann->predict(trainData, predicted);
在 10 个项目数据集上进行训练,NN 在这个(相同)输入上给出了不好的结果。我尝试了不同的参数
但是仅对 2 个图像进行训练,NN 就可以得到接近的输出(在训练数据上)。
我认为这并不是不恰当的方法,解决方案也不是那么容易。
也许有人对参数或神经网络架构或整个方法有一些建议?
似乎终止标准仅适用于两个样本,但在使用大量样本进行训练时就不够好。请尝试调整它们以及学习率。 从已正确恢复的像素的质量来看,网络架构似乎适合这项任务。一旦网络在 10 个样本上运行良好,我强烈建议添加更多训练样本。
主要问题是给定网络的数据很少。
您的神经网络已完全连接。像素 0,0 的权重与像素 1,0 的权重完全分开,并且像素 0,1 也具有不同的权重。你有很多权重,有很多节点。因此,虽然 10 张图像中有足够的像素,但对于所有权重来说,像素还远远不够。
卷积神经网络的权重要少得多,因为它的许多权重被重复使用。这意味着在训练中,这些权重是通过每个训练图像的多个像素来训练的。 我并不希望它只用 10 张图像就可以很好地工作。人类的期望源自多年的人类视觉,实际上是数十亿张图像。