Trainieren Sie ein neuronales Netzwerk, um zwischen geraden und ungeraden Zahlen zu unterscheiden

14

Frage: Ist es möglich, eine NN zu trainieren, um zwischen ungeraden und geraden Zahlen zu unterscheiden, indem nur die Zahlen selbst als Eingabe verwendet werden?

Ich habe folgenden Datensatz:

Number Target
1      0
2      1
3      0
4      1
5      0
6      1
...   ...
99     0
100    1

Ich trainierte eine NN mit zwei Eingangsneuronen (eine ist die variable Zahl, die andere ist ein Bias-Neuron), neun Neuronen in der verborgenen Schicht und einem Ausgangsneuron unter Verwendung eines sehr einfachen genetischen Algorithmus: In jeder Epoche kämpfen zwei Sätze von Gewichten " gegen einander; Derjenige mit dem höchsten Fehler verliert und wird durch eine modifizierte Version des Gewinners ersetzt.

Das Skript löst problemlos einfache Probleme wie die Operatoren AND, OR und XOR, bleibt jedoch beim Kategorisieren von ungeraden und geraden Zahlen hängen. Momentan gelang es ihr am besten, 53 von 100 Nummern zu identifizieren, und das dauerte mehrere Stunden. Ob ich normalisiere oder nicht, scheint keinen Unterschied zu machen.

Wenn ich schummeln wollte, konnte ich die Daten einfach vorverarbeiten und% 2 als Eingabe an den NN weiterleiten, aber das möchte ich nicht. NN sollte in der Lage sein, jede Funktion zu approximieren, einschließlich des Modulo-Operators ( glaube ich ). Was mache ich falsch?

Edgar Derby
quelle
1
Es scheint, dass Sie versuchen, die "Mod" -Funktion mit einem neuronalen Netzwerk zu approximieren. Dies ist eine meiner Lieblingsklassen von Problemen - "wann ist es das Richtige, ein Huhn als Kugel zu betrachten". Finite-Elemente-Modelle sind ein großartiger Ort dafür. Wenn ich dies von einem neuronalen Netzwerk verlange, denke ich gerne in Begriffen von "Basis". Wir wissen, dass die genaue Antwort Division durch 2 und Trunkierung enthält, während das klassische Netzwerk Vektormultiplikation und Sigmoidfunktionen ist. NNs werden am besten für die Interpolation und nicht für die Extrapolation verwendet. Ist Ihre Domain also begrenzt?
EngrStudent - Wiedereinsetzung von Monica
4
Ich denke, Ihre Frage geht tiefer als die derzeit akzeptierte Antwort. Betrachten Sie die folgende Verallgemeinerung: Konstruieren Sie ein neuronales Netzwerk (wobei Sie nur Operationen verwenden, von denen erwartet werden kann, dass sie im Gehirn auftreten), das n mod k berechnet, wobei n und k seine Eingaben sind. Ich frage mich, ob dies mit einem Feedforward-Netzwerk fester Größe möglich ist.
user66081

Antworten:

7

Wie bei jeder maschinellen Lernaufgabe spielt die Darstellung Ihrer Eingaben eine entscheidende Rolle für das Lernen und die Verallgemeinerung.

Ich denke, das Problem mit der Darstellung ist, dass die Funktion (Modulo) in der Eingabedarstellung, die Sie für dieses Problem gewählt haben, stark nichtlinear und nicht glatt ist.

Ich würde folgendes versuchen:

  1. Versuchen Sie einen besseren Lernalgorithmus (Backpropagation / Gradientenabstieg und seine Varianten).

  2. Versuchen Sie, die Zahlen in Binärform mit einer festen Längengenauigkeit darzustellen.

  3. Wenn Ihre Eingabedarstellung eine B-Bit-Zahl ist, würde ich sicherstellen, dass Ihr Trainingssatz nicht auf kleine oder große Zahlen ausgerichtet ist. Zahlen haben, die einheitlich und unabhängig voneinander zufällig aus dem Bereich .[0,2b-1]

  4. Verwenden Sie, wie Sie es getan haben, ein mehrschichtiges Netzwerk (versuchen Sie zuerst 2 Schichten: dh versteckte + Ausgabe, bevor Sie mehr Schichten verwenden).

  5. Verwenden Sie ein separates Training + Test-Set. Bewerten Sie nicht Ihre Leistung auf dem Trainingssatz.

Vimal
quelle
Ich dachte, dass eine Transformation der Eingaben wie die Berechnung des natürlichen Logarithmus wertvoll sein könnte.
EngrStudent - Wiedereinsetzung von Monica
Es könnte. In der Tat, wenn man die Antwort hier kennt (Modulo 2 ist nur das letzte Bit), würde die binäre Darstellung der rohen Zahl sehr gut funktionieren. Verbinden Sie einfach das letzte Bit des Eingangs mit dem Ausgang. :) Es wäre interessant zu sehen, ob Modulo (nicht-Potenz-2) gut mit einem neuronalen Netzwerk funktioniert. Es funktioniert möglicherweise nicht so gut.
Vimal,
Hallo @Vimal, danke für die Antwort. Wissen Sie, ob es immer eine gute Idee ist, die Eingänge in Binärform darzustellen, oder ob es gerade in diesem speziellen Fall hilfreich ist?
Edgar Derby
@AnnoysParrot - es gibt keine "silbernen Kugeln". Es gibt keine einheitliche universelle beste Darstellung, weil das Beste verschiedene und sich gegenseitig ausschließende Dinge bedeuten kann. Die binäre Darstellung ist in diesem Fall nützlich, aber es gibt viele, bei denen dies nicht der Fall ist. Erwägen Sie ein vertieftes Lernen in Bezug auf visuelle Daten. Wenn Sie ein separates Eingangsneuron für jedes einzelne Eingangsbit hätten, würden Sie ungefähr 256 * 5,2 Millionen Eingänge für ein 5-Megapixel-Bild benötigen.
EngrStudent
2
Stimmen Sie mit @EngrStudent hier überein. Viele Vorkenntnisse fließen in das Entwerfen einer geeigneten Eingabedarstellung und auch der neuronalen Netzwerktopologie selbst ein. Da ein neuronales Netzwerk in etwa ein kontinuierliches, differenzierbares Äquivalent einer digitalen Schaltung ist, können Sie die Topologie des Netzwerks anpassen, indem Sie sich für Addition / Multiplikation / Division / Modulo / etc. Von digitalen Schaltungen inspirieren lassen. Diese vorherige Topologie (anstelle einer vollständig verbundenen Ebene) kann zu einem schnelleren Training, einer besseren Verallgemeinerung usw. führen, ähnlich wie es Convnets für natürliche Bilder gut funktionierten.
Vimal
6

Das Klassifizieren von ungeraden und geraden Zahlen ist ein schwieriges Problem. Ein einfaches Muster wiederholt sich unendlich oft. 2,4,6,8 ..... 1,3,5,7 .....

Nichtlineare Aktivierungsfunktionen wie sin (x) und cos (x) verhalten sich ähnlich. Wenn Sie also Ihre Neuronen so ändern, dass sie sin und cos anstelle beliebter Aktivierungsfunktionen wie tanh oder relu implementieren, können Sie dieses Problem vermutlich ziemlich einfach mit einem einzigen Neuron lösen.

Lineare Transformationen gehen immer nichtlinearen Transformationen voraus. Daher lernt ein einzelnes Neuron am Ende sin (ax + b), das für die richtige Kombination von a & b alternativ Nullen und Einsen in der gewünschten Frequenz ausgibt, die in diesem Fall 1 ist.

Ich habe noch nie zuvor Sünde oder Lattich in meinen neuronalen Netzen versucht. Also, entschuldigen Sie, wenn es am Ende eine sehr schlechte Idee ist.

Vignesh Sk
quelle
5

Also arbeite ich gerade mit neuronalen Netzen und bin auf dasselbe Problem gestoßen wie Sie. Am Ende habe ich die eingegebene Zahl als Array mit Werten dargestellt, die der binären Darstellung der Zahl entsprechen. Seit wir klassifizieren, habe ich meine Ausgabe als Array dargestellt, nicht als einzelner Wert. Ex:

input = [
  [0, 0, 0, 1], // 1
  [0, 0, 1, 0], // 2
  [0, 0, 1, 1], // 3
  [0, 1, 0, 0]  // 4
]
output = [
  [1, 0], // odd
  [0, 1], // even
  [1, 0], // odd
  [0, 1]  // even
]

Hoffe das hilft!

William Gottschalk
quelle
1
Genau basierend auf Ihrer Antwort habe ich das Modell hier erstellt. Stackoverflow.com/questions/53671491/…
prosti
Hervorragend! Dies zeigt, wie wichtig die Darstellung von Daten für jeden ML-Algorithmus ist. Wenn ich die Dezimaldarstellung verwendet habe, erhalte ich eine Genauigkeit von genau 50%, aber nach dieser Idee erhalte ich auch bei unsichtbaren Daten eine Genauigkeit von 100%. Vielen Dank. Hier ist die Implementierung: colab.research.google.com/drive/…
Kaushal28
2
In binären Zahlen enden gerade Zahlen immer mit 0 und ungerade Zahlen enden immer mit 1. Es ist nicht verwunderlich, dass das Modell funktioniert, da es wahrscheinlich gerade erst gelernt hat, den Wert der letzten Ziffer auszuspucken.
Syncrossus
2

Ich komme hierher, wo ich mit ähnlichen Problemen zu kämpfen hatte. Also schreibe ich, was ich geschafft habe.

Soweit ich weiß, kann Perceptron mit einer Schicht jedes Problem lösen, das am Ende vereinfacht werden kann, um Objekte in einer beliebigen Geometrie mit Hilfe einer geraden Linie zu unterteilen. Und das ist ein solches Problem. Wenn Sie das letzte Bit der Binärdarstellung auf Papier zeichnen, können Sie auch eine Linie zeichnen, und alle ungeraden Zahlen befinden sich auf der einen Seite und die geraden auf der anderen Seite. Aus dem gleichen Grund ist es unmöglich, ein Problem mit einem einschichtigen Netzwerk zu lösen.

In Ordnung. Dieses Problem sieht sehr einfach aus, nehmen wir also den Heaviside-Schritt als Aktivierungsfunktion. Nachdem ich ein bisschen mit meiner Nummer gespielt hatte, wurde mir klar, dass das Problem hier voreingenommen ist. Ich google ein wenig, und was ich festgestellt habe, ist, dass, wenn Sie bei der Geometriedarstellung bleiben, die Abweichung es Ihnen ermöglicht, den Aktivierungsort im Koordinatensystem zu ändern.

Sehr pädagogisches Problem

user3486361
quelle
1

Es ist bekannt, dass Logikgatter NICHT, UND, ODER alle mit sehr einfachen neuronalen Netzen (NN) durchgeführt werden können und dass Sie einen vollständigen arithmetischen Taschenrechner mit Logikgattern unter Verwendung von Binärzahlen als Eingabe erstellen können. Daher sollten Sie in der Lage sein, eine NN zu erstellen, um n modulo k für alle in Basis 2 ausgedrückten n- und k-Zahlen zu berechnen.

Wenn Sie n modulo k für eine feste k-Zahl berechnen möchten (zum Beispiel k = 4), können Sie tatsächlich eine äußerst einfache NN erstellen, die dies bewirkt: Drücken Sie die Eingabezahl n in der Basis k aus und ignorieren Sie alle Ziffern mit Ausnahme des niedrigsten Rangs Ziffer, und Sie haben die Antwort!

Bernard Montaron
quelle
0

Eine Idee, die der Verwendung von explizitem "mod 2" in der Eingabe entgeht, könnte darin bestehen, die Zahl als eine Folge von Pixeln zu codieren, wobei das Problem darin besteht, zu erkennen, ob das Segment in zwei gleiche Segmente aufgeteilt werden kann. Dies ist ein Bildverarbeitungsproblem, das von herkömmlichen Netzwerken gelernt werden kann.

Wenn die Zahl hingegen als Gleitkommazahl gespeichert ist, wird die Frage reduziert (oder verallgemeinert), um zu erkennen, wann eine Gleitkommazahl ungefähr eine Ganzzahl ist.

arivero
quelle
Interessanter Gedanke. Können Sie näher erläutern, wie Sie die Zahl in Pixel umwandeln möchten?
Jan Kukacka
Nun, denke "Basis 1". Zeichnen Sie zum Kodieren von n einen schwarzen Balken mit n Pixeln. Ich vermute, dass Faltungskerne den Unterschied zwischen einer ungeraden und einer geraden Pixelanzahl bemerken werden.
Arivero
0

Ich habe ein solches Netzwerk in hier .

Die Vertretung von William Gottschalk war die Grundlage.

Es wird nur 1 Neuron in der ersten ausgeblendeten Ebene mit 32 Eingängen verwendet. Die Ausgabeschicht hat nur 2 Neuronen für die One-Hot-Codierung von 0 und 1.

prosti
quelle
0

Meine Lösung

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 2 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 2:{}'.format(x, y_hat == 0))

Eingabe: 1001, durch 2 teilen: Falsche Eingabe: 1002, durch 2 teilen: Wahre Eingabe: 1003, durch 2 teilen: Falsche Eingabe: 1004, durch 2 teilen: Wahre Eingabe: 1005, durch 2 teilen: Falsche Eingabe: 1006, teilen durch 2: Wahre Eingabe: 1007, durch 2 teilen: Falsche Eingabe: 1008, durch 2 teilen: Wahre Eingabe: 1009, durch 2 teilen: Falsche Eingabe: 1010, durch 2 teilen: Wahre Eingabe: 1011, durch 2 teilen: Falsche Eingabe : 1012, dividieren durch 2: Wahre Eingabe: 1013, dividieren durch 2: Falsche Eingabe: 1014, dividieren durch 2: Wahre Eingabe: 1015, dividieren durch 2: Falsche Eingabe: 1016, dividieren durch 2: Wahre Eingabe: 1017, dividieren durch 2: Falscheingabe: 1018, durch 2 teilen: Wahreingabe: 1019, durch 2 teilen: Falscheingabe: 1020, durch 2 teilen: Wahreingabe: 1021, durch 2 teilen: Falscheingabe: 1022, durch 2 teilen: Wahreingabe: 1023, durch 2 teilen: Falsche Eingabe: 1024, durch 2 teilen: Wahre Eingabe: 1025, durch 2 teilen: Falsche Eingabe: 1026, durch 2 teilen: Wahre Eingabe: 1027, durch 2 teilen: Falsche Eingabe: 1028, durch 2 teilen : True input: 1029, dividieren durch 2:Falsche Eingabe: 1030, durch 2 teilen: Wahre Eingabe: 1031, durch 2 teilen: Falsche Eingabe: 1032, durch 2 teilen: Wahre Eingabe: 1033, durch 2 teilen: Falsche Eingabe: 1034, durch 2 teilen: Wahre Eingabe: 1035, Teilen durch 2: Falsche Eingabe: 1036, Teilen durch 2: Wahre Eingabe: 1037, Teilen durch 2: Falsche Eingabe: 1038, Teilen durch 2: Wahre Eingabe: 1039, Teilen durch 2: Falsche Eingabe: 1040, Teilen durch 2: Richtig Eingabe: 1041, durch 2 teilen: Falsche Eingabe: 1042, durch 2 teilen: Wahre Eingabe: 1043, durch 2 teilen: Falsche Eingabe: 1044, durch 2 teilen: Wahre Eingabe: 1045, durch 2 teilen: Falsche Eingabe: 1046, teilen durch 2: Wahre Eingabe: 1047, durch 2 teilen: Falsche Eingabe: 1048, durch 2 teilen: Wahre Eingabe: 1049, durch 2 teilen: Falsche Eingabe: 1050, durch 2 teilen: Wahre Eingabe: 1051, durch 2 teilen: Falsche Eingabe : 1052, dividieren durch 2: Wahre Eingabe: 1053, dividieren durch 2: Falsche Eingabe: 1054, dividieren durch 2: Wahre Eingabe: 1055, dividieren durch 2: Falsche Eingabe: 1056, dividieren durch 2: Wahre Eingabe: 1057, dividieren durch 2: Falscheingabe: 1058, dividiert durch 2:Wahre Eingabe: 1059, durch 2 teilen: Falsche Eingabe: 1060, durch 2 teilen: Wahre Eingabe: 1061, durch 2 teilen: Falsche Eingabe: 1062, durch 2 teilen: Wahre Eingabe: 1063, durch 2 teilen: Falsche Eingabe: 1064, Teilen durch 2: Wahre Eingabe: 1065, Teilen durch 2: Falsche Eingabe: 1066, Teilen durch 2: Wahre Eingabe: 1067, Teilen durch 2: Falsche Eingabe: 1068, Teilen durch 2: Wahre Eingabe: 1069, Teilen durch 2: Falsche Eingabe: 1070, durch 2 teilen: Wahre Eingabe: 1071, durch 2 teilen: Falsche Eingabe: 1072, durch 2 teilen: Wahre Eingabe: 1073, durch 2 teilen: Falsche Eingabe: 1074, durch 2 teilen: Wahre Eingabe: 1075, teilen durch 2: Falscheingabe: 1076, durch 2 teilen: Wahreingabe: 1077, durch 2 teilen: Falscheingabe: 1078, durch 2 teilen: Wahreingabe: 1079, durch 2 teilen: Falscheingabe: 1080, durch 2 teilen: Wahreingabe : 1081, durch 2 teilen: Falscheingabe: 1082, durch 2 teilen: Wahreingabe: 1083, durch 2 teilen: Falscheingabe: 1084, durch 2 teilen: Wahreingabe: 1085, durch 2 teilen: Falscheingabe: 1086, durch 2 teilen 2: Echteingabe: 1087, dividieren durch 2:Falsche Eingabe: 1088, durch 2 teilen: Wahre Eingabe: 1089, durch 2 teilen: Falsche Eingabe: 1090, durch 2 teilen: Wahre Eingabe: 1091, durch 2 teilen: Falsche Eingabe: 1092, durch 2 teilen: Wahre Eingabe: 1093, Teilen durch 2: Falsche Eingabe: 1094, Teilen durch 2: Wahre Eingabe: 1095, Teilen durch 2: Falsche Eingabe: 1096, Teilen durch 2: Wahre Eingabe: 1097, Teilen durch 2: Falsche Eingabe: 1098, Teilen durch 2: Richtig Eingabe: 1099, durch 2 teilen: Falsche Eingabe: 1100, durch 2 teilen: Wahre Eingabe: 1101, durch 2 teilen: Falsche Eingabe: 1102, durch 2 teilen: Wahre Eingabe: 1103, durch 2 teilen: Falsche Eingabe: 1104, teilen durch 2: Wahre Eingabe: 1105, durch 2 teilen: Falsche Eingabe: 1106, durch 2 teilen: Wahre Eingabe: 1107, durch 2 teilen: Falsche Eingabe: 1108, durch 2 teilen: Wahre Eingabe: 1109, durch 2 teilen: Falsche Eingabe : 1110, dividieren durch 2: Wahre Eingabe: 1111, dividieren durch 2: Falsche Eingabe: 1112, dividieren durch 2: Wahre Eingabe: 1113, dividieren durch 2: Falsche Eingabe: 1114, dividieren durch 2: Wahre Eingabe: 1115, dividieren durch 2: Falscheingabe: 1116, dividiert durch 2:Wahre Eingabe: 1117, durch 2 teilen: Falsche Eingabe: 1118, durch 2 teilen: Wahre Eingabe: 1119, durch 2 teilen: Falsche Eingabe: 1120, durch 2 teilen: Wahre Eingabe: 1121, durch 2 teilen: Falsche Eingabe: 1122, Teilen durch 2: Wahre Eingabe: 1123, Teilen durch 2: Falsche Eingabe: 1124, Teilen durch 2: Wahre Eingabe: 1125, Teilen durch 2: Falsche Eingabe: 1126, Teilen durch 2: Wahre Eingabe: 1127, Teilen durch 2: Falsche Eingabe: 1128, durch 2 teilen: Wahre Eingabe: 1129, durch 2 teilen: Falsche Eingabe: 1130, durch 2 teilen: Wahre Eingabe: 1131, durch 2 teilen: Falsche Eingabe: 1132, durch 2 teilen: Wahre Eingabe: 1133, teilen durch 2: Falscheingabe: 1134, durch 2 teilen: Wahreingabe: 1135, durch 2 teilen: Falscheingabe: 1136, durch 2 teilen: Wahreingabe: 1137, durch 2 teilen: Falscheingabe: 1138, durch 2 teilen: Wahreingabe : 1139, dividieren durch 2: Falscheingabe: 1140, dividieren durch 2: Wahreingabe: 1141, dividieren durch 2: Falscheingabe: 1142, dividieren durch 2: Wahreingabe: 1143, dividieren durch 2: Falscheingabe: 1144, dividieren durch 2: Echteingabe: 1145, durch 2 teilen:Falsche Eingabe: 1146, durch 2 teilen: Wahre Eingabe: 1147, durch 2 teilen: Falsche Eingabe: 1148, durch 2 teilen: Wahre Eingabe: 1149, durch 2 teilen: Falsche Eingabe: 1150, durch 2 teilen: Wahre Eingabe: 1151, Teilen durch 2: Falsche Eingabe: 1152, Teilen durch 2: Wahre Eingabe: 1153, Teilen durch 2: Falsche Eingabe: 1154, Teilen durch 2: Wahre Eingabe: 1155, Teilen durch 2: Falsche Eingabe: 1156, Teilen durch 2: Richtig Eingabe: 1157, Teilen durch 2: Falsche Eingabe: 1158, Teilen durch 2: Wahre Eingabe: 1159, Teilen durch 2: Falsche Eingabe: 1160, Teilen durch 2: Wahre Eingabe: 1161, Teilen durch 2: Falsche Eingabe: 1162, Teilen durch 2: Wahre Eingabe: 1163, durch 2 teilen: Falsche Eingabe: 1164, durch 2 teilen: Wahre Eingabe: 1165, durch 2 teilen: Falsche Eingabe: 1166, durch 2 teilen: Wahre Eingabe: 1167, durch 2 teilen: Falsche Eingabe : 1168, dividieren durch 2: Wahre Eingabe: 1169, dividieren durch 2: Falsche Eingabe: 1170, dividieren durch 2: Wahre Eingabe: 1171, dividieren durch 2: Falsche Eingabe: 1172, dividieren durch 2: Wahre Eingabe: 1173, dividieren durch 2: Falscheingabe: 1174, dividiert durch 2:Wahre Eingabe: 1175, durch 2 teilen: Falsche Eingabe: 1176, durch 2 teilen: Wahre Eingabe: 1177, durch 2 teilen: Falsche Eingabe: 1178, durch 2 teilen: Wahre Eingabe: 1179, durch 2 teilen: Falsche Eingabe: 1180, Teilen durch 2: Wahre Eingabe: 1181, Teilen durch 2: Falsche Eingabe: 1182, Teilen durch 2: Wahre Eingabe: 1183, Teilen durch 2: Falsche Eingabe: 1184, Teilen durch 2: Wahre Eingabe: 1185, Teilen durch 2: Falsche Eingabe: 1186, durch 2 teilen: Wahre Eingabe: 1187, durch 2 teilen: Falsche Eingabe: 1188, durch 2 teilen: Wahre Eingabe: 1189, durch 2 teilen: Falsche Eingabe: 1190, durch 2 teilen: Wahre Eingabe: 1191, teilen durch 2: Falscheingabe: 1192, durch 2 teilen: Wahreingabe: 1193, durch 2 teilen: Falscheingabe: 1194, durch 2 teilen: Wahreingabe: 1195, durch 2 teilen: Falscheingabe: 1196, durch 2 teilen: Wahreingabe : 1197, durch 2 teilen: Falscheingabe: 1198, durch 2 teilen: Wahreingabe: 1199, durch 2 teilen: FalscheingabeWahre Eingabe: 1179, durch 2 teilen: Falsche Eingabe: 1180, durch 2 teilen: Wahre Eingabe: 1181, durch 2 teilen: Falsche Eingabe: 1182, durch 2 teilen: Wahre Eingabe: 1183, durch 2 teilen: Falsche Eingabe: 1184, Teilen durch 2: Wahre Eingabe: 1185, Teilen durch 2: Falsche Eingabe: 1186, Teilen durch 2: Wahre Eingabe: 1187, Teilen durch 2: Falsche Eingabe: 1188, Teilen durch 2: Wahre Eingabe: 1189, Teilen durch 2: Falsche Eingabe: 1190, durch 2 teilen: Wahre Eingabe: 1191, durch 2 teilen: Falsche Eingabe: 1192, durch 2 teilen: Wahre Eingabe: 1193, durch 2 teilen: Falsche Eingabe: 1194, durch 2 teilen: Wahre Eingabe: 1195, teilen durch 2: Falsche Eingabe: 1196, durch 2 teilen: Wahre Eingabe: 1197, durch 2 teilen: Falsche Eingabe: 1198, durch 2 teilen: Wahre Eingabe: 1199, durch 2 teilen: FalscheWahre Eingabe: 1179, durch 2 teilen: Falsche Eingabe: 1180, durch 2 teilen: Wahre Eingabe: 1181, durch 2 teilen: Falsche Eingabe: 1182, durch 2 teilen: Wahre Eingabe: 1183, durch 2 teilen: Falsche Eingabe: 1184, Teilen durch 2: Wahre Eingabe: 1185, Teilen durch 2: Falsche Eingabe: 1186, Teilen durch 2: Wahre Eingabe: 1187, Teilen durch 2: Falsche Eingabe: 1188, Teilen durch 2: Wahre Eingabe: 1189, Teilen durch 2: Falsche Eingabe: 1190, durch 2 teilen: Wahre Eingabe: 1191, durch 2 teilen: Falsche Eingabe: 1192, durch 2 teilen: Wahre Eingabe: 1193, durch 2 teilen: Falsche Eingabe: 1194, durch 2 teilen: Wahre Eingabe: 1195, teilen durch 2: Falsche Eingabe: 1196, durch 2 teilen: Wahre Eingabe: 1197, durch 2 teilen: Falsche Eingabe: 1198, durch 2 teilen: Wahre Eingabe: 1199, durch 2 teilen: FalscheWahre Eingabe: 1187, durch 2 teilen: Falsche Eingabe: 1188, durch 2 teilen: Wahre Eingabe: 1189, durch 2 teilen: Falsche Eingabe: 1190, durch 2 teilen: Wahre Eingabe: 1191, durch 2 teilen: Falsche Eingabe: 1192, Teilen durch 2: Wahre Eingabe: 1193, Teilen durch 2: Falsche Eingabe: 1194, Teilen durch 2: Wahre Eingabe: 1195, Teilen durch 2: Falsche Eingabe: 1196, Teilen durch 2: Wahre Eingabe: 1197, Teilen durch 2: Falsche Eingabe: 1198, durch 2 teilen: True Eingabe: 1199, durch 2 teilen: FalseWahre Eingabe: 1187, durch 2 teilen: Falsche Eingabe: 1188, durch 2 teilen: Wahre Eingabe: 1189, durch 2 teilen: Falsche Eingabe: 1190, durch 2 teilen: Wahre Eingabe: 1191, durch 2 teilen: Falsche Eingabe: 1192, Teilen durch 2: Wahre Eingabe: 1193, Teilen durch 2: Falsche Eingabe: 1194, Teilen durch 2: Wahre Eingabe: 1195, Teilen durch 2: Falsche Eingabe: 1196, Teilen durch 2: Wahre Eingabe: 1197, Teilen durch 2: Falsche Eingabe: 1198, durch 2 teilen: True Eingabe: 1199, durch 2 teilen: False


Darüber hinaus ist auch eine Division durch andere Zahlen (z. B. 7) gut:

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 7 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 7:{}'.format(x, y_hat == 0))

Eingabe: 1001, Teilen durch 7: Richtige Eingabe: 1002, Teilen durch 7: Falsche Eingabe: 1003, Teilen durch 7: Falsche Eingabe: 1004, Teilen durch 7: Falsche Eingabe: 1005, Teilen durch 7: Falsche Eingabe: 1006, Teilen durch 7: Falscheingabe: 1007, Teilen durch 7: Falscheingabe: 1008, Teilen durch 7: Wahreingabe: 1009, Teilen durch 7: Falscheingabe: 1010, Teilen durch 7: Falscheingabe: 1011, Teilen durch 7: Falscheingabe : 1012, dividieren durch 7: Falscheingabe: 1013, dividieren durch 7: Falscheingabe: 1014, dividieren durch 7: Falscheingabe: 1015, dividieren durch 7: Wahreingabe: 1016, dividieren durch 7: Falscheingabe: 1017, dividieren durch 7: Falscheingabe: 1018, Teilen durch 7: Falscheingabe: 1019, Teilen durch 7: Falscheingabe: 1020, Teilen durch 7: Falscheingabe: 1021, Teilen durch 7: Falscheingabe: 1022, Teilen durch 7: Wahreingabe: 1023, durch 7 teilen: Falscheingabe: 1024, durch 7 teilen: Falscheingabe: 1025, durch 7 teilen: Falscheingabe: 1026, durch 7 teilen: Falscheingabe: 1027, durch 7 teilen: Falscheingabe: 1028, durch 7 teilen : Falsche Eingabe: 1029, durch 7 teilen:Wahre Eingabe: 1030, Teilen durch 7: Falsche Eingabe: 1031, Teilen durch 7: Falsche Eingabe: 1032, Teilen durch 7: Falsche Eingabe: 1033, Teilen durch 7: Falsche Eingabe: 1034, Teilen durch 7: Falsche Eingabe: 1035, Teilen durch 7: Falsche Eingabe: 1036, Teilen durch 7: Wahre Eingabe: 1037, Teilen durch 7: Falsche Eingabe: 1038, Teilen durch 7: Falsche Eingabe: 1039, Teilen durch 7: Falsche Eingabe: 1040, Teilen durch 7: Falsche Eingabe: 1041, Teilen durch 7: Falsche Eingabe: 1042, Teilen durch 7: Falsche Eingabe: 1043, Teilen durch 7: Wahre Eingabe: 1044, Teilen durch 7: Falsche Eingabe: 1045, Teilen durch 7: Falsche Eingabe: 1046, Teilen durch 7: Falscheingabe: 1047, Teilen durch 7: Falscheingabe: 1048, Teilen durch 7: Falscheingabe: 1049, Teilen durch 7: Falscheingabe: 1050, Teilen durch 7: Wahreingabe: 1051, Teilen durch 7: Falscheingabe : 1052, dividieren durch 7: Falscheingabe: 1053, dividieren durch 7: Falscheingabe: 1054, dividieren durch 7: Falscheingabe: 1055, dividieren durch 7: Falscheingabe: 1056, dividieren durch 7: Falscheingabe: 1057, dividieren durch 7: Echteingabe: 1058,Teilen durch 7: Falsche Eingabe: 1059, Teilen durch 7: Falsche Eingabe: 1060, Teilen durch 7: Falsche Eingabe: 1061, Teilen durch 7: Falsche Eingabe: 1062, Teilen durch 7: Falsche Eingabe: 1063, Teilen durch 7: Falsche Eingabe: 1064, Teilen durch 7: Richtige Eingabe: 1065, Teilen durch 7: Falsche Eingabe: 1066, Teilen durch 7: Falsche Eingabe: 1067, Teilen durch 7: Falsche Eingabe: 1068, Teilen durch 7: Falsche Eingabe: 1069, Teilen durch 7: Falscheingabe: 1070, Teilen durch 7: Falscheingabe: 1071, Teilen durch 7: Wahreingabe: 1072, Teilen durch 7: Falscheingabe: 1073, Teilen durch 7: Falscheingabe: 1074, Teilen durch 7: Falscheingabe : 1075, dividieren durch 7: Falscheingabe: 1076, dividieren durch 7: Falscheingabe: 1077, dividieren durch 7: Falscheingabe: 1078, dividieren durch 7: Wahreingabe: 1079, dividieren durch 7: Falscheingabe: 1080, dividieren durch 7: Falsche Eingabe: 1081, Teilen durch 7: Falsche Eingabe: 1082, Teilen durch 7: Falsche Eingabe: 1083, Teilen durch 7: Falsche Eingabe: 1084, Teilen durch 7: Falsche Eingabe: 1085, Teilen durch 7: Wahre Eingabe: 1086, dividiere durch 7:Falsche Eingabe: 1087, Teilen durch 7: Falsche Eingabe: 1088, Teilen durch 7: Falsche Eingabe: 1089, Teilen durch 7: Falsche Eingabe: 1090, Teilen durch 7: Falsche Eingabe: 1091, Teilen durch 7: Falsche Eingabe: 1092, Teilen durch 7: Richtige Eingabe: 1093, Teilen durch 7: Falsche Eingabe: 1094, Teilen durch 7: Falsche Eingabe: 1095, Teilen durch 7: Falsche Eingabe: 1096, Teilen durch 7: Falsche Eingabe: 1097, Teilen durch 7: Falsche Eingabe: 1098, Teilen durch 7: Falsche Eingabe: 1099, Teilen durch 7: Wahre Eingabe: 1100, Teilen durch 7: Falsche Eingabe: 1101, Teilen durch 7: Falsche Eingabe: 1102, Teilen durch 7: Falsche Eingabe: 1103, Teilen durch 7: Falscheingabe: 1104, Teilen durch 7: Falscheingabe: 1105, Teilen durch 7: Falscheingabe: 1106, Teilen durch 7: Wahreingabe: 1107, Teilen durch 7: Falscheingabe: 1108, Teilen durch 7: Falscheingabe : 1109, dividieren durch 7: Falscheingabe: 1110, dividieren durch 7: Falscheingabe: 1111, dividieren durch 7: Falscheingabe: 1112, dividieren durch 7: Falscheingabe: 1113, dividieren durch 7: Wahreingabe: 1114, dividieren durch 7: Falscheingabe: 1115,Teilen durch 7: Falsche Eingabe: 1116, Teilen durch 7: Falsche Eingabe: 1117, Teilen durch 7: Falsche Eingabe: 1118, Teilen durch 7: Falsche Eingabe: 1119, Teilen durch 7: Falsche Eingabe: 1120, Teilen durch 7: Richtig Eingabe: 1121, Teilen durch 7: Falsche Eingabe: 1122, Teilen durch 7: Falsche Eingabe: 1123, Teilen durch 7: Falsche Eingabe: 1124, Teilen durch 7: Falsche Eingabe: 1125, Teilen durch 7: Falsche Eingabe: 1126, Teilen durch 7: Falscheingabe: 1127, Teilen durch 7: Wahreingabe: 1128, Teilen durch 7: Falscheingabe: 1129, Teilen durch 7: Falscheingabe: 1130, Teilen durch 7: Falscheingabe: 1131, Teilen durch 7: Falscheingabe : 1132, dividieren durch 7: Falscheingabe: 1133, dividieren durch 7: Falscheingabe: 1134, dividieren durch 7: Wahreingabe: 1135, dividieren durch 7: Falscheingabe: 1136, dividieren durch 7: Falscheingabe: 1137, dividieren durch 7: Falsche Eingabe: 1138, Teilen durch 7: Falsche Eingabe: 1139, Teilen durch 7: Falsche Eingabe: 1140, Teilen durch 7: Falsche Eingabe: 1141, Teilen durch 7: Wahre Eingabe: 1142, Teilen durch 7: Falsche Eingabe: 1143, dividiere durch 7: Falsche Eingabe:1144, Teilen durch 7: Falsche Eingabe: 1145, Teilen durch 7: Falsche Eingabe: 1146, Teilen durch 7: Falsche Eingabe: 1147, Teilen durch 7: Falsche Eingabe: 1148, Teilen durch 7: Wahre Eingabe: 1149, Teilen durch 7 : Falsche Eingabe: 1150, Teilen durch 7: Falsche Eingabe: 1151, Teilen durch 7: Falsche Eingabe: 1152, Teilen durch 7: Falsche Eingabe: 1153, Teilen durch 7: Falsche Eingabe: 1154, Teilen durch 7: Falsche Eingabe: 1155 , durch 7 teilen: Wahre Eingabe: 1156, durch 7 teilen: Falsche Eingabe: 1157, durch 7 teilen: Falsche Eingabe: 1158, durch 7 teilen: Falsche Eingabe: 1159, durch 7 teilen: Falsche Eingabe: 1160, durch 7 teilen: Falsche Eingabe: 1161, Teilen durch 7: Falsche Eingabe: 1162, Teilen durch 7: Wahre Eingabe: 1163, Teilen durch 7: Falsche Eingabe: 1164, Teilen durch 7: Falsche Eingabe: 1165, Teilen durch 7: Falsche Eingabe: 1166, Teilen durch 7: Falsche Eingabe: 1167, Teilen durch 7: Falsche Eingabe: 1168, Teilen durch 7: Falsche Eingabe: 1169, Teilen durch 7: Wahre Eingabe: 1170, Teilen durch 7: Falsche Eingabe: 1171, Teilen durch 7: Falsche Eingabe Eingabe: 1172, Teilen durch 7:Falsche Eingabe: 1173, Teilen durch 7: Falsche Eingabe: 1174, Teilen durch 7: Falsche Eingabe: 1175, Teilen durch 7: Falsche Eingabe: 1176, Teilen durch 7: Wahre Eingabe: 1177, Teilen durch 7: Falsche Eingabe: 1178, Teilen durch 7: Falsche Eingabe: 1179, Teilen durch 7: Falsche Eingabe: 1180, Teilen durch 7: Falsche Eingabe: 1181, Teilen durch 7: Falsche Eingabe: 1182, Teilen durch 7: Falsche Eingabe: 1183, Teilen durch 7: Richtig Eingabe: 1184, Teilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falsche Eingabe: 1186, Teilen durch 7: Falsche Eingabe: 1187, Teilen durch 7: Falsche Eingabe: 1188, Teilen durch 7: Falsche Eingabe: 1189, Teilen durch 7: Falscheingabe: 1190, Teilen durch 7: Wahreingabe: 1191, Teilen durch 7: Falscheingabe: 1192, Teilen durch 7: Falscheingabe: 1193, Teilen durch 7: Falscheingabe: 1194, Teilen durch 7: Falscheingabe : 1195, durch 7 teilen: Falscheingabe: 1196, durch 7 teilen: Falscheingabe: 1197, durch 7 teilen: Wahreingabe: 1198, durch 7 teilen: Falscheingabe: 1199, durch 7 teilen: FalscheingabeTeilen durch 7: Falsche Eingabe: 1175, Teilen durch 7: Falsche Eingabe: 1176, Teilen durch 7: Wahre Eingabe: 1177, Teilen durch 7: Falsche Eingabe: 1178, Teilen durch 7: Falsche Eingabe: 1179, Teilen durch 7: Falsche Eingabe Eingabe: 1180, Teilen durch 7: Falsche Eingabe: 1181, Teilen durch 7: Falsche Eingabe: 1182, Teilen durch 7: Falsche Eingabe: 1183, Teilen durch 7: Wahre Eingabe: 1184, Teilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falscheingabe: 1186, Teilen durch 7: Falscheingabe: 1187, Teilen durch 7: Falscheingabe: 1188, Teilen durch 7: Falscheingabe: 1189, Teilen durch 7: Falscheingabe: 1190, Teilen durch 7: Wahreingabe : 1191, dividieren durch 7: Falscheingabe: 1192, dividieren durch 7: Falscheingabe: 1193, dividieren durch 7: Falscheingabe: 1194, dividieren durch 7: Falscheingabe: 1195, dividieren durch 7: Falscheingabe: 1196, dividieren durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschTeilen durch 7: Falsche Eingabe: 1175, Teilen durch 7: Falsche Eingabe: 1176, Teilen durch 7: Wahre Eingabe: 1177, Teilen durch 7: Falsche Eingabe: 1178, Teilen durch 7: Falsche Eingabe: 1179, Teilen durch 7: Falsche Eingabe Eingabe: 1180, Teilen durch 7: Falsche Eingabe: 1181, Teilen durch 7: Falsche Eingabe: 1182, Teilen durch 7: Falsche Eingabe: 1183, Teilen durch 7: Wahre Eingabe: 1184, Teilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falscheingabe: 1186, Teilen durch 7: Falscheingabe: 1187, Teilen durch 7: Falscheingabe: 1188, Teilen durch 7: Falscheingabe: 1189, Teilen durch 7: Falscheingabe: 1190, Teilen durch 7: Wahreingabe : 1191, dividieren durch 7: Falscheingabe: 1192, dividieren durch 7: Falscheingabe: 1193, dividieren durch 7: Falscheingabe: 1194, dividieren durch 7: Falscheingabe: 1195, dividieren durch 7: Falscheingabe: 1196, dividieren durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschFalsche Eingabe: 1178, Teilen durch 7: Falsche Eingabe: 1179, Teilen durch 7: Falsche Eingabe: 1180, Teilen durch 7: Falsche Eingabe: 1181, Teilen durch 7: Falsche Eingabe: 1182, Teilen durch 7: Falsche Eingabe: 1183, Teilen durch 7: Richtige Eingabe: 1184, Teilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falsche Eingabe: 1186, Teilen durch 7: Falsche Eingabe: 1187, Teilen durch 7: Falsche Eingabe: 1188, Teilen durch 7: Falsche Eingabe Eingabe: 1189, Teilen durch 7: Falsche Eingabe: 1190, Teilen durch 7: Wahre Eingabe: 1191, Teilen durch 7: Falsche Eingabe: 1192, Teilen durch 7: Falsche Eingabe: 1193, Teilen durch 7: Falsche Eingabe: 1194, Teilen durch 7: Falscheingabe: 1195, Teilen durch 7: Falscheingabe: 1196, Teilen durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschFalsche Eingabe: 1178, Teilen durch 7: Falsche Eingabe: 1179, Teilen durch 7: Falsche Eingabe: 1180, Teilen durch 7: Falsche Eingabe: 1181, Teilen durch 7: Falsche Eingabe: 1182, Teilen durch 7: Falsche Eingabe: 1183, Teilen durch 7: Richtige Eingabe: 1184, Teilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falsche Eingabe: 1186, Teilen durch 7: Falsche Eingabe: 1187, Teilen durch 7: Falsche Eingabe: 1188, Teilen durch 7: Falsche Eingabe Eingabe: 1189, Teilen durch 7: Falsche Eingabe: 1190, Teilen durch 7: Wahre Eingabe: 1191, Teilen durch 7: Falsche Eingabe: 1192, Teilen durch 7: Falsche Eingabe: 1193, Teilen durch 7: Falsche Eingabe: 1194, Teilen durch 7: Falscheingabe: 1195, Teilen durch 7: Falscheingabe: 1196, Teilen durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschTeilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falsche Eingabe: 1186, Teilen durch 7: Falsche Eingabe: 1187, Teilen durch 7: Falsche Eingabe: 1188, Teilen durch 7: Falsche Eingabe: 1189, Teilen durch 7: Falsche Eingabe Eingabe: 1190, Teilen durch 7: Richtige Eingabe: 1191, Teilen durch 7: Falsche Eingabe: 1192, Teilen durch 7: Falsche Eingabe: 1193, Teilen durch 7: Falsche Eingabe: 1194, Teilen durch 7: Falsche Eingabe: 1195, Teilen durch 7: Falscheingabe: 1196, Teilen durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschTeilen durch 7: Falsche Eingabe: 1185, Teilen durch 7: Falsche Eingabe: 1186, Teilen durch 7: Falsche Eingabe: 1187, Teilen durch 7: Falsche Eingabe: 1188, Teilen durch 7: Falsche Eingabe: 1189, Teilen durch 7: Falsche Eingabe Eingabe: 1190, Teilen durch 7: Richtige Eingabe: 1191, Teilen durch 7: Falsche Eingabe: 1192, Teilen durch 7: Falsche Eingabe: 1193, Teilen durch 7: Falsche Eingabe: 1194, Teilen durch 7: Falsche Eingabe: 1195, Teilen durch 7: Falscheingabe: 1196, Teilen durch 7: Falscheingabe: 1197, Teilen durch 7: Wahreingabe: 1198, Teilen durch 7: Falscheingabe: 1199, Teilen durch 7: FalschTeilen durch 7: Richtige Eingabe: 1198, Teilen durch 7: Falsche Eingabe: 1199, Teilen durch 7: FalscheTeilen durch 7: Richtige Eingabe: 1198, Teilen durch 7: Falsche Eingabe: 1199, Teilen durch 7: Falsche


Erläuterung:

Ich bekomme 2 verschiedene Lösungen. Sie sind beide gut:
1. Sünde als Aktivierung
2. Etage (oder int) als Aktivierung

Es ist unmöglich, die besten Gewichte mit einem Gefälle zu finden, und ich verwende einen genetischen Algorithmus (von scikit-opt ).

guofei9987
quelle
Hallo Mann, willkommen bei CV und danke für deine ausführliche Antwort. Können Sie dem von Ihnen geschriebenen Code eine Erklärung hinzufügen?
Ferdi
Ich bekomme 2 gute Lösungen, siehe hier , 1. Sünde als Aktivierung 2. Etage (oder int) als Aktivierung
guofei9987