首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >4与神经网络连接:草案评估+进一步步骤

4与神经网络连接:草案评估+进一步步骤
EN

Stack Overflow用户
提问于 2010-12-26 16:23:11
回答 4查看 3.9K关注 0票数 7

我想建立一个连接4引擎,它使用人工神经网络工作-仅仅是因为我着迷于ANNs。

我要创建以下的人工神经网络结构草案。能行吗?这些连接(甚至是交叉连接)正确吗?

你能帮我起草这个ANN的UML类图吗?

我想把董事会的代表交给人工神经网络作为输入。输出应该是选择的一步。

以后应该使用强化学习进行学习,并应用sigmoid函数。引擎将对抗人类玩家。然后根据比赛的结果,调整权重。

我在找什么.

..。主要是编码问题。它越是从抽象思维转向编码,它就越好。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-09 06:58:46

下面是我在处理神经网络时是如何组织我的设计和代码的。这里的代码(显然)是psuedocode,大致遵循面向对象的约定。

从下到上,你会有你的神经元。每个神经元都需要能够保持它在传入连接上的权重,保存传入连接数据的缓冲区,以及其输出边缘的列表。每个神经元需要能够做三件事:

  • 接收来自传入边缘的数据的一种方法
  • 一种处理输入数据和权重的方法,用于表示该神经元将要发送的值。
  • 一种将神经元的值发送到输出边缘的方法

从代码的角度来看,这意味着:

代码语言:javascript
复制
// 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保存一个神经元列表。我发现拥有一个层类在组织上和调试上都更容易。)每一层都应公开以下功能:

  • 使每个神经元“着火”
  • 返回这个层环绕的原始神经元阵列。(当您需要在神经网络的第一层中手动填写输入数据时,这是非常有用的。)

从代码的角度来看,这意味着:

代码语言:javascript
复制
//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类、一种用初始数据设置第一层的方法、一种学习算法和一种运行整个神经网络的方法。在我的实现中,我通过添加第四层来收集最终的输出数据,该层由一个假神经元组成,该神经元只需缓冲所有传入数据并返回该数据。

代码语言:javascript
复制
// 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();
    }
}

我建议从反向传播开始,因为它被认为是最容易实现的学习算法。当我做这件事时,我很难找到一个非常简单的算法解释,但是我的笔记列出了本站作为一个很好的参考。

我希望这足以让你开始!

票数 3
EN

Stack Overflow用户

发布于 2010-12-30 21:50:13

实现神经网络有许多不同的方法,从简单/容易理解到高度优化。您链接到的维基百科关于反向传播的文章有指向C++C#Java等实现的链接,如果您有兴趣了解其他人是如何做到这一点的,它们可以作为很好的参考。

一个简单的体系结构将节点和连接建模为单独的实体;节点将有可能进入和输出到其他节点的连接以及激活级别和错误值,而连接将具有权重值。

或者,有更有效的方法来表示这些节点和连接--例如,作为由层组织的浮点值数组。这使得代码变得更加棘手,但避免了创建那么多对象和对象指针。

一个注意事项:人们通常会包括偏置节点 --除了正常的输入节点--为每个隐藏和输出节点提供恒定的值。

票数 3
EN

Stack Overflow用户

发布于 2011-01-02 19:20:38

我以前实现过神经网络,并且看到了您建议的体系结构中的一些问题:

  1. 一个典型的多层网络具有从每个输入节点到每个隐藏节点,从每个隐藏节点到每个输出节点的连接。这允许将来自所有输入的信息组合在一起,并对每个输出做出贡献。如果您将4个隐藏节点用于每个输入,那么您将失去一些网络识别输入和输出之间关系的能力。
  2. 你将如何提出价值观来训练网络?您的网络创建了董事会职位和最佳下一步的映射,因此您需要一组提供此功能的培训示例。游戏结束的动作很容易识别,但是你怎么知道游戏中的移动是“最优的”呢?(强化学习可以在这里有所帮助)

最后一个建议是使用双极输入(-1表示假,+1表示真),因为这可以加快学习速度。Nate提出了一个很好的观点:每个隐藏和输出节点都将受益于一个偏置连接(将它想象为另一个具有固定值“1”的输入节点)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4534539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档