Java 确定该遗传算法的基因型;遗传算法初始化神经网络实现快速高效学习
我正在做一个学校项目,我想把遗传算法应用到神经网络中。特别是为给定的问题构建一个好的神经网络。我注意到,为神经网络选择正确的参数有一些挑战,这样它就可以快速有效地对一些数据进行训练,基本上可以归结为猜测游戏。我想以遗传算法的方式构建多个神经网络,以找到对给定数据集进行分类的最佳初始设置 我正在考虑使用Java,特别是扩展多层感知器实现。在库中,路径Java 确定该遗传算法的基因型;遗传算法初始化神经网络实现快速高效学习,java,algorithm,neural-network,Java,Algorithm,Neural Network,我正在做一个学校项目,我想把遗传算法应用到神经网络中。特别是为给定的问题构建一个好的神经网络。我注意到,为神经网络选择正确的参数有一些挑战,这样它就可以快速有效地对一些数据进行训练,基本上可以归结为猜测游戏。我想以遗传算法的方式构建多个神经网络,以找到对给定数据集进行分类的最佳初始设置 我正在考虑使用Java,特别是扩展多层感知器实现。在库中,路径org.neuroph.nnet下有文件MultilayerPerceptron.java,它有方法createNetwork。下面是该方法的实现 p
org.neuroph.nnet
下有文件MultilayerPerceptron.java
,它有方法createNetwork
。下面是该方法的实现
private void createNetwork(List<Integer> neuronsInLayers, NeuronProperties neuronProperties) {
// set network type
this.setNetworkType(NeuralNetworkType.MULTI_LAYER_PERCEPTRON);
// create input layer
NeuronProperties inputNeuronProperties = new NeuronProperties(InputNeuron.class, Linear.class);
Layer layer = LayerFactory.createLayer(neuronsInLayers.get(0), inputNeuronProperties);
boolean useBias = true; // use bias neurons by default
if (neuronProperties.hasProperty("useBias")) {
useBias = (Boolean)neuronProperties.getProperty("useBias");
}
if (useBias) {
layer.addNeuron(new BiasNeuron());
}
this.addLayer(layer);
// create layers
Layer prevLayer = layer;
//for(Integer neuronsNum : neuronsInLayers)
for(int layerIdx = 1; layerIdx < neuronsInLayers.size(); layerIdx++){
Integer neuronsNum = neuronsInLayers.get(layerIdx);
// createLayer layer
layer = LayerFactory.createLayer(neuronsNum, neuronProperties);
if ( useBias && (layerIdx< (neuronsInLayers.size()-1)) ) {
layer.addNeuron(new BiasNeuron());
}
// add created layer to network
this.addLayer(layer);
// createLayer full connectivity between previous and this layer
if (prevLayer != null) {
ConnectionFactory.fullConnect(prevLayer, layer);
}
prevLayer = layer;
}
// set input and output cells for network
NeuralNetworkFactory.setDefaultIO(this);
// set learnng rule
//this.setLearningRule(new BackPropagation(this));
this.setLearningRule(new MomentumBackpropagation());
// this.setLearningRule(new DynamicBackPropagation());
this.randomizeWeights(new NguyenWidrowRandomizer(-0.7, 0.7));
}
private void createNetwork(列出神经元层、神经元属性){
//设置网络类型
此.setNetworkType(NeuralNetworkType.MULTI_LAYER_PERCEPTRON);
//创建输入层
NeuronProperties inputNeuronProperties=新的NeuronProperties(InputNeuron.class,Linear.class);
Layer Layer=LayerFactory.createLayer(neuronsLayers.get(0),inputNeuronProperties);
布尔useBias=true;//默认情况下使用偏差神经元
if(neuronProperties.hasProperty(“useBias”)){
useBias=(布尔)neuronProperties.getProperty(“useBias”);
}
如果(使用偏差){
添加神经元(新BiasNeuron());
}
这个.addLayer(层);
//创建层
层=层;
//用于(整数neuronsUM:neuronsLayers)
对于(int layerIdx=1;layerIdx
因此,我看到了许多可以在网络建设中调整的因素。我正在尝试确定我的算法的基因型
所以我看到我可以调整的因素首先是隐藏层的数量和隐藏层神经元的数量;输入和输出层的大小由问题决定。网络中神经元的神经元属性(具体来说,不同的神经元是否具有不同的激活功能?)。可能是神经元之间的联系;是否所有的神经元都必须连接到上面和下面的层中的所有其他神经元,一些神经元可以跳过一层吗?使用的学习规则的学习率,可能对不同的神经元使用不同的学习规则(很确定这是一个愚蠢的问题)
那么总的来说,神经网络的哪些因素可以在初始设置时进行调整,从而影响网络学习的速度和效率?我想非常具体地说,神经网络中的所有神经元在运行中都必须是相同的吗
编辑:通过一些搜索,我发现我猜这类网络的名称是a。被称为主要思想。实现这些思想的算法是。我正在更多地查看这些页面和论文的链接,试图回答我上面的主要问题。但这个问题仍然悬而未决 有一百万种不同的东西可以用神经网络来调整。它们不是一个严格的算法。你提到的所有事情都是正确的。你可以调整层的数量和大小,你可以混合和匹配激活功能,你可以跳过层连接,并调整学习速度 这些东西被称为“超参数”,以区别于常规参数,即神经网络的权重和连接。他们通过大量的实验来确定什么最有效 然而,它很容易意外地过度适合。要得到一个在训练或验证数据上效果很好,但在新数据上效果根本不好的神经网络。使用交叉验证之类的方法将数据分成不同的部分,并在每个不同的部分上进行测试 主要参数是层的数量和大小,以及正则化参数(例如权重衰减或抖动)