在 Encog 中构建巨大的神经网络时出现 OverflowException 或 OutOfMemoryException
OverflowException or OutOfMemoryException when constructing a huge neural network in Encog
我正在尝试在 C# 的 Encog 中构建一个用于 RGB 图像识别的简单前馈神经网络。例如,如果我 运行 以下代码:
BasicNetwork network = new BasicNetwork();
network.AddLayer(new BasicLayer(null, true, 60000));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 60000));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), false, 4));
network.Structure.FinalizeStructure();
我从 encog-core-cs.dll 得到一个 System.OverflowException,如果我将两个地方的神经元计数加倍到 120 000,我得到System.OutOfMemoryException。对于 Encog 来说,这是一个太大的网络,还是我做错了什么?但是如果这太大了,我怎么能用一个合理大小的图像来训练,比如 200×200?我是不是注定要拍小图了?
是的,您可以在更好的机器上进行计算,但您也做错了。不要将每个像素都用作输入,从而产生这种庞大的架构。对完整原始数据进行操作的方法通常采用非常小的缩小图像(有些图像类型无法在保留所有信息的同时缩小到 10x10)。
相反,做一些预处理,例如隔离图片的重要部分,消除噪声,更重要的是:提取特征,将其提供给神经网络而不是原始数据。不要问我要使用什么功能,因为这取决于您的问题。图像识别有数百种可能性。当神经网络对适当的特征进行操作时,您会发现不仅层数会变小,而且准确度会提高,因为网络永远不会看到不相关的数据,而是从头开始对一些元数据进行操作。
我正在尝试在 C# 的 Encog 中构建一个用于 RGB 图像识别的简单前馈神经网络。例如,如果我 运行 以下代码:
BasicNetwork network = new BasicNetwork();
network.AddLayer(new BasicLayer(null, true, 60000));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), true, 60000));
network.AddLayer(new BasicLayer(new ActivationSigmoid(), false, 4));
network.Structure.FinalizeStructure();
我从 encog-core-cs.dll 得到一个 System.OverflowException,如果我将两个地方的神经元计数加倍到 120 000,我得到System.OutOfMemoryException。对于 Encog 来说,这是一个太大的网络,还是我做错了什么?但是如果这太大了,我怎么能用一个合理大小的图像来训练,比如 200×200?我是不是注定要拍小图了?
是的,您可以在更好的机器上进行计算,但您也做错了。不要将每个像素都用作输入,从而产生这种庞大的架构。对完整原始数据进行操作的方法通常采用非常小的缩小图像(有些图像类型无法在保留所有信息的同时缩小到 10x10)。
相反,做一些预处理,例如隔离图片的重要部分,消除噪声,更重要的是:提取特征,将其提供给神经网络而不是原始数据。不要问我要使用什么功能,因为这取决于您的问题。图像识别有数百种可能性。当神经网络对适当的特征进行操作时,您会发现不仅层数会变小,而且准确度会提高,因为网络永远不会看到不相关的数据,而是从头开始对一些元数据进行操作。