Java神经网络
前言
学了好一阵子时间的神经网络,对神经网络的感觉都还是朦朦胧胧的,感觉还是什么都不会,python代码也不是太熟悉,在写小案例的时候总是被一些奇奇怪怪的报错拦住,于是打算剑走偏锋用自己最熟悉的代码(Java)再去学一遍,文中若有错误还请大佬指正。
Neuroph框架
Neuroph 是轻量级的 Java 神经网络的框架,可以用来模拟常见的神经网络架构。少数基本类别相对应的基本网络的概念,它非常容易学习。它也有一个不错的 GUI 应用程序。
Neuroph结构
框架图
Java API 及其类库说明(core nnet util)
Java Api被分为三部分:
core(核心组件) nnet(网络组件) util(工具组件)
类库 | 说明 |
---|---|
Neuroph简单案例实现
下载必要的Neuroph jar包
下面用的是neuroph-2.98 链接:https://neuroph.sourceforge.net/download.html
导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>IDEANeuroph01</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.beykery</groupId>
<artifactId>neuroph</artifactId>
<version>2.92</version>
<type>pom</type>
</dependency>
</dependencies>
</project>
找案例(在书中或者网上)
该案例是在网上找到的,附上原文链接:https://www.moban555.com/article/1016215.html
package com.kc;
import java.util.Arrays;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.core.events.LearningEvent;
import org.neuroph.core.events.LearningEventListener;
import org.neuroph.core.learning.LearningRule;
import org.neuroph.nnet.Perceptron;
import org.neuroph.nnet.learning.BinaryDeltaRule;
public class MyPerceptron implements LearningEventListener{
public static void main(String[] args) {
new MyPerceptron().TestPerceptron();
}
public void TestPerceptron() {
// create new perceptron network
NeuralNetwork myperceptron = new Perceptron(2, 1);
// create training set AND
DataSet trainingSet = new DataSet(2, 1);
trainingSet.add(new double[]{0, 0}, new double[]{0});
trainingSet.add(new double[]{0, 1}, new double[]{0});
trainingSet.add(new double[]{1, 0}, new double[]{0});
trainingSet.add(new double[]{1, 1}, new double[]{1});
// print iteration log
LearningRule lr = myperceptron.getLearningRule();
lr.addListener(this);
// learn the training set
myperceptron.learn(trainingSet);
// save the trained network into file
myperceptron.save("or_perceptron_nnet");
// load the saved network
NeuralNetwork neuralNetworkTest = NeuralNetwork.createFromFile("or_perceptron_nnet");
// Test network - Single input
neuralNetworkTest.setInput(0, 0);
neuralNetworkTest.calculate();
double[] networkOutput = neuralNetworkTest.getOutput();
System.out.println(networkOutput[0]);
// Test network - set input
testNeuralNetwork(myperceptron, trainingSet);
}
public void testNeuralNetwork(NeuralNetwork nnet, DataSet tset) {
for (DataSetRow dataRow : tset.getRows()) {
nnet.setInput(dataRow.getInput());
nnet.calculate();
double[ ] networkOutput = nnet.getOutput();
System.out.print("Input: " + Arrays.toString(dataRow.getInput()) );
System.out.println(" Output: " + Arrays.toString(networkOutput) );
}
}
@Override
public void handleLearningEvent(LearningEvent event) {
BinaryDeltaRule rule = (BinaryDeltaRule)event.getSource();
if (event.getEventType() != LearningEvent.Type.LEARNING_STOPPED)
System.out.println(rule.getCurrentIteration() + ". iteration : "+ rule.getTotalNetworkError());
}
}
运行
解决方案
由上图可知代码编译前虽然没报错,但是在编译后却报错了。
通过一步步排查,我们找到他在DataSet这个类中少了一个文件,如图
解决如下: 去maven里下载一个,在pom.xml中添加其坐标
<dependency>
<groupId>javax.visrec</groupId>
<artifactId>visrec-api</artifactId>
<version>1.0.0</version>
</dependency>
再次运行: