我想建立一个连接4引擎,它使用人工神经网络工作-仅仅是因为我着迷于ANNs。
我要创建以下的人工神经网络结构草案。能行吗?这些连接(甚至是交叉连接)正确吗?

你能帮我起草这个ANN的UML类图吗?
我想把董事会的代表交给人工神经网络作为输入。输出应该是选择的一步。
以后应该使用强化学习进行学习,并应用sigmoid函数。引擎将对抗人类玩家。然后根据比赛的结果,调整权重。
我在找什么.
..。主要是编码问题。它越是从抽象思维转向编码,它就越好。
发布于 2011-01-09 06:58:46
下面是我在处理神经网络时是如何组织我的设计和代码的。这里的代码(显然)是psuedocode,大致遵循面向对象的约定。
从下到上,你会有你的神经元。每个神经元都需要能够保持它在传入连接上的权重,保存传入连接数据的缓冲区,以及其输出边缘的列表。每个神经元需要能够做三件事:
从代码的角度来看,这意味着:
// Each neuron needs to keep track of this data
float in_data[]; // Values sent to this neuron
float weights[]; // The weights on each edge
float value; // The value this neuron will be sending out
Neuron out_edges[]; // Each Neuron that this neuron should send data to
// Each neuron should expose this functionality
void accept_data( float data ) {
in_data.append(data); // Add the data to the incoming data buffer
}
void process() {
value = /* result of combining weights and incoming data here */;
}
void send_value() {
foreach ( neuron in out_edges ) {
neuron.accept_data( value );
}
}接下来,我发现最简单的方法是创建一个包含神经元列表的层类。(很有可能跳过这个类,只需让NeuralNetwork保存一个神经元列表。我发现拥有一个层类在组织上和调试上都更容易。)每一层都应公开以下功能:
从代码的角度来看,这意味着:
//Each layer needs to keep track of this data.
Neuron[] neurons;
//Each layer should expose this functionality.
void fire() {
foreach ( neuron in neurons ) {
float value = neuron.process();
neuron.send_value( value );
}
}
Neuron[] get_neurons() {
return neurons;
}最后,您有一个包含层列表的NeuralNetwork类、一种用初始数据设置第一层的方法、一种学习算法和一种运行整个神经网络的方法。在我的实现中,我通过添加第四层来收集最终的输出数据,该层由一个假神经元组成,该神经元只需缓冲所有传入数据并返回该数据。
// Each neural network needs to keep track of this data.
Layer[] layers;
// Each neural network should expose this functionality
void initialize( float[] input_data ) {
foreach ( neuron in layers[0].get_neurons() ) {
// do setup work here
}
}
void learn() {
foreach ( layer in layers ) {
foreach ( neuron in layer ) {
/* compare the neuron's computer value to the value it
* should have generated and adjust the weights accordingly
*/
}
}
}
void run() {
foreach (layer in layers) {
layer.fire();
}
}我建议从反向传播开始,因为它被认为是最容易实现的学习算法。当我做这件事时,我很难找到一个非常简单的算法解释,但是我的笔记列出了本站作为一个很好的参考。
我希望这足以让你开始!
发布于 2010-12-30 21:50:13
实现神经网络有许多不同的方法,从简单/容易理解到高度优化。您链接到的维基百科关于反向传播的文章有指向C++、C#、Java等实现的链接,如果您有兴趣了解其他人是如何做到这一点的,它们可以作为很好的参考。
一个简单的体系结构将节点和连接建模为单独的实体;节点将有可能进入和输出到其他节点的连接以及激活级别和错误值,而连接将具有权重值。
或者,有更有效的方法来表示这些节点和连接--例如,作为由层组织的浮点值数组。这使得代码变得更加棘手,但避免了创建那么多对象和对象指针。
一个注意事项:人们通常会包括偏置节点 --除了正常的输入节点--为每个隐藏和输出节点提供恒定的值。
发布于 2011-01-02 19:20:38
我以前实现过神经网络,并且看到了您建议的体系结构中的一些问题:
最后一个建议是使用双极输入(-1表示假,+1表示真),因为这可以加快学习速度。Nate提出了一个很好的观点:每个隐藏和输出节点都将受益于一个偏置连接(将它想象为另一个具有固定值“1”的输入节点)。
https://stackoverflow.com/questions/4534539
复制相似问题