- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我应该实现一个具有 2 个输入、2 个隐藏和 1 个输出神经元的人工神经网络 (ANN),它可以解决 XOR 问题。应使用进化算法优化网络的权重。给出了每个神经元的激活函数和每个 ANN 的适应度函数。下图总结了问题,介绍了我用到的变量名:
现在我尽最大努力解决这个问题,但即使使用进化算法使用 1000 个 ANN 和 2000 代的人口规模,我的最佳适应度也永远不会超过 0.75。我的代码包括一个带有神经元、激活和适应度函数的 ANN 类,以及一个包含进化算法并优化 ANN 权重的 Main 类。这是代码:
每个 ANN 都使用介于 -1 和 1 之间的随机权重进行初始化,并且能够变异,即返回一个随机选择的权重不同的变异。
public class ANN implements Comparable<ANN> {
private Random rand = new Random();
public double[] w = new double[6]; //weights: in1->h1, in1->h2, in2->h1, in2->h2, h1->out, h2->out
public ANN() {
for (int i=0; i<6; i++) //randomly initialize weights in [-1,1)
w[i] = rand.nextDouble() * 2 - 1;
}
//calculates the output for input a & b
public double ann(double a, double b) {
double h1 = activationFunc(a*w[0] + b*w[2]);
double h2 = activationFunc(a*w[1] + b*w[3]);
double out = activationFunc(h1*w[4] + h2*w[5]);
return out;
}
private double activationFunc(double x) {
return 2.0 / (1 + Math.exp(-2*x)) - 1;
}
//calculates the fitness (divergence to the right output)
public double fitness() {
double sum = 0;
//test all possible inputs (0,0; 0,1; 1,0; 1,1)
sum += 1 - Math.abs(0 - ann(0, 0));
sum += 1 - Math.abs(1 - ann(0, 1));
sum += 1 - Math.abs(1 - ann(1, 0));
sum += 1 - Math.abs(0 - ann(1, 1));
return sum / 4.0;
}
//randomly change random weight and return the mutated ANN
public ANN mutate() {
//copy weights
ANN mutation = new ANN();
for (int i=0; i<6; i++)
mutation.w[i] = w[i];
//randomly change one
int weight = rand.nextInt(6);
mutation.w[weight] = rand.nextDouble() * 2 - 1;
return mutation;
}
@Override
public int compareTo(ANN arg) {
if (this.fitness() < arg.fitness())
return -1;
if (this.fitness() == arg.fitness())
return 0;
return 1; //this.fitness > arg.fitness
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
ANN ann = (ANN)obj;
for (int i=0; i<w.length; i++) { //not equal if any weight is different
if (w[i] != ann.w[i])
return false;
}
return true;
}
}
Main 类具有进化算法,并使用精英主义和基于排名的选择来创建每个种群的下一代,即复制 100 个最佳 ANN,其余 900 个是先前成功 ANN 的突变。
//rank-based selection + elitism
public class Main {
static Random rand = new Random();
static int size = 1000; //population size
static int elitists = 100; //number of elitists
public static void main(String[] args) {
int generation = 0;
ArrayList<ANN> population = initPopulation();
print(population, generation);
//stop after good fitness is reached or after 2000 generations
while(bestFitness(population) < 0.8 && generation < 2000) {
generation++;
population = nextGeneration(population);
print(population, generation);
}
}
public static ArrayList<ANN> initPopulation() {
ArrayList<ANN> population = new ArrayList<ANN>();
for (int i=0; i<size; i++) {
ANN ann = new ANN();
if (!population.contains(ann)) //no duplicates
population.add(ann);
}
return population;
}
public static ArrayList<ANN> nextGeneration(ArrayList<ANN> current) {
ArrayList<ANN> next = new ArrayList<ANN>();
Collections.sort(current, Collections.reverseOrder()); //sort according to fitness (0=best, 999=worst)
//copy elitists
for (int i=0; i<elitists; i++) {
next.add(current.get(i));
}
//rank-based roulette wheel
while (next.size() < size) { //keep same population size
double total = 0;
for (int i=0; i<size; i++)
total += 1.0 / (i + 1.0); //fitness = 1/(rank+1)
double r = rand.nextDouble() * total;
double cap = 0;
for (int i=0; i<size; i++) {
cap += 1.0 / (i + 1.0); //higher rank => higher probability
if (r < cap) { //select for mutation
ANN mutation = current.get(i).mutate(); //no duplicates
if (!next.contains(mutation))
next.add(mutation);
break;
}
}
}
return next;
}
//returns best ANN in the specified population
public static ANN best(ArrayList<ANN> population) {
Collections.sort(population, Collections.reverseOrder());
return population.get(0);
}
//returns the best fitness of the specified population
public static double bestFitness(ArrayList<ANN> population) {
return best(population).fitness();
}
//returns the average fitness of the specified population
public static double averageFitness(ArrayList<ANN> population) {
double totalFitness = 0;
for (int i=0; i<size; i++)
totalFitness += population.get(i).fitness();
double average = totalFitness / size;
return average;
}
//print population best and average fitness
public static void print(ArrayList<ANN> population, int generation) {
System.out.println("Generation: " + generation + "\nBest: " + bestFitness(population) + ", average: " + averageFitness(population));
System.out.print("Best weights: ");
ANN best = best(population);
for (int i=0; i<best.w.length; i++)
System.out.print(best.w[i] + " ");
System.out.println();
System.out.println();
}
}
尽管如此,我对此进行了相当多的思考并使用了我学到的技术,但结果并不令人满意。由于某种原因,每个权重的最佳权重似乎都漂移到 -1。这有什么意义?权重的范围 -1 到 1 是一个不错的选择吗?除了突变之外,我还应该引入交叉吗?我知道这是一个非常具体的问题,但我非常感谢您的帮助!
最佳答案
网络结构不对。如果没有针对每个节点的偏差或阈值,该网络无法解决 XOR 问题。
一个隐藏节点应该编码 OR 而另一个隐藏节点应该编码 AND。然后输出节点可以编码 OR 隐藏节点为正,AND 隐藏节点为负的 XOR 问题。只有当 OR 隐藏节点被激活而 AND 隐藏节点没有被激活时,这才会产生积极的结果。
我还会增加权重的边界,让 EA 自己找到它。但如果有必要,这取决于网络结构。
如果您想将此网络与隐藏节点和阈值一起使用,请参阅:http://www.heatonresearch.com/online/introduction-neural-networks-java-edition-2/chapter-1/page4.html
如果您想使用另一个带有偏差的网络,请参阅:http://www.mind.ilstu.edu/curriculum/artificial_neural_net/xor_problem_and_solution.php
关于java - 用 ANN 求解 XOR 的进化算法的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27379864/
我知道可以使用CvFileStorage将受过训练的ANN保存到文件中,但是我真的不喜欢CvFileStorage保存培训的方式,然后我想知道:是否有可能检索培训的信息并将其保存在自定义方式? 提前致
我是 ML 领域的新手,正在学习它,我按照教程制作了一个模型,但结果准确性总是很快跃升至 100%。我在网上搜索并发现根据我的理解我有与模型过度拟合相关的问题。我使用的数据集非常小,来自 UCI 网站
我用 Keras 制作了我的第一个 ANN。它是一个具有 5 个特征和 1 个输出的线性回归模型。我用“MSE”和“损失函数”画了一个图,这些是结果。我们能说它是一个好模型吗?另外 R^2 = 0.9
所以我正在尝试用感知器来训练或门。问题是它不起作用。错误的是 0 0 ->desired = 0,actual = 1。并且该值不会改变。 此外,当我输入要测试的权重时,它们似乎也根本不起作用,但这可
第一次用python,有很多疑惑。 我正尝试在 Pybrain 中制作一个用于预测的简单 ANN。它是一个 2 输入 - 1 输出网络。输入是,第一列中有年份,第二列中有月份。输出是与每个月相关的正常
我正在 MATLAB 中为监督分类任务实现一个神经网络。 我有一个训练集和一个测试集来评估结果。问题是,每次我为同一个训练集训练网络时,我都会为同一个测试集得到非常不同的结果(有时我得到 95% 的分
我正在使用 ANN 库 ( https://www.cs.umd.edu/~mount/ANN/ )。有一个功能 ANNkdTree::getStats(ANNkdStats &st) 提供 kdtr
以下训练曲线是使用用 Python 编写的相同 Tensorflow + Keras 脚本生成的: RED 线使用五个特征。 绿线使用七个特征。 蓝线使用九个特征。 谁能告诉我绿线振荡的可能原因,以便
我正在尝试执行 ANN,但我的数据被分成多个分区或“租户”。搜索始终仅限于单个租户,这只占文档总数的一小部分。 我首先尝试在租户字符串属性上使用过滤器来实现这一点。然而,我遇到了this piece
我最近开始研究 ANN,有一些我一直在试图弄清楚我似乎无法找到答案的东西(可能是因为它太琐碎了,或者因为我正在搜索错误的关键字......)。 什么时候使用多输出而不是单输出?我想在 1/0 分类的最
我刚刚被安排了一项任务来计算一些 ANN 输出并编写一个 ANN。简单的东西,以前做过,所以我不需要任何关于一般 ANN 东西的帮助。然而,有一点让我感到困惑。在作业中,拓扑如下(不会上传图表,因为它
我正在使用 python2,我正在尝试获取隐藏层的激活。我正在使用以下代码,但出现错误: get_activations = theano.function([my_model.layers[0].i
前言:我目前正在学习 ANN,因为我在大约 83 个类别中有大约 18500 张图像。它们将用于训练 ANN 以实时识别大致相等的图像。我按照书中的图像示例进行操作,但它对我不起作用。所以我要回到开头
刚刚用 python 编写了我的第一个神经网络类。据我所知,一切都应该有效,但其中有一些我似乎找不到的错误(可能正盯着我的脸)。我首先在 MNIST 数据的 10,000 个示例上进行了尝试,然后在尝
我的神经网络输入参数包含符号数据。我不明白是否可以以这种形式提交数据或需要标准化。难道不是吗?我该如何解决它? 最佳答案 神经网络不是符号网络。它们仅处理数字数据。如果“符号”指的是分类(如“猫”、“
我是 tensorflow 的初学者,需要获取预测值(如果客户是否订阅定期存款)作为给定数据帧作为输入的多感知 ANN 模型的输出(以数据帧格式)。银行事件..我们正在引用这个样本 https://g
很抱歉问了这个愚蠢的问题,但我是 ANN 世界的新手,因为我正在制作自己的项目,所以我想确切地知道我正在做的一切。 所以我仍然不明白变量中权重和偏差的存储是如何工作的。 它们是放在数组中还是矩阵中?那
我目前正在使用反向传播来开发 ANN,用于分类任务。然而,我对标准化我正在使用的数据集有点困惑(我没有很强的统计/概率背景)。 数据示例如下所示: 5.1, 3.5, 1.4, 0.2, 1 5.2,
我看过很多网站和博客解释 ANN(人工神经网络),但没有一个网站和博客考虑到为不太了解 ANN 的人逐步开发基础的过程,而是投入了很多数学,不幸的是对我来说看起来非常难以捉摸。是否有任何网站/博客教授
我参与了很多 C 编程和 RT-Linux,现在我想做一些人工神经网络。 但是:我该如何开始? 我对进化算法(学习算法)和人工智能也很感兴趣。我可以从哪里开始学习所有这些? 最佳答案 如果您只是想熟悉
我是一名优秀的程序员,十分优秀!