Anfängerfrage zu C-Code generation
Anfängerfrage zu C-Code generation
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
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
Re: Anfängerfrage zu C-Code generation
Hallo,
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.
Frohe Weihnachten!
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:1. Ist es überhaubt möglich den C-Code auf Debian-Linux zum Laufen zu bringen?
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.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?
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.
Die Anwendung ist recht trivial, z.B. wie in folgendem Code-Beispiel gezeigt: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?
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]);
}
Thomas Jetter
Re: Anfängerfrage zu C-Code generation
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
Mit freundlichen Grüssen!
Gianni
Re: Anfängerfrage zu C-Code generation
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:
Und das sind die Fehlermeldungen des Compilers:
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
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]);
}
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 ===|
Vielen Dank im voraus und freundliche (aber verzweifelte) Grüsse!
Gianni
Re: Anfängerfrage zu C-Code generation
Hallo,
Die main() Funktion soll der Konvention nach den Wert 0 zurückgeben, wenn das Programm fehlerfrei abgearbeitet wurde.
Hier hilft also ein
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!
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'):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 ===|
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;
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
Re: Anfängerfrage zu C-Code generation
Ich sehe gerade noch etwas:
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
Diese Vorgehensweise wird nicht funktionieren: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.
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
Re: Anfängerfrage zu C-Code generation
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
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
Re: Anfängerfrage zu C-Code generation
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
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