背景::::: 我正在使用一个大规模(二维)阵列的自定义神经元类型的神经网络似乎运作良好。使用较小的Neuron阵列大小时,例如 Neuron [,] NodeList = new Neuron [800,600]; 它将序列化很好。
然而,它在某些对象树展平循环(根据我的历史中的一些论坛)卡在这里并且耗尽内存 神经元[,] NodeList =新神经元[10000,9000] 在对Google进行一些研究之后,我发现我将不得不使用另一个序列化程序或实现我自己的保存数据的方式。 我选择了一个简单的数据编写器,因为它会更容易
问题(如果你愿意,请跳过这里:p)::: 对于我的自定义数据编写器,我正在编写文件所需的所有数据。 在我的Neuron类型中,它存储对另一个Neuron的引用。 存储的所有神经元都在提到的NodeList数组中(包括链接的)
class Neuron
{
//Some Old Neuron Info
float IThreshold = 1;
float IFiringValue = 1;
//Link
float IWeight = 1;
Neuron NextNeuron; //This Line HERE
...
}
对于我的数据编写器,我将遍历数组中的每个神经元并存储其信息...如阵列中的位置,加权等 我还想存储其链接神经元在数组中的位置
我想做点什么
int NewX = NodeList[x,y].NextNeuron.ParentArrayIndex(0);
int NewX = NodeList[x,y].NextNeuron.ParentArrayIndex(1);
0&图1仅表示阵列尺寸 是否有可能或者有不同的方法来获取它而不进行搜索并检查它们是否相等?
任何帮助表示感谢,...并且谢谢你:)
答案 0 :(得分:2)
您需要为节点引入某种持久性标识符,例如:
struct NeuronId
{
ushort Idx0 { get; }
ushort Idx1 { get; }
}
您还需要在Neuron
课程中记住这一点。完成此操作后,您可以使用以下实用程序:
NeuronTable.GetNeuron(NeuronId id);
NeuronTable.SetNeuron(Neuron neuron, NeuronId id);
保留反向引用字典Dictionary<Neuron, NeuronId>
的选项在您的情况下不太可能起作用,因为c# dictionary内部存储其密钥&amp; Entry
结构的单个动态1-d数组中的值 - 这可能会增长到内存不足或超过Int32.MaxInt
个条目!
(我怀疑,当您使用旧的序列化程序序列化数据时,它实际上克隆了NextNeuron
个节点.Microsoft的XML序列化程序不会自动将交叉引用转换为持久的间接句柄。)
完成后,由于您自己定义文件格式而不是使用标准XML编写器,因此您可以将数据写入两个文档部分:
Neuron数据库。这序列化了2d神经元阵列,包括除NextNeuron连接之外的所有数据。
交叉引用数据库。这会将所有神经元交叉引用序列化为KeyValuePair<NeuronId, NeuronId>
列表,您可以通过索引神经元表来流出。
然后关于反序列化:
将节点读入巨大的表格。
在对列表中输入流并设置交叉引用。
顺便问一下,你的阵列稀疏吗?如果是这样,您可以考虑使用某种稀疏矩阵表示。
此外,如果只有极小的神经元具有非空的NextNeuron,您可以避免将NeuronId存储在每个神经元内部,而是建立一个Dictionary<Neuron, NeuronId>
仅交叉引用的神经元来使用写入。