kramann.info
© Guido Kramann

Login: Passwort:










Archiv
2 SoSe2022
..2.1 MIK
..2.2 SRT
..2.3 HDL
..2.4 AUT
..2.5 SLE
2 WS2020_21
..2.1 RTS
....2.1.1 day_by_day
..2.2 IE
....2.2.1 day_by_day
..2.3 ES
..2.4 EFSEE
....2.4.1 day_by_day
..2.5 KF
....2.5.1 day_by_day
....2.5.2 Haikus
....2.5.3 Haikus_en
..2.6 CC
....2.6.1 day_by_day
2 WS2021_22
..2.1 RTS
....2.1.1 day_by_day
....2.1.2 Versuch002
....2.1.3 Versuch003
....2.1.4 Versuch004
....2.1.5 Versuch005
....2.1.99 Material
..2.2 FTS
....2.2.1 day_by_day
..2.3 ESY
....2.3.1 day_by_day
..2.4 INFmecha5
....2.4.1 day_by_day
..2.5 REGmecha5
....2.5.1 day_by_day
2 WS2023_24
..2.1 day_by_day_RST
..2.2 day_by_day_SRT
..2.3 day_by_day_FTS
..2.4 day_by_day_KF
3 SoSe2021
..3.1 STR
....3.1.1 day_by_day
..3.2 SLE
....3.2.1 day_by_day
..3.3 HDL
....3.3.1 day_by_day
..3.4 MIK
....3.4.1 day_by_day
3 SoSe2024
..3.1 Mik_21_03_2024
..3.2 Mik_04_04_2024
..3.3 Mik_11_04_2024
..3.4 Mik_18_04_2024
..3.5 Mik_25_04_2024
..3.6 Mik_02_05_2024
..3.7 Mik_16_06_2024
..3.8 Mik_23_05_2024
..3.9 Mik_30_05_2024
..3.10 Mik_05_06_2024
..3.11 Mik_13_06_2024
3 WS2022_23
..3.1 day_by_day_RST_3MB
..3.2 day_by_day_RT2_5MT
..3.3 day_by_day_EMB_7MT
..3.4 day_by_day_ABP_7MT
..3.5 day_by_day_FTS_MMB
..3.6 day_by_day_KF
4 SoSe2023
..4.2 RTS_day_by_day
..4.3 MIK_day_by_day
..4.4 AUT_day_by_day
..4.5 HDL_day_by_day
4 WS2024_25
..4.1 ING_day_by_day
....4.1.1 ING_Do_26_09_2024
....4.1.2 ING_Do_10_10_2024
....4.1.3 ING_Do_17_10_2024
....4.1.4 ING_Do_24_10_2024
....4.1.5 ING_Do_07_11_2024
....4.1.6 ING_Do_14_11_2024
....4.1.7 ING_Do_21_11_2024
....4.1.8 ING_Do_28_11_2024
....4.1.9 ING_Do_05_12_2024
....4.1.10 ING_Do_12_12_2024
....4.1.11 ING_Do_19_12_2024
..4.2 INF_day_by_day
....4.2.1 INF_Fr_27_09_2024
....4.2.2 INF_Fr_04_10_2024
....4.2.3 INF_FR_18_10_2024
....4.2.4 INF_Fr_25_10_2024
....4.2.5 INF_Fr_08_11_2024
....4.2.6 INF_Fr_15_11_2024
....4.2.7 INF_Fr_22_11_2024
....4.2.8 INF_Fr_29_11_2024
....4.2.9 INF_Fr_06_12_2024
....4.2.10 INF_Fr_13_12_2024
....4.2.11 INF_Fr_20_12_2024
....4.2.12 INF_Fr_10_01_2025
..4.3 FTS_day_by_day
....4.3.1 FTS_Mi_25_09_2024
....4.3.2 FTS_Mi_02_10_2024
....4.3.3 FTS_Mi_09_10_2024
....4.3.4 FTS_Mi_16_10_2024
....4.3.5 FTS_Mi_23_10_2024
....4.3.6 FTS_Mi_30_10_2024
....4.3.7 FTS_Mi_06_11_2024
....4.3.8 FTS_Mi_13_11_2024
....4.3.9 FTS_Mi_20_11_2024
....4.3.10 FTS_Mi_27_11_2024
....4.3.11 FTS_Mi_04_12_2024
....4.3.12 FTS_Mi_11_12_2024
....4.3.13 FTS_Mi_18_12_2024
6 Ing
..6.1 Bauplan
....6.1.1 Bootstick
....6.1.2 Xubuntu
....6.1.3 Webserver
....6.1.4 Hotspot
....6.1.5 Videostream
....6.1.6 Lampe
....6.1.7 Chassis
....6.1.8 Akku
....6.1.9 Motore
....6.1.10 Laborsteckboard
....6.1.11 Antriebstest
7 007
..7.1 Einschalten
..7.2 Vorversuche
kramann.info
© Guido Kramann

Login: Passwort:




Inhalte zur Vorlesungswoche #7, Informatik 1 im Wintersemester 2024/25

(EN google-translate)

(PL google-translate)

Themen

  1. Einführung zu Künstliche Intelligenz (Wiederholung)
  2. Einführung zu Neuronale Netze
  3. Programmierung eines sehr einfachen künstlichen Neurons
  4. Programmierung eines sehr einfachen Neuronalen Netzes
  5. Trainieren eines sehr einfachen Neuronalen Netzes

1 Einführung zu Künstliche Intelligenz (Wiederholung)

  • General Problem Solver
  • Konnektionistische Künstliche Intelligenz versus Symbolische Künstliche Intelligenz
https://de.wikipedia.org/wiki/General_Problem_Solver
https://de.wikipedia.org/wiki/Konnektionismus -- siehe dort: "Symbolismus- vs. Konnektionismus-Debatte"
https://de.wikipedia.org/wiki/K%C3%BCnstliche_Intelligenz -- Künstliche Intelligenz
https://de.wikipedia.org/wiki/Expertensystem -- Expertensysteme
https://de.wikipedia.org/wiki/K%C3%BCnstliches_neuronales_Netz -- Neuronale Netze

2 Einführung zu Neuronale Netze

75_Echtzeit3/01_NeuronaleNetze
75_Echtzeit3/01_NeuronaleNetze/01_Neuron
75_Echtzeit3/01_NeuronaleNetze/02_Backpropagation
75_Echtzeit3/01_NeuronaleNetze/03_Umsetzung

3 Programmierung eines sehr einfachen künstlichen Neurons

Erster Schritt: Implementierung der sigmoiden Funktion:
#include <iostream>
#include <math.h>
using namespace std;

//Aufgabe: Programmieren eines künstlichen Neurons:
// 

//Wie kann man die sigmoide Funktion implementieren?

int main(void)
{
    //Implementierung der sigmoiden Funktion:
    double u;
    double d=1.0;
    cout<<"Geben Sie u ein:"<<endl;
    cin>>u;
    // e^x ist exp(x)
    double out = 1.0/(1.0+exp(-d*u));

    cout<<endl<<"sigmoid("<<u<<")="<<out<<endl<<endl;
    cout<<endl<<"Hello world!"<<endl<<endl;
    cout<<endl<<"exp(1)="<<exp(1.0)<<endl<<endl;
    cout<<endl<<"exp(0)="<<exp(0.0)<<endl<<endl;
    cout<<endl<<"exp(-10000000.0)="<<exp(-10000000.0)<<endl<<endl;
    return 0;
}

Code 0-1: Erster Schritt: Implementierung der sigmoiden Funktion.

#include <iostream>
#include <math.h>
using namespace std;

//Aufgabe: Programmieren eines künstlichen Neurons:
// 

//Wie kann man die sigmoide Funktion als C-Funktion implementieren?
double sigmoid(double d, double u)
{
    double x = 1.0/(1.0+exp(-d*u));
    return x;
}

int main(void)
{
    //Implementierung der sigmoiden Funktion:
    double u;
    double d=1.0;
    cout<<"Geben Sie u ein:"<<endl;
    cin>>u;
    // e^x ist exp(x)
    double out = 1.0/(1.0+exp(-d*u));

    double out2 = sigmoid(d,u);

    double dd = 1.0;
    double out3 = sigmoid(dd,u);

    cout<<endl<<"sigmoid("<<u<<")="<<out<<endl<<endl;
    cout<<endl<<"FUNKTION sigmoid("<<u<<")="<<out2<<endl<<endl;
    cout<<endl<<"FUNKTION out3=sigmoid("<<u<<")="<<out3<<endl<<endl;
    cout<<endl<<"Hello world!"<<endl<<endl;
    cout<<endl<<"exp(1)="<<exp(1.0)<<endl<<endl;
    cout<<endl<<"exp(0)="<<exp(0.0)<<endl<<endl;
    cout<<endl<<"exp(-10000000.0)="<<exp(-10000000.0)<<endl<<endl;
    return 0;
}

Code 0-2: Auslagerung der Berechnung in eine C-Funktion.

#include <iostream>
#include <math.h>
#define N 3
using namespace std;

//Aufgabe: Programmieren eines künstlichen Neurons:
// 

//Wie kann man die sigmoide Funktion als C-Funktion implementieren?
double sigmoid(double d, double u)
{
    double x = 1.0/(1.0+exp(-d*u));
    return x;
}

int main(void)
{
    double in[N]; //Drei Eingänge meines Neurons
    double w[] = {0.5,0.7,0.9};  //Drei Gewichte, mit denen die Eingänge gewichtet werden.
    //Der Benutzer gibt die drei Eingänge vor:
    for(int i=0;i<N;i++)
    {
        cout<<"Geben Sie Input "<<i<<" ein:";
        cin>>in[i];
        cout<<endl;
    }
    double u = 0.0;
    for(int i=0;i<N;i++)//gewichtete Summe bilden.
    {
       u = u + w[i]*in[i];
    }

    double out = sigmoid(1.0,u);

    cout<<"Bei den genannten Eingängen liefert das Neuron den Wert "<<out<<endl;    

    return 0;
}

Code 0-3: Neuron mit drei Eingängen.


Umsetzung im Unterricht.


4 Programmierung eines sehr einfachen Neuronalen Netzes


Umsetzung im Unterricht.


5 Trainieren eines sehr einfachen Neuronalen Netzes


Umsetzung im Unterricht.


ÜBUNG
Aufgabe 1
Darstellung eines einfachen neuronalen Netzes

Bild 0-1: Darstellung eines einfachen neuronalen Netzes "netz1".

  • Oben ist ein einfaches neuronales Netz dargestellt.
  • Nachfolgender C/C++-Quelltext implementiert genau dieses Netz.
  • Die Gewichte wurden so trainiert, dass das Netz brauchbar wäre, um ein logisches UND-Gatter damit umzusetzen.
  • Im Schaubild, dort in der Tabelle rechts unten sind Kombinationen von Eingängen und der resultierende Ausgang des Netzes dargestellt.

a) Vollziehen Sie nach, dass das Programm unten wirklich die Netzstruktur oben abbildet. Beachten Sie, dass im Programm die gewichteten Summen als Argument der sigmoiden Funktion eingetragen sind. Das heisst beispielsweise , der Term in[0]*w[0]+in[1]*w[1] , der die gewichtete Summe bildet wird erst ausgewertet und das Ergebnis davon dann der Funktion als Input übergeben. Man hätte das Ergebnis der gewichteten Summe auch vor der Übergabe an die Funktion in einer Hilfsvariable zwischenspeichern können. Nur würde der Quelltext dann etwas an Übersichtlichkeit und Kompaktheit verlieren.

b) Schreiben Sie das nachfolgende Programm in geeigneter Weise so um, dass geprüft wird, ob die zu den Eingängen der Tabelle oben angegebenen Ausgänge auch stimmen. Anders gesagt: Das nachfolgende Programm soll so erweitert werden, dass bestimmte Werte für in[0] und in[1] durchgespielt werden und das daraus resultierende out[2] ausgegeben wird.

#include <iostream>
#include <math.h>
using namespace std;

double sigmoid(double d, double u)
{
    double x = 1.0/(1.0+exp(-d*u));
    return x;
}

int main(void)
{
    double w[] = {-51.82,99.98,-16.26,6.34,45.94,-100.0};    
    double out[] = {0.0,0.0,0.0};    
    double in[] = {0.0,1.0};
    double D=0.1;
    //Berechnung der Ausgänge der Eingangsneuronenschicht:
    out[0] = sigmoid(D,in[0]*w[0]+in[1]*w[1]);
    out[1] = sigmoid(D,in[0]*w[2]+in[1]*w[3]);
    
    //Berechnung der Ausgänge der Ausgangsneuronenschicht:
    out[2] = sigmoid(D,out[0]*w[4]+out[1]*w[5]);

    return 0;
}

Code 0-4: netz1.cpp

Aufgabe 2

Das nachfolgende Programm liefert die folgende Konsolenausgabe:

Test einer Funktion, die wie ein logisches UND-Gatter reagiert:
false | false liefert 0
false | true  liefert 0
true  | false liefert 0
true  | true  liefert 1

Code 0-5: Konsolenausgabe.

#include <iostream>
#include <math.h>
using namespace std;

bool und(bool x, bool y)
{
    bool z;
    if(x==false && y==false)
        z=false;    
    else if(x==false && y==true)
        z=false;    
    else if(x==true && y==false)
        z=false;    
    else //if(x==true && y==true)
        z=true;
    return z;    
}

int main(void)
{
    cout<<"Test einer Funktion, die wie ein logisches UND-Gatter reagiert:"<<endl;
    cout<<"false | false liefert "<<und(false,false)<<endl;
    cout<<"false | true  liefert "<<und(false,true)<<endl;
    cout<<"true  | false liefert "<<und(true,false)<<endl;
    cout<<"true  | true  liefert "<<und(true,true)<<endl;

    return 0;
}

Code 0-6: Logisches UND-Gatter.

  • Variieren Sie das Programm so, dass ein logisches ODER-Gatter realisiert wird.
  • Wahrheitstabelle eines logischen ODER-Gatters mit zwei Eingängen:
in0 in1 out
0   0   0
0   1   1
1   0   1
1   1   1

Code 0-7: Wahrheitstabelle eines logischen ODER-Gatters mit zwei Eingängen:

Aufgabe 3
  • Ersetzen Sie das Innere der Funktion und(...) aus Aufgabe 2 so durch das neuronale Netz aus Aufgabe 1, dass nun das neuronale Netz die Aufgabe übernimmt als logisches UND-Gatter zu arbeiten.
  • Hinweis:
  • Rundet man die Ausgabe von out[2] mathematisch auf eine ganze Zahl, so ergibt sich das gewünschte UND-Gatter-Verhalten.
  • Man muss danach aber noch eine Lösung finden, die dann vorliegenden double-Werte auf Werte vom Datentyp bool zu übertragen.
Studentische Lösung zu Aufgabe 3:
#include <iostream>
#include <math.h>
using namespace std;

double sigmoid(double d, double u)
{
	double x = 1.0/(1.0+exp(-d*u));
	return x;
}

bool und(double x, double y)
{
    	double w[] = {-51.82,99.98,-16.26,6.34,45.94,-100.0};    
    	double out[] = {0.0,0.0,0.0};    
    	double D=0.1;
	bool z;
    	
	//Berechnung der Ausgänge der Eingangsneuronenschicht:
    	out[0] = sigmoid(D,x*w[0]+y*w[1]);
    	out[1] = sigmoid(D,x*w[2]+y*w[3]);
    
    	//Berechnung der Ausgänge der Ausgangsneuronenschicht:
    	out[2] = sigmoid(D,out[0]*w[4]+out[1]*w[5]);
	if(out[2]<0.5)
	{
		z = false;
	}
	else
	{
		z = true;
	}

    return z;
}

int main(void)
{
    cout<<"Test einer Funktion, die wie ein logisches UND-Gatter reagiert:"<<endl;
    cout<<"false | false liefert "<<und(0.0, 0.0)<<endl;
    cout<<"false | true  liefert "<<und(0.0, 1.0)<<endl;
    cout<<"true  | false liefert "<<und(1.0, 0.0)<<endl;
    cout<<"true  | true  liefert "<<und(1.0, 1.0)<<endl;

    return 0;
} 

Code 0-8: Studentische Lösung zu Aufgabe 3.