Giter Club home page Giter Club logo

jann's Introduction

[j]ava [A]rtificial [N]eural [N]etwork

API for creating and using artificial neural network in java.

jann's People

Contributors

timaschew avatar way avatar jart avatar

Stargazers

Spencer metz avatar  avatar

Watchers

 avatar James Cloos avatar  avatar

jann's Issues

Seperate Update Action for Bias (Input and Hidden) for updating Jung

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();

predefined networks

user should load some predefines networks, for example xor 2x2x1 with bias

GUI for SOM network

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)

Jung code snippet

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());

NetError has little informative value

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 

gui components

  • load configration file (topology, synapses, training) -> modal dialog with normalisation option and on the fly visualization with java gnu plot
  • load predefined networks (built-in)
  • set training algorithm (backprop, rprop) with parameters (learnrate, max iteration, min error, etc.), set init synapse algo
  • set topology (click into jung graph in specific overplay region (input, hidden, output)
    • configure amount of hidden layer
    • configure standard prefs for neurons (activation function)
    • configure bias
  • visualize net error
  • visualize dataset (train or test) in Java gnu plot
  • visaualize neuron model in neuron jung view

StrategyPanel für alle bisherigen Strategies fertig machen

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.

NPE beim Benutzen des Editors direkt nach Start der Anwendung

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.

Hidden Neuronen Spinner default disablen

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.

TopologyPanel and TrainControlPanel

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!

Bug bei Hidden Neuronen in Sidebar

Die Spinner für die Hidden Neuronen verhalten sich nach wie vor nicht korrekt!
Test Case zum Nachstellen des Fehlers:

  • Input Neuronen einf‚àö¬∫gen (Spinner auf Wert gr‚àö‚àÇ‚àö√ºer 0 stellen)
  • Output Neuronen einf‚àö¬∫gen (Spinner auf Wert gr‚àö‚àÇ‚àö√ºer 0 stellen)
  • Hidden Layer Spinner auf 1 stellen
    -> Hidden Neuronen Spinner wird aktiviert, ABER:
    - Spinner für die Anzahl der Neuronen im selektierten Hidden Layer bleibt bei 0 obwohl ein Hidden Neuron hinzugefügt wurde
    - Der zweite Spinner für die Auswahl des Hidden Layers enthält nach wie vor nicht die Anzahl der Layer, sondern die Anzahl der Neuronen im Hidden Layer!

visualize neuron in jung

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

SOM Panel bugs

  1. Das SOM Panel braucht auch die Konsole, die fehlt momentan, lass das panel drin wie vorher.
  2. Wenn man von SOM auf Backprop umschaltet, gibt es keine Jung View mehr
  3. In de Sidebar muss das Feld für die Iterationen breiter, damit Zahlen bis 1000 (tausend) reinpassen

Benötige Sidebar.reset() Methode

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.

GraphMouse Contextmenu

Contextmenu definieren

  • Welche Funktionen sollen bereitgestellt werden
  • Problem mit Factories beachten -> Vertex und Edge Modelle werden nicht innerhalb der create erzeugt, daher existieren ihre Modelle zu dem Zeitpunkt nocht nicht. Eventuell Workaround wie im GraphMousePlugin anwenden und mittels createModel() arbeiten

rewrite actioncontroller for combobox update process

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);
                }
            }

Eingabe von Werten in Comboboxen

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.

Strange Jung-Sidebar effects

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:

  • jedes zweite Neurorn wird in Jung nur als Vertex angezeigt (per Sidebar)
  • wenn man direkt mit der Mouse in Jung nun noch Vertexe hinzuf√ºgt, f√§ngt er wieder von 0 an zu z√§hlen bei

Die Stelle mit dem InputNeuron sieht ja so aus:SidebarConfig functions and API

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;

Last improvement

  • x Train Error Chart: fix skla for x axis / auto tick
  • x MenuItem for clearing the chart panel
  • x In update methode of jung and chart panel, check error from current train
  • x Training Controlpanen clean up
  • x Fix problem with train a network second time
  • x Fix Generating TrainingData Panal/Dialog
  • x Reset Button for the network
  • x Jung: bias as rectangle
  • x Normalisation in from -4 / -2 to -1 / -1 wrong?
  • x Improve SOM Learning algo and stop meachism?
  • SOM neighboor radius
  • SOM pattern style (round with cos/sin?)
  • SOM Weight Calculateion: Euclidean Distance with Winner Takes it All
  • SOM output neurons (exception with 20 output neurons) -> limitation?
  • SOIM Exceptionhandling in the pointMatrix initialisation

Hidden Radiobox in Mouse Modus

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.