Trenuj sieć neuronową, aby rozróżniać liczby parzyste od nieparzystych

14

Pytanie: czy można wytrenować NN, aby rozróżniał liczby nieparzyste od parzystych tylko przy użyciu samych danych wejściowych?

Mam następujący zestaw danych:

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

Trenowałem NN z dwoma neuronami wejściowymi (jeden jest zmienną liczbą, drugi neuronem nastawnym), dziewięcioma neuronami w ukrytej warstwie i jednym neuronem wyjściowym przy użyciu bardzo prostego algorytmu genetycznego: w każdej epoce walczą dwa zestawy wag " przeciwko sobie; ten z najwyższym błędem przegrywa i zostaje zastąpiony zmodyfikowaną wersją zwycięzcy.

Skrypt z łatwością rozwiązuje proste problemy, takie jak operatory AND, OR i XOR, ale utkną podczas próby kategoryzacji liczb nieparzystych i parzystych. W tej chwili najlepiej udało się zidentyfikować 53 numery na 100 i zajęło to kilka godzin. To, czy normalizuję, czy nie, wydaje się, że nie ma znaczenia.

Gdybym chciał oszukiwać, mogłem po prostu wstępnie przetworzyć dane i podać% 2 do NN jako dane wejściowe, ale nie chcę tego robić; NN powinien być w stanie aproksymować każdą funkcję, w tym operator modulo ( uważam ). Co ja robię źle?

Edgar Derby
źródło
1
Wygląda na to, że próbujesz przybliżyć funkcję „mod” za pomocą sieci neuronowej. To jedna z moich ulubionych klas problemów - „kiedy właściwe jest przybliżenie kurczaka jako kuli”. Modele elementów skończonych są do tego doskonałym miejscem. Pytając o sieć neuronową, lubię myśleć w kategoriach „podstawy”. Wiemy, że dokładna odpowiedź zawiera dzielenie przez 2 i obcinanie, podczas gdy klasyczną siecią są funkcje mnożenia wektorów i sigmoidów. NN najlepiej nadają się do interpolacji, a nie ekstrapolacji - więc czy Twoja domena jest ograniczona?
EngrStudent
4
Myślę, że twoje pytanie jest głębsze niż obecnie akceptowana odpowiedź. Rozważ następujące uogólnienie: zbuduj sieć neuronową (wykorzystując tylko operacje, których można się spodziewać w mózgu), która obliczy n mod k, gdzie n i k to jego dane wejściowe. Zastanawiam się, czy jest to możliwe dzięki sieci feedforward o ustalonym rozmiarze.
user66081,

Odpowiedzi:

7

Podobnie jak w przypadku każdego zadania uczenia maszynowego, reprezentacja twojego wkładu odgrywa kluczową rolę w tym, jak dobrze się uczysz i uogólniasz.

Myślę, że problem z reprezentacją polega na tym, że funkcja (modulo) jest wysoce nieliniowa i nie jest gładka w reprezentacji wejściowej wybranej dla tego problemu.

Spróbowałbym następujących rzeczy:

  1. Wypróbuj lepszy algorytm uczenia się (propagacja wsteczna / opadanie gradientu i jego warianty).

  2. Spróbuj przedstawić liczby w systemie dwójkowym, używając precyzji o stałej długości.

  3. Jeśli twoja reprezentacja wejściowa jest liczbą b-bitową, upewnię się, że twój zestaw treningowy nie jest nastawiony na małe lub duże liczby. Mają liczby, które są jednolicie i niezależnie wybierane losowo z zakresu .[0,2)b-1]

  4. Jak już to zrobiłeś, użyj sieci wielowarstwowej (najpierw wypróbuj 2 warstwy: ukryty + wyjście, zanim użyjesz więcej warstw).

  5. Użyj osobnego zestawu treningowego + testowego. Nie oceniaj swojej wydajności na zestawie treningowym.

Vimal
źródło
Myślałem, że przeprowadzenie transformacji na wejściach, takie jak obliczenie logarytmu naturalnego, może być cenne.
EngrStudent
Może. W rzeczywistości, znając odpowiedź tutaj (modulo 2 to tylko ostatni bit), binarna reprezentacja liczby surowej działałaby bardzo dobrze. Wystarczy podłączyć ostatni bit wejścia do wyjścia. :) Ciekawie byłoby sprawdzić, czy modulo (not-power-of-2) działa dobrze z siecią neuronową. Może to również nie działać.
Vimal
Cześć @Vimal, dziękuję za odpowiedź. Czy wiesz, czy reprezentowanie danych wejściowych w formacie binarnym jest zawsze dobrym pomysłem, czy też okazało się pomocne w tym konkretnym przypadku?
Edgar Derby,
@AnnoysParrot - nie ma „srebrnych kul”. Nie ma jednej uniwersalnej najlepszej reprezentacji, ponieważ najlepsza może oznaczać różne i wzajemnie wykluczające się rzeczy. Reprezentacja binarna jest przydatna w tym przypadku, ale jest mnóstwo tam, gdzie jej nie ma. Rozważ głębokie uczenie się danych wizualnych. Jeśli miałbyś osobny neuron wejściowy dla każdego unikalnego bitu wejściowego, potrzebujesz około 256 * 5,2 miliona wejść dla obrazu 5 megapikseli.
EngrStudent,
2
Zgadzam się z @EngrStudent tutaj. Wiele wcześniejszej wiedzy dotyczy projektowania odpowiedniej reprezentacji danych wejściowych, a także samej topologii sieci neuronowej. Ponieważ sieć neuronowa jest w przybliżeniu ciągłym, różnicowalnym odpowiednikiem obwodu cyfrowego, możesz dostosować topologię sieci za pomocą inspiracji z obwodów cyfrowych do dodawania / mnożenia / dzielenia / modulo / itp. To wcześniejsze w topologii (zamiast w pełni połączonej warstwy) może prowadzić do szybszego treningu, lepszego uogólnienia itp., Podobnie jak dobrze działały sieci dla naturalnych obrazów.
Vimal
6

Nauka klasyfikowania liczb nieparzystych i parzystych jest trudnym problemem. Prosty wzór powtarza się w nieskończoność. 2,4,6,8 ..... 1,3,5,7 .....

Nieliniowe funkcje aktywacyjne, takie jak sin (x) i cos (x), zachowują się podobnie. Dlatego jeśli zmienisz neurony, aby zastosować sin i cos zamiast popularnych funkcji aktywacyjnych, takich jak tanh lub relu, myślę, że możesz dość łatwo rozwiązać ten problem za pomocą pojedynczego neuronu.

Transformacje liniowe zawsze poprzedzają transformacje nieliniowe. Dlatego pojedynczy neuron zakończy naukę grzechu (ax + b), który dla właściwej kombinacji a & b będzie generował na przemian 0 i 1 na przemian z pożądaną częstotliwością, którą w tym przypadku jest 1.

Nigdy wcześniej nie próbowałem grzechu ani cos w moich sieciach neuronowych. Przepraszam, jeśli okaże się to bardzo złym pomysłem.

Vignesh Sk
źródło
5

Pracuję teraz z sieciami neuronowymi i napotkałem ten sam problem co ty. Skończyło się na tym, że reprezentowałem liczbę wejściową jako tablicę o wartościach równych binarnej reprezentacji liczby. Ponieważ to, co robimy, to klasyfikowanie, przedstawiałem swoje dane wyjściowe jako tablicę, a nie jako pojedynczą wartość. dawny:

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
]

Mam nadzieję że to pomoże!

William Gottschalk
źródło
1
Dokładnie na podstawie twojej odpowiedzi stworzyłem model tutaj stackoverflow.com/questions/53671491/…
prosti
Wspaniały! To pokazuje, jak reprezentacja danych jest ważna dla dowolnego algorytmu ML. Kiedy użyłem reprezentacji dziesiętnej, uzyskałem dokładnie 50% dokładności, ale zgodnie z tym pomysłem uzyskałem 100% dokładności nawet w przypadku niewidzialnych danych. Dzięki. Oto implementacja: colab.research.google.com/drive/…
Kaushal28
2
W systemie binarnym liczby parzyste zawsze kończą się na 0, a liczby nieparzyste zawsze kończą się na 1. Nic dziwnego, że model działa, ponieważ jest prawdopodobne, że nauczył się wypluwać wartość ostatniej cyfry.
Syncrossus,
2

Dostaję się tutaj, gdzie zmagał się z podobnym problemem. Więc piszę, co udało mi się.

O ile mi wiadomo, perceptron jednej warstwy jest w stanie rozwiązać każdy problem, który na końcu można uprościć, aby podzielić obiekty o dowolnej geometrii za pomocą linii prostej. I to jest tego rodzaju problem. Jeśli narysujesz ostatni kawałek reprezentacji binarnej na papierze, możesz również narysować linię, a wszystkie liczby nieparzyste są po jednej stronie, a nawet po drugiej. Z tego samego powodu nie można rozwiązać problemu xor z siecią jednowarstwową.

Dobrze. Ten problem wygląda bardzo prosto, więc weźmy krok Heaviside jako funkcję aktywacji. Po tym, jak trochę zagrałem z moim numerem, zdałem sobie sprawę, że problem polega na uprzedzeniu. Trochę google, i znalazłem, że jeśli pozostaniesz z reprezentacją geometrii, odchylenie umożliwia zmianę miejsca aktywacji w układzie współrzędnych.

Bardzo problem edukacyjny

użytkownik3486361
źródło
1

Powszechnie wiadomo, że bramek logicznych NIE, ORAZ, LUB wszystkich można dokonać za pomocą bardzo prostych sieci neuronowych (NN) i że można zbudować kompletny kalkulator arytmetyczny z bramkami logicznymi, używając liczb binarnych jako danych wejściowych. Dlatego powinieneś być w stanie utworzyć NN, aby obliczyć n modulo k, dla dowolnej liczby n i k wyrażonej w podstawie 2.

Jeśli chcesz obliczyć n modulo k dla ustalonej liczby k (na przykład k = 4), możesz w rzeczywistości stworzyć wyjątkowo prosty NN, który to robi: wyraż liczbę wejściową n w podstawie k i zignoruj ​​wszystkie cyfry inne niż najniższa ranga cyfra i masz odpowiedź!

Bernard Montaron
źródło
0

Jednym pomysłem unikającym użycia wyraźnego „mod 2” na wejściu może być kodyfikacja liczby jako sekwencji pikseli, wówczas problem polega na rozpoznaniu, czy segment można podzielić na dwa równe segmenty. Jest to problem widzenia maszynowego, którego można się nauczyć w konwencjonalnych sieciach.

Z drugiej strony, jeśli liczba jest przechowywana jako liczba zmiennoprzecinkowa, pytanie zmniejsza się (lub uogólnia), aby rozpoznać, kiedy liczba zmiennoprzecinkowa jest w przybliżeniu liczbą całkowitą.

arivero
źródło
Ciekawa myśl. Czy możesz wyjaśnić, w jaki sposób chcesz skodyfikować liczbę w pikselach?
Jan Kukacka
cóż, pomyśl „podstawa 1”. Aby skodyfikować n, narysuj czarny pasek o n pikseli. Domyślam się, że jądra splotu zauważą różnicę między nieparzystą a parzystą liczbą pikseli.
arivero
0

Stworzyłem taką sieć w tutaj .

Podstawą była reprezentacja @William Gottschalk.

Używa tylko 1 neuronu w pierwszej ukrytej warstwie z 32 wejściami. Warstwa wyjściowa ma tylko 2 neurony do jednokrotnego kodowania 0 i 1.

prosti
źródło
0

Moje rozwiązanie

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))

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


Co więcej, dzielenie przez inne liczby (powiedzmy 7) również jest dobre:

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))

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


Wyjaśnienie:

Dostaję 2 różne rozwiązania. Oba są dobre:
1. sin jako aktywacja
2. floor (lub int) jako aktywacja

Niemożliwe jest znalezienie najlepszych wag przy użyciu opadania gradientu, a ja używam algorytmu genetycznego (od scikit-opt )

guofei9987
źródło
Cześć, witaj w CV i dziękuję za szczegółową odpowiedź. Czy możesz dodać wyjaśnienie do napisanego kodu?
Ferdi
Dostaję 2 dobre rozwiązania, patrz tutaj , 1. sin jako aktywacja 2. floor (lub int) jako aktywacja
guofei9987