Anfängerfrage zu C-Code generation

Haben Sie Fragen zur Bedienung bestimmter Features von MemBrain? Sind Sie nicht sicher, welches Häkchen was bewirkt? Möchten Sie wissen, ob eine bestimmte Funktionalität in MemBrain vorhanden ist oder nicht?

Dann stellen Sie Ihre Fragen hier!
Post Reply
gianni
Posts: 12
Joined: Thu 20. Nov 2014, 10:56

Anfängerfrage zu C-Code generation

Post by gianni » Tue 23. Dec 2014, 11:17

Hallo an alle!

Nachdem dem die ersten Test mit Membrain sehr vielversprechend sind möchte ich mit meinem Testprojekt einen Schritt weiter gehen und das "trainierte Netz" mittels C-Code Generation auf Debian-Linux zum Einsatz bringen. Da C für mich ein absolutes Neuland ist hätte ich gern einige Fragen vorab geklärt, bevor ich zuviel Zeit investiere und dann draufkomme das es doch nicht funktioniert.

1. Ist es überhaubt möglich den C-Code auf Debian-Linux zum Laufen zu bringen?
2. Mit C-Code-Generation werden 2 Dateien erzeugt (NeuralNetDef.h und NeuralNetDef.c). Verstehe ich es richtig, das ich ein eigenes C-Programm schreiben muss, indem ich NeuralNetDef.h einbinden muss, damit die Funktionen zum "Füttern" der Input-Neuronen, Think-Step und Abfragen der Output-Neuronen in meinem C-Programm zu Verfügung stehen? Oder reicht es NeuralNetDef.c zu kompilieren?
3. Haben Sie vielleicht ein einfaches Beispielprogramm in C an dem ich Nachvollziehen kann wie die Übergabe an Inputneuronen und Ausgabe an Outputneuronen funktioniert?

Vielen Dank im voraus und vorweihnachtliche Grüsse!
Gianni

User avatar
TJetter
Posts: 312
Joined: Sat 13. Oct 2012, 12:04

Re: Anfängerfrage zu C-Code generation

Post by TJetter » Wed 24. Dec 2014, 12:59

Hallo,
gianni wrote:1. Ist es überhaubt möglich den C-Code auf Debian-Linux zum Laufen zu bringen?
Das ist natürlich möglich, ja. Der Code ist plattformunabhängig und dadurch auf jeder Plattform mit einem geeigneten C-Copiler bzw. Entwicklungsumgebung einsetzbar.
gianni wrote:2. Mit C-Code-Generation werden 2 Dateien erzeugt (NeuralNetDef.h und NeuralNetDef.c). Verstehe ich es richtig, das ich ein eigenes C-Programm schreiben muss, indem ich NeuralNetDef.h einbinden muss, damit die Funktionen zum "Füttern" der Input-Neuronen, Think-Step und Abfragen der Output-Neuronen in meinem C-Programm zu Verfügung stehen? Oder reicht es NeuralNetDef.c zu kompilieren?
Richtig, ja, es muss dafür ein eigenes Programm geschrieben werden. Die Dateien von MemBrain kann man als eine Art 'Quellcode-Bibliothek' ansehen, um das trainierte Netz in einem eigenen C oder C++ Programm einsetzen zu können.
Der Code besteht aber aus noch mehr Dateien: Die zwei oben genannten sind die Dateien, die MemBrain für jedes Netz neu erzeugt. Dazu kommen einige unveränderliche Bibliotheksdateien, die im MemBrain Installations-Ordner liegen.
Dazu am besten mal in der MemBrain-Hilfe (F1) den Abschnitt 'Source Code Generation' und seine Unterkapitel lesen. Da ist alles erklärt.
gianni wrote:3. Haben Sie vielleicht ein einfaches Beispielprogramm in C an dem ich Nachvollziehen kann wie die Übergabe an Inputneuronen und Ausgabe an Outputneuronen funktioniert?
Die Anwendung ist recht trivial, z.B. wie in folgendem Code-Beispiel gezeigt:

Code: Select all

#include "NeuralNet.h"

T_ACT_FLOAT outAct[MB_OUT_NEURON_COUNT] = {0};
T_NEURON_COUNT idx;
T_ACT_FLOAT actIn = (T_ACT_FLOAT)0.5;

// Initialize and reset the neural net (i.e. initialize library and set all activations and link spikes to 0)
NeuralNetInitAndReset();

// Apply input activations (all set to 0.5 here)
for (idx = 0; idx < MB_IN_NEURON_COUNT; idx++)
{
    NeuralNetApplyInputAct(idx, actIn);
}

// Perform one think step of the net
NeuralNetThinkStep();
// Request all outputs from the net
for (idx = 0; idx < MB_OUT_NEURON_COUNT; idx++)
{
    NeuralNetGetOutputAct(idx, &outAct[idx]);
    // Do something with the results, e.g. print them to the console:
    TRACE("Output %d = %g\r\n", idx, outAct[idx]);
}
Frohe Weihnachten!
Thomas Jetter

gianni
Posts: 12
Joined: Thu 20. Nov 2014, 10:56

Re: Anfängerfrage zu C-Code generation

Post by gianni » Mon 29. Dec 2014, 09:10

Herzlichen Dank für die Antwort, erspart mir wie gesagt viel Zeit und ist ein Boost für mein Testprojekt.

Mit freundlichen Grüssen!
Gianni

gianni
Posts: 12
Joined: Thu 20. Nov 2014, 10:56

Re: Anfängerfrage zu C-Code generation

Post by gianni » Tue 3. Feb 2015, 10:03

Hallo!

Leider muss ich Sie nochmals mit dem C-Code belästigen, da ich mit meinem Latein am Ende bin. Ich komme mit dem c-code ohne Hilfe nicht weiter.

Mein Ziel für das c-programm:
Ich lese eine Mysql-tabelle Zeilenweise aus und übergebe die Spaltenwerte den Inputneuronen. Dann mache ich ein NeuralNetInitAndReset(), führe einen Thinkstep durch und möchte den Output wieder in die Mysql-Tabelle zurückschreiben.
Mein C-Programm ist jetzt soweit, das es diese Funktionen (zeilenweises auslesen der Spalten und zurückschreiben eines Outputs in die Tabelle) klaglos funktionieren, solange ich keine Membrain Funktionen einbaue. Sowie ich membrain code einbaue fangen meine Probleme an, und ich kann nicht ohne Fehlermeldungen kompilieren. Nachdem ich jetzt schon 2 Wochen erfolglos probiere diese Probleme in den Griff zu bekommen, hatte ich die Idee einmal nur den Code den Sie mir freundlicherweise gepostet haben auszuprobieren, leider ohne Erfolg.

Nachstehend finden Sie den Code des C-Programmes:

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#include <my_global.h>
#include <NeuralNet.h>

int main()
{


T_ACT_FLOAT outAct[MB_OUT_NEURON_COUNT]={0};
T_NEURON_COUNT idx;
T_ACT_FLOAT actIn = (T_ACT_FLOAT)0.5;

NeuralNetInitAndReset();

for (idx = 0; idx < MB_IN_NEURON_COUNT; idx++)
{
     NeuralNetApplyInputAct(idx,actIn);
}

NeuralNetThinkStep();

for (idx = 0; idx < MB_OUT_NEURON_COUNT; idx++)
{
    NeuralNetGetOutputAct(idx, &outAct[idx]);
}

printf("Output %d = %g \n", idx, outAct[idx]);
}
Und das sind die Fehlermeldungen des Compilers:

Code: Select all

/home/gianni/nntest/main.c||In function ‘main’:|
/home/gianni/nntest/main.c|31|warning: control reaches end of non-void function [-Wreturn-type]|
obj/Debug/main.o||In function `main':|
/home/gianni/nntest/main.c|16|undefined reference to `NeuralNetInitAndReset'|
/home/gianni/nntest/main.c|20|undefined reference to `NeuralNetApplyInputAct'|
/home/gianni/nntest/main.c|23|undefined reference to `NeuralNetThinkStep'|
/home/gianni/nntest/main.c|27|undefined reference to `NeuralNetGetOutputAct'|
||=== Build finished: 4 errors, 1 warnings ===|

Könnten Sie bitte so nett sein, und nochmals einen Blick auf den c-code werfen, und mir einen Anhaltspunkt geben was ich falsch mache.

Vielen Dank im voraus und freundliche (aber verzweifelte) Grüsse!
Gianni

User avatar
TJetter
Posts: 312
Joined: Sat 13. Oct 2012, 12:04

Re: Anfängerfrage zu C-Code generation

Post by TJetter » Tue 3. Feb 2015, 19:32

Hallo,
gianni wrote:Und das sind die Fehlermeldungen des Compilers:
/home/gianni/nntest/main.c||In function ‘main’:|
/home/gianni/nntest/main.c|31|warning: control reaches end of non-void function [-Wreturn-type]|
obj/Debug/main.o||In function `main':|
/home/gianni/nntest/main.c|16|undefined reference to `NeuralNetInitAndReset'|
/home/gianni/nntest/main.c|20|undefined reference to `NeuralNetApplyInputAct'|
/home/gianni/nntest/main.c|23|undefined reference to `NeuralNetThinkStep'|
/home/gianni/nntest/main.c|27|undefined reference to `NeuralNetGetOutputAct'|
||=== Build finished: 4 errors, 1 warnings ===|
Es sieht so aus, als ob nur die erste der Meldungen vom Compiler kommt, dabei handelt es sich um eine Warnung, dass die Funktion 'int main()' keinen Wert zurückgibt, das aber Ihrer Definition nach tun soll (nämlich einen Wert vom Typ 'int'):
Die main() Funktion soll der Konvention nach den Wert 0 zurückgeben, wenn das Programm fehlerfrei abgearbeitet wurde.
Hier hilft also ein

Code: Select all

return 0;
als letzte Anweisung in der Funktion.
Zu den Fehlern:
Diese scheinen mir vom Linker zu kommen, nicht vom Compiler. Der Linker versucht, die Programmteile, die der Compiler in Maschinensprache übersetzt hat, zu einem ausführbaren Programm 'zusammenzustricken'. Dabei stellt er in Ihrem Fall fest, dass der Programmteil 'main.o' Funktionen von anderen Programmteilen aufrufen soll. Der Linker findet diese aber nicht.
Die Ursache ist vermutlich, dass Sie diese Programmteile nicht in Ihr C/C++ Projekt mit aufgenommen haben. Die oben erwähnte MemBrain Hilfe sagt dazu:
-----------------------------------------------------------------------------
The C-Code for any neural net always consists of the two files
NeuralNetDef.h
NeuralNetDef.c
that have been generated by MemBrain for a certain neural net together with the MemBrain C-Code Generation Library that consists of the following files that are located in the sub directory 'C_CODE' of the MemBrain installation directory.
NN_Types.h
NeuralNet.c
NeuralNet.h
Neuron.c
Neuron.h
NeuralLink.c
NeuralLink.h
Random.c
Random.h

It is strongly recommended to make a copy of these files and only use the copies to build your application since this reduces the risk of unintentionally editing the files.
Depending on your compiler you may need to edit the file NN_Types.h to align the data types required by the MemBrain C-Code Generation Library to your target.
Add all the .c files to your application build environment, include the header file 'NeuralNet.h' in your application and use the interface functions listed in the header file NeuralNet.h to access the neural net...
---------------------------------------------------------------------------------------------------------------------------------------
Kann es sein, dass Sie die C-Files noch nicht Ihrem Projekt hinzugefügt haben? Das würde erklären, warum der Compiler sie nicht übersetzt hat und der Linker deshalb die übersetzten Programmteile nicht findet.
Welche Entwicklungsumgebung nutzen Sie denn?

Viele Grüße und viel Erfolg!
Thomas Jetter

User avatar
TJetter
Posts: 312
Joined: Sat 13. Oct 2012, 12:04

Re: Anfängerfrage zu C-Code generation

Post by TJetter » Tue 3. Feb 2015, 19:35

Ich sehe gerade noch etwas:
gianni wrote:Ich lese eine Mysql-tabelle Zeilenweise aus und übergebe die Spaltenwerte den Inputneuronen. Dann mache ich ein NeuralNetInitAndReset(), führe einen Thinkstep durch und möchte den Output wieder in die Mysql-Tabelle zurückschreiben.
Diese Vorgehensweise wird nicht funktionieren:
Den Aufruf von 'NeuralNetInitAndReset()' dürfen Sie nur einmalig am Anfang machen. Von da an legen Sie nur noch die Werte an die Inputneuronen an und führen ThinkSteps aus.
Wenn Sie 'NeuralNetInitAndReset()' aufrufen, NACHDEM Sie die Inputs ans Netz gelegt haben, wird die Funktion Ihre angelegten Daten wieder mit Nullen überschreiben.

Viele Grüße
Thomas Jetter

gianni
Posts: 12
Joined: Thu 20. Nov 2014, 10:56

Re: Anfängerfrage zu C-Code generation

Post by gianni » Tue 3. Feb 2015, 21:33

Vielen Dank für die rasche Antwort und Ihre Hinweise. Genau wie Sie vermutet haben, waren meine Probleme darin begründet, dass ich die erwähnten library files nicht dem Projekt hinzugefügt habe, sondern nur dem searchpfad bekanntgegeben habe.

Als Entwicklungsumgebung verwende ich code::blocks. Ist aber für mich genauso wie c ein komplettes Neuland.

Nach der Berücksichtigung Ihrer Hinweise läuft jetzt mal Ihr Beispielprogramm und ich bin zuversichtlich jetzt auch mein eigenes c-programm mit den Membrain Funktionen erweitern zu können.

Nochmals herzlichen Dank für Ihre rasche Unterstützung.

Mit freundlichen Grüssen!
Gianni

gianni
Posts: 12
Joined: Thu 20. Nov 2014, 10:56

Re: Anfängerfrage zu C-Code generation

Post by gianni » Wed 4. Feb 2015, 14:46

Sehr geehrter Herr Jetter!

Ihre letzte Hilfestellung hat für mich den Durchbruch bedeutet. Endlich funktioniert mein erstes NN-Projekt so wie ich mir das vorgestellt habe.

Ich möchte mich nochmals ganz herzlich für Ihre Unterstützung bedanken (besonders auch deshalb weil sie zum Teil ausserhalb von membrain gelegen hat!), ohne die ich wahrscheinlich mein Projekt nicht hätte beenden können.

Vielen Dank und freundliche Grüsse!
Gianni

Post Reply