timaschew / jann Goto Github PK
View Code? Open in Web Editor NEWAPI for creating and using artificial neural network in java
API for creating and using artificial neural network in java
[j]ava [A]rtificial [N]eural [N]etwork API for creating and using artificial neural network in java.
In der SidebarModel, muss ich zwei ChangeListener umschreiben, sie haben nämlich BooleanWerte gefeuert und eine CastException hat geknall weil in der ActionController (UPDATE_JUNG_GRAPH) du immer auf Integer gecasted hast: newValue = (Integer) evt.getNewValue();
Du kannst auch instance of check machen, und die 2 Actions wieder rausnehmen:
UPDATE_JUNG_GRAPH_INPUT_BIAS und UPDATE_JUNG_GRAPH_HIDDEN_BIAS
Wenn du wissen willst, in welcher Layer es einen Bias gibt, hier gibts den Zugriff, Achtung, du kriegst den relativen Layer zurück!
List hiddenBiasList = sidebarModel.getHiddenBias();
for stepping (debugging) each iteration or step in the training
and auto connection / synapses between the layers
user should load some predefines networks, for example xor 2x2x1 with bias
for updating jung gui, java gnu plot, net error, etc.
Habe in der balsamiq.xml das mock erweitert.
Denk dran, vor dem Import, alle bisherigen Elemente zu löschen, denn beim Import wird hinzugefügt NICHT überschrieben.
Bau bitte im Main Menü ein "Schalter" ein, der Zwischen SOM und Backpropagation umschaltet.
Die Sidebar soll beim SOM nur die zwei Panels haben, die JUNG View wird deaktiviert, statt dessen kommt das 3DBoard rein (lass das erstmal leer mit einem leeren JPanel)
see ActionController and ActionControllerTest
public Graph<Neuron, Synapse> generateNeuroNetz(NeuronalesNetz net) {
int neuroNetCount = net.getNeuronen().size();
Graph<Neuron, Synapse> graph = new SparseMultigraph<Neuron, Synapse>();
for (Synapse synapse : net.getSynapsen()) {
Neuron start = net.getNeuronen().get(synapse.getStartNeuronID());
Neuron goal = net.getNeuronen().get(synapse.getGoalNeuronID());
graph.addEdge(synapse, start, goal, EdgeType.DIRECTED);
}
int neuroGraphCount = graph.getVertexCount();
if(neuroGraphCount <neuroNetCount){
LOG.info("Nicht alle Neuronen des Netzes wurden dem Graph hinzugefügt, da einige Neuronen keine Synapsen verbinden");
}
return graph;
}
g = generateNeuroNetz(net);
vv = new VisualizationViewer<Neuron, Synapse>(new ISOMLayout<Neuron, Synapse>(g));
getVv().setGraphLayout(new FRLayout<Neuron, Synapse>(getGraph()));
for (Neuron neuron : getGraph().getVertices()) {
if (neuron.getLayer() == null) {
continue;
}
Integer neuronGroup = neuron.getGroupIdOfLayer();
Integer neuronLayer = neuron.getNeuronIdOfLayer();
double x = 100 + neuronGroup_100 + neuronLayer_50;// + Math.random()*100;
double y = 100 + neuron.getLayer() * 100;
getVv().getGraphLayout().setLocation(neuron, new Point2D.Double(x, y));
}
}
class NeuronInfo implements Transformer<V, String>{} // V = Neuron
NeuronInfo neuroInfo;
getVv().getRenderContext().setVertexLabelTransformer(neuroInfo);
class DisplayNeuron<V, E> implements Predicate<Context<Graph<V, E>, V>> { // V = Neuron, E = Synapse
V v = context.element;
Neuron neuron = (Neuron) v;
Integer neuroLayer = neuron.getLayer();
if (filterOn) {
return true;
}
if (layer.equals(neuroLayer)) {
return true;
}
return false;
}
}
if (b == true) {
getVv().getRenderContext().setEdgeShapeTransformer(
new EdgeShape.QuadCurve<Neuron, Synapse>());
} else {
getVv().getRenderContext().setEdgeShapeTransformer(
new EdgeShape.Line<Neuron, Synapse>());
}
initNetz(null);//Zum ersten Start ein kleines Beipspiel-Netz
getVv().getRenderContext().setVertexFillPaintTransformer(getNeuronColor());
getVv().getRenderContext().setEdgeDrawPaintTransformer(getSynapsenColorTransformer());
getVv().getRenderContext().setVertexDrawPaintTransformer(neuronenBorderColor);
getVv().getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Neuron, Synapse>()); // Kantenform, gebogen/gerade
getVv().getRenderContext().setVertexIncludePredicate(displayNeuroLayer);
getVv().getRenderContext().setArrowFillPaintTransformer( new ConstantTransformer(Color.lightGray));
getVv().getRenderContext().setArrowDrawPaintTransformer( new ConstantTransformer(Color.black));
graphMouse = new DefaultModalGraphMouse();
graphMouse.add(new GraphPopUp(this));
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
getVv().setVertexToolTipTransformer(new NeuronTooltip());
getVv().setGraphMouse(graphMouse);
getVv().setBackground(colorVv);
DisplayNeuron<Neuron,Synapse> displayNeuroLayer;
getVv().getRenderContext().setVertexIncludePredicate(displayNeuroLayer);
// #################
GraphZoomScrollPane graphPanel = new GraphZoomScrollPane(getVv());
error does not contain goog information about training, two different results with approx. the same error
bad training
error = 0,18461 learnSteps = 20000 iterations = 5000 0 0 --> 0,0102 0 1 --> 0,9872 1 0 --> 0,4932 1 1 --> 0,4937
good training
error = 0,17634 learnSteps = 2000 iterations = 500 0 0 --> 0,0891 0 1 --> 0,9182 1 0 --> 0,9181 1 1 --> 0,0984
Also ich habe einen Test comitted StrategyReflectionTest
Dort siehst du wie das ganze mit Reflection funktioniert. du musst nur noch die passenden Swing Element erstellen und mit den entsprechenen Typen (Int/Double) der Rest ist schon fertig.
Wenns nicht klappt sag Bescheid. Wenns es danach noch immer nicht geht, machs per Hand.
Nach Start der Anwendung darf der Editor entweder nicht bedienbar sein oder es müssen default Settings geladen werden.
Grund: Ansonsten fliegt eine NullPointerException in SideModel.getMouseInsertLayer beim Versuch, einen neuen Knoten über den Editor hinzuzufügen, da in der Sidebar noch keinerlei Einstellungen vorgenommen wurden und somit kein einziger Layer eingestellt und ausgewählt ist.
Solange im Topologie Panel der Spinner für die Hidden Layer auf 0 steht, sollte der Spinner für die Hidden Neuronen deaktiviert sein. Momentan wird sogar eine Exception gefeuert, wenn man den Hidden Neuronen Spinner verwendet ohne zuvor einen Hidden Layer hinzugefügt zu haben. Denke die einfachste Variante das Problem zu lösen, ist die oben genannte standardmäßige Deaktivierung des Hidden Neuronen Spinners.
Wir brauchen doch schon das TrainControlPanel (ich hatte ja gesagt, wir brauchen es erstmal nicht, hatte mich geirrt: wir werden die Step Funktion nur erstmal weglassen, den rest brauchen wir)
Also bei dem TopologiPanel fehlt ja noch der Button "Netz erstellen". Wenn man da draufdrückt, soll ein Network erstellt werden. Dies kann über die Klasse NetConfig erzeugt werden, dort gibt man die Parameter an wieviel Input, Hidden, ... es gibt. DIese Werte stehen dann ja in der SidebarModel Klasse.
Nachdem alle Parameter gesetzt sind muss finalyzeStructure aufgerufen werden.
Wenn im TrainControlPanel auf den Button Play drückt, sollen die Werte wie Lernreate etc. über die NetConfig gesetzt werden. Die Parameter kannst in dem Backpropagation Klasse setzen, darüber kommst du von der NetConfig mit der Methode: getTrainingModule() dran. Und an die NetConfig kommst du über die Session, also Settings.getCurrentSession.getNetConfig()
Falls einige Methoden fehlen, füg sie einfach selber hinzu!
Die Spinner für die Hidden Neuronen verhalten sich nach wie vor nicht korrekt!
Test Case zum Nachstellen des Fehlers:
Je nachdem welchen Wert das Neuron hat, soll es mit einer Farbe zu dem entsprechendem Prozentwert befuellt werden.
Sigmoid [0,1], faktor= * 100
TanH [-1,1], faktor = +1 ) * 50
Um über das Menü ->Neu ein neues Modell zu erzeugen und alle bisherigen Eingaben zurückzusetzen (eventuell mit vorheriger Überprüfung, ob die aktuelle Session gespeichert oder verworfen werden soll), wird eine reset Methode für die Sidebar benötigt, die alle Einstellungen und Eingaben innerhalb der Sidebar zurücksetzt.
Contextmenu definieren
Der bisherige Code für das updaten der ComboBox im TopologiePanel war nicht so schön, habe hier eine Alternative, die speichert auch das zuletzt markierte Element und stellt es ggf. wieder her, verdende das für alle anderen auch so bitte:
// get last selection from combobox
Integer selectedItem = (Integer) sidebar.topolgyPanel.hiddenLayerDropDown.getSelectedItem();
// refresh the combobox: remove all and add then again
// remove all items
sidebar.topolgyPanel.hiddenLayerDropDown.removeAllItems();
// add the items
for (int i = 1; i <= sidebarConfig.getHiddenLayers(); i++) {
sidebar.topolgyPanel.hiddenLayerDropDown.addItem(new Integer(i));
}
// if previous selection was not null, set to old value
if (selectedItem != null) {
// if old value don't exist anymore set to current hidden layer amount,
// otherwise use the previous selected item
if (selectedItem > sidebarConfig.getHiddenLayers()) {
sidebar.topolgyPanel.hiddenLayerDropDown.setSelectedItem(sidebarConfig.getHiddenLayers());
} else {
sidebar.topolgyPanel.hiddenLayerDropDown.setSelectedItem(selectedItem);
}
}
In der MenüLeiste
Quelle: http://fbim.fh-regensburg.de/~saj39122/wabrpi/index.html
Xor, And, Or, 2BitAddierer
NetFactory oder NetConfig benutzen um Network zu erzeugen.
Dazu werden noch trainigsPattern gebraucht.
NetConfig um Attribute für training und test Pattern erweitern (Klasse DataPairSet)
Die direkte Eingabe von Werten in den Comboboxen macht Probleme bzw wird derzeit nicht korrekt untstützt. Eingabe eines Wertes (z.B. 5) führt nicht zu gewünschten Generierung von 5 Neuronen.
Die Vertex, die man über die Sidebar hinzufügt, werden nicht im Jung Panel angezeigt, weil sie nicht zum Graph hinzugefügt werden ;)
Habe diese Zeile mal in die Klasse LayerController.java die eine Methode geändert:
public Layer addVertex(final int layerIndex) {
Vertex vertex = vertexFactory.create();
vertex.setup();
GraphLayoutViewer.getInstance().getGraph().addVertex(vertex);
GraphLayoutViewer.getInstance().repaint();
return addVertex(layerIndex, vertex);
}
Ich denke das macht nichts, wenn man den vertex zwei mal hinzufügt.
So nach dieser Änderungen klappt es allerdings noch nicht ganz:
SidebarConfig, am besten mal umbennenn in 'SidebarModel', mit Refactor Funktion von Eclipse.
Dort sollen gespeichert werden als eigenständige Felder die Werte für Input, und Outputneuronen. Die HiddenNeuronen werden als HashMap mit dem Layer als Key benutzt. Diese Felder sind bereits verfügbar.
Was noch fehlt, ist noch eine HashMap, die aufnimmt, ob die Layer einen Bias hat. z.B Map<Integer, Boolean>
Diese Werte werden alls als Zwischenspeicherort für das NetConfig Objekt im SidebarModel gehalten.
Weil die Attribute auch für JUNG gebraucht werden, müssen sie durch das MVC Pattern realisier werden.
Für das InputNeuron ist dies bereits fertig und funktioniert auch schon. Für die anderen Attribute muss dies analog erweitert werden.
Die Sidebar enthält noch viele weitere Werte, die in den ganzen Panels verteilt sind. Zum Glück brauchen diese nicht nach dem MVC prinzip implementiert werden. Sie müssen nur public zugreifbar sein über die SidebarModel Klasse, so wie die RadioButtons für den Mouse Insert Mode (das ist auch bereits fertig).
Ausnahme ist das Panel SelectedSymbolPanel, hier muss auch wieder ein MVC Konzept her, da es mit JUNG verknüpft werden muss. Das heißt s müssen folgende Attribute hinzugefügt werden:
Neuron selcetedNeuron;
Synapse selectedSnypase;
ActivationFunction selectedActivation;
Alex, close this Tasks over Eclipse!
"Ausgewähltes Symbol" (das könnt eman auch umbennen) muss mit den richtigen Werten angezeigt werden, also entweder Neuron oder Synapse, je nach dem was man angeklickt hat und dann die Werte.
per MVC
Noch mal kurz erkl‚à ö¬ßrt:
Du sollst aus dem Men‚à ö¬∫,diese Maus Modi (PICKING, TRANSFORMING, ..) f‚à ö¬∫r Jung als Panel extrahieren.
Standardmäßig sollte die Hidden Radiobox bei Mouse Modus im TopologyPanel deaktiviert sein, auch wenn im Jung Modi "Editing" gesetzt ist. Erst wenn mindestens ein Hidden Layer hinzugefügt wurde, soll die Radiobox aktiviert werden.
Beim Erstellen von Edges (Synapsen) Vertices (Neuronen) überprüfen, ob sie in unterschiedlichen Layern liegen.
Mach mal zu!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.