Project Code Start{"clazzes":[{"name":"Main","src":"NeuronalesNetz netz;\nVector[] trainingX,trainingY;\n\ndouble lernrate=0.05;\nint maxSchritte=2000;\nint anzahlVersuche=3;\n\nint anzahlTrainingsdaten=100;\n\nint[] anzahlNeuronen=new int[]{2,4,2};\nString[] antworten=new String[]{\"im Kreis\", \"außerhalb des Kreises\"};\n\nvoid main( ) {\n netz=new NeuronalesNetz(anzahlNeuronen);\n\n //Trainingsdaten:\n Random rand=new Random(100);\n trainingX=new Vector[anzahlTrainingsdaten];\n trainingY=new Vector[trainingX.length];\n for (int i = 0; i < trainingX.length; i++) {\n double x1=rand.nextDouble()*3-1.5;\n double x2=rand.nextDouble()*3-1.5;\n trainingX[i]=new Vector(2);\n trainingX[i].set(1, x1);\n trainingX[i].set(2, x2);\n trainingY[i]=new Vector(2);\n if(x1*x1+x2*x2<1){\n trainingY[i].set(1, 1);\n trainingY[i].set(2,0);\n }else{\n trainingY[i].set(1, 0);\n trainingY[i].set(2,1);\n }\n }\n System.out.println( \"Es wird ein neuronales Netz trainiert, das ...\" );\n System.out.println( \"Weiter mit beliebiger Taste\" );\n System.in.read();\n System.out.println( \"Netz wird trainiert (das dauert einen Moment)\" );\n Thread.sleep(1000);\n \n netz=training();\n\n System.out.println( );\n System.out.println( \"Training abgeschlossen\" );\n System.out.println( );\n \n //Test-Eingaben:\n while(true){\n System.out.print( \"x1 = \" );\n double x1=Double.parseDouble(System.console().readLine());\n System.out.print( \"x2 = \" );\n double x2=Double.parseDouble(System.console().readLine());\n netz.setInput(new int[]{x1,x2});\n netz.berechnen();\n double[] out=netz.getOutput();\n System.out.println( antworten[maxIndex(out)] );\n System.out.println( out );\n System.out.println( );\n }\n}\n\nint maxIndex(double[] werte){\n double max=werte[0];\n int index=0;\n for(int i=1;i
max){\n max=werte[i];\n index=i;\n }\n }\n return index;\n}\n\nNeuronalesNetz training(){\n NeuronalesNetz bestesNetz=new NeuronalesNetz(netz.getAnzahlNeuronen());\n double besteKosten=bestesNetz.berechneKosten(trainingX, trainingY);\n NeuronalesNetz testNetz=new NeuronalesNetz(netz.getAnzahlNeuronen());\n for(int i=0;i
{\n return 1 / ( 1 + Math.exp( -x ) );\n } ) );\n }\n }\n \n double berechneKosten( Vector[ ] trainingX, Vector[ ] trainingY ) {\n double c = 0;\n for ( int m = 0; m < trainingX.length; m++ ) {\n Vector x = trainingX[ m ];\n Vector y = trainingY[ m ];\n neuronen[ 0 ].setFromVector( x );\n berechnen( );\n Vector aN = neuronen[ N ];\n int nN = aN.getSize( );\n Vector diff = aN.sub( y );\n c += diff.scalarProduct( diff );\n }\n return c;\n }\n \n void setToZero( ) {\n for ( int k = 1; k <= N; k++ ) {\n gewichte[ k - 1 ].setToZero( );\n biasse[ k - 1 ].setToZero( );\n }\n }\n \n void gradientenverfahren( Vector[ ] trainingX, Vector[ ] trainingY, double lernrate, int maxSchritte ) {\n \n double kostenAlt = berechneKosten( trainingX, trainingY );\n NeuronalesNetz gradient = new NeuronalesNetz( getAnzahlNeuronen( ) );\n int p10 = maxSchritte / 10;\n for ( int i = 0; i < maxSchritte; i++ ) {\n berechneGradient( gradient, trainingX, trainingY );\n \n for ( int k = 1; k <= N; k++ ) {\n gradient.gewichte[ k - 1 ].setFromMatrix( gewichte[ k - 1 ].add( gradient.gewichte[ k - 1 ].scale( -lernrate ) ) );\n gradient.biasse[ k - 1 ].setFromVector( biasse[ k - 1 ].add( gradient.biasse[ k - 1 ].scale( -lernrate ) ) );\n }\n double kostenNeu = gradient.berechneKosten( trainingX, trainingY );\n if ( i % p10 == 0 ) System.out.println( \" \" + i + \"/\" + maxSchritte + \": \" + kostenNeu );\n if ( kostenNeu >= kostenAlt ) {\n return;\n }\n set( gradient );\n }\n }\n \n void print( String intro ) {\n System.out.println( intro );\n for ( int k = 1; k <= N; k++ ) {\n System.out.println( \" W\" + ( k ) + \"=\" + gewichte[ k - 1 ].asString( 4 ) );\n System.out.println( \" B\" + ( k ) + \"=\" + biasse[ k - 1 ].asString( 4 ) + \"\" );\n }\n }\n \n void berechneGradient( NeuronalesNetz gradient, Vector[ ] trainingX, Vector[ ] trainingY ) {\n gradient.setToZero( );\n \n Vector dCdaAlt = null;\n Vector ableitungSigmoid_kplus1 = null;\n for ( int m = 0; m < trainingX.length; m++ ) {\n Vector x = trainingX[ m ];\n Vector y = trainingY[ m ];\n neuronen[ 0 ].setFromVector( x );\n berechnen( );\n \n for ( int k = N; k >= 1; k-- ) {\n Vector ableitungSigmoid_k = z[ k - 1 ].applyFunction( ( t ) -> {\n double e = Math.exp( -t );\n return e / ( ( 1 + e ) * ( 1 + e ) );\n } );\n Matrix dW = gradient.gewichte[ k - 1 ];\n Vector dB = gradient.biasse[ k - 1 ];\n int nk = neuronen[ k ].getSize( );\n Vector akminus1 = neuronen[ k - 1 ];\n Vector dCda;\n if ( k == N ) {\n dCda = neuronen[ N ].sub( y ).scale( 2 );\n } else {\n int nkplus1 = neuronen[ k + 1 ].getSize( );\n Matrix Wkplus1 = gewichte[ k ];\n \n dCda = new Vector( nk );\n for ( int i = 1; i <= nk; i++ ) {\n double s = 0;\n for ( int l = 1; l <= nkplus1; l++ ) {\n s += ableitungSigmoid_kplus1.get( l ) * Wkplus1.get( l, i ) * dCdaAlt.get( l );\n }\n dCda.set( i, s );\n }\n }\n int nkminus1 = neuronen[ k - 1 ].getSize( );\n for ( int i = 1; i <= nk; i++ ) {\n for ( int j = 1; j <= nkminus1; j++ ) {\n double dCdw = ableitungSigmoid_k.get( i ) * akminus1.get( j ) * dCda.get( i );\n dCdw += dW.get( i, j );\n dW.set( i, j, dCdw );\n }\n double dCdb = ableitungSigmoid_k.get( i ) * dCda.get( i );\n dCdb += dB.get( i );\n dB.set( i, dCdb );\n }\n dCdaAlt = dCda;\n ableitungSigmoid_kplus1 = ableitungSigmoid_k;\n }\n }\n \n }\n}","isHidden":false}],"database":"","databaseInitCode":"","css":"","assets":false,"name":"KIKreis","description":"","theme_color":"black","background_color":"black","icon":null,"urls":["./"],"date":"2025-03-24T08:14:22.746Z","javaappVersion":"8.2.5"}Project Code Stop