짝수와 홀수를 구분하기 위해 신경망 훈련


14

질문 : 숫자 자체를 입력으로 만 사용하여 홀수와 짝수를 구별하도록 NN을 훈련시킬 수 있습니까?

다음과 같은 데이터 집합이 있습니다.

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

나는 두 개의 입력 뉴런 (하나는 가변 수, 다른 하나는 바이어스 뉴런), 숨겨진 층에있는 9 개의 뉴런, 매우 간단한 유전자 알고리즘을 사용하는 하나의 출력 뉴런으로 NN을 훈련 시켰습니다. "서로에 대하여; 가장 높은 오류가있는 것이 사라지고 수정 된 버전의 승자로 대체됩니다.

이 스크립트는 AND, OR 및 XOR 연산자와 같은 간단한 문제를 쉽게 해결하지만 홀수와 짝수를 분류하려고 할 때 멈춰 있습니다. 현재로서는 100에서 53 개의 숫자를 식별하는 것이 가장 좋았으며 몇 시간이 걸렸습니다. 입력을 정규화할지 여부는 차이가없는 것 같습니다.

속임수를 쓰려면 데이터를 사전 처리하고 % 2를 입력으로 NN에 공급할 수는 있지만 그렇게하고 싶지는 않습니다. NN은 모듈로 연산자를 포함한 모든 함수를 근사 할 수 있어야합니다 ( 믿습니다 ). 내가 도대체 ​​뭘 잘못하고있는 겁니까?


1
신경망을 사용하여 "mod"기능을 근사화하려고하는 것 같습니다. 이것은 내가 가장 좋아하는 문제 중 하나입니다. "닭을 구체로 추정하는 것이 옳은 경우"입니다. 유한 요소 모델이 적합합니다. 신경망에 관해 물을 때, 나는 "기본"의 관점에서 생각하고 싶습니다. 우리는 정확한 답이 2로 나누고 잘리는 반면 고전적인 네트워크는 벡터 곱셈과 시그 모이 드 함수라는 것을 알고 있습니다. NN은 외삽이 아닌 내삽에 가장 적합합니다. 도메인도 제한되어 있습니까?
EngrStudent-복직 모니카

4
귀하의 질문은 현재 받아 들여지는 답변보다 더 깊이 있다고 생각합니다. 다음 일반화를 고려하십시오 : n mod k를 계산할 신경망을 구성하십시오 (뇌에서 발생할 것으로 예상되는 연산 만 사용). 여기서 n과 k는 입력입니다. 고정 크기의 피드 포워드 네트워크에서 이것이 가능한지 궁금합니다.
user66081

답변:


7

기계 학습 작업과 마찬가지로 입력 표현은 학습 및 일반화 수준에 결정적인 역할을합니다.

표현의 문제는 함수 (모듈로)가 매우 비선형 적 이며이 문제에 대해 선택한 입력 표현에서 부드럽 지 않다는 것입니다.

나는 다음을 시도 할 것이다 :

  1. 더 나은 학습 알고리즘 (역 전파 / 그라데이션 디센트 및 그 변형)을 사용해보십시오.

  2. 고정 길이 정밀도를 사용하여 이진수로 숫자를 표현하십시오.

  3. 입력 표현이 b 비트 숫자 인 경우 훈련 세트가 작거나 큰 숫자로 편향되지 않도록합니다. 범위에서 균일하고 독립적으로 임의의 숫자를 선택하십시오 .[0,2b1]

  4. 당신이 한 것처럼, 멀티 레이어 네트워크를 사용하십시오 (더 많은 레이어를 사용하기 전에 두 개의 레이어를 먼저 시도하십시오.

  5. 별도의 교육 + 테스트 세트를 사용하십시오. 훈련 세트에서 성과를 평가하지 마십시오.


자연 로그 계산과 같은 입력에서 변환을 수행하는 것이 가치가 있다고 생각했습니다.
EngrStudent-복직 모니카

그것은 수도. 사실, 여기서 답을 알면 (모듈로 2는 마지막 비트입니다) 원시 숫자의 이진 표현은 매우 잘 작동합니다. 마지막 입력 비트를 출력에 연결하기 만하면됩니다. :) 모듈로 (2의 거듭 제곱이 아닌)가 신경망과 잘 작동하는지 보는 것은 흥미로울 것입니다. 잘 작동하지 않을 수 있습니다.
Vimal

안녕하세요 @Vimal, 답변 주셔서 감사합니다. 이진으로 입력을 나타내는 것이 항상 좋은 아이디어인지 또는이 특정 경우에 도움이되었는지 알고 있습니까?
Edgar Derby

@AnnoysParrot- "실버 글 머리 기호"가 없습니다. 최고는 다른 상호 배타적 인 것을 의미 할 수 있기 때문에 하나의 보편적 최고 표현은 없습니다. 이진 표현은이 경우에 유용하지만 그렇지 않은 부분이 많이 있습니다. 시각적 데이터에 대한 심층 학습을 고려하십시오. 각각의 고유 한 입력 비트에 대해 별도의 입력 뉴런이있는 경우 5 메가 픽셀 이미지에 대해 약 256 * 5.2 백만 개의 입력이 필요합니다.
EngrStudent-복직 모니카

2
@EngrStudent에 동의하십시오. 많은 사전 지식이 적절한 입력 표현과 신경망 토폴로지 자체를 설계하는 데 사용됩니다. 신경망은 대략 연속적이고 차별화 가능한 디지털 회로에 해당하므로 디지털 회로에서 영감을 받아 덧셈 / 곱셈 / 나눗셈 / 모듈로 등의 네트워크 토폴로지를 조정할 수 있습니다. (완전히 연결된 레이어가 아닌) 토폴로지에 대한 이전의 경우, 컨 벡트가 자연 이미지에서 잘 작동하는 방식과 같이 더 빠른 교육, 더 나은 일반화 등을 초래할 수 있습니다.
Vimal

6

홀수와 짝수를 분류하는 법을 배우는 것은 어려운 문제입니다. 간단한 패턴은 계속 반복됩니다. 2,4,6,8 ..... 1,3,5,7 .....

sin (x) 및 cos (x)와 같은 비선형 활성화 함수는 비슷하게 동작합니다. 따라서 tanh 또는 relu와 같은 인기있는 활성화 기능 대신 죄와 cos를 구현하도록 뉴런을 변경하면 단일 뉴런을 사용 하여이 문제를 상당히 쉽게 해결할 수 있습니다.

선형 변환은 항상 비선형 변환보다 우선합니다. 따라서 하나의 뉴런은 sin (ax + b)을 배우게되는데, a & b의 올바른 조합에 대해 원하는 주파수에서 0과 1을 출력 할 수 있습니다.

나는 이전에 신경망에서 죄와 죄를 시도한 적이 없다. 따라서 매우 나쁜 생각이되면 사과드립니다.


5

그래서 지금 신경망을 사용하고 있는데 당신과 같은 문제가 발생했습니다. 내가 한 일은 입력 숫자를 이진수로 표현하는 값으로 배열로 표시하는 것이 었습니다. 우리가하고있는 일은 분류하는 것이므로 출력을 단일 값이 아닌 배열로 표현했습니다. 전의:

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
]

도움이 되었기를 바랍니다!


1
정확히 당신의 답변에 따라 여기에 모델을 만들었습니다 stackoverflow.com/questions/53671491/…
prosti

훌륭한! 이것은 ML 알고리즘에서 데이터 표현이 어떻게 중요한지를 보여줍니다. 십진수 표현을 사용할 때 정확히 50 % 정확도를 얻었지만이 아이디어를 따르면 보이지 않는 데이터에서도 100 % 정확도를 얻었습니다. 감사. 구현은 다음과 같습니다. colab.research.google.com/drive/…
Kaushal28

2
이진수로 짝수는 항상 0으로 끝나고 홀수는 항상 1로 끝납니다. 모델이 작동한다는 것은 놀라운 일이 아닙니다. 마지막 숫자의 값을 뱉어내는 것을 배웠기 때문입니다.
Syncrossus 2016 년

2

비슷한 문제로 어려움을 겪었던 곳으로 왔습니다. 그래서 내가 관리하는 것을 씁니다.

내가 아는 한 퍼셉트론은 모든 문제를 해결할 수 있으며, 결국에는 직선을 사용하여 모든 지오메트리에서 객체를 나누기 위해 단순화 될 수 있습니다. 그리고 이것은 이런 종류의 문제입니다. 종이에 이진 표현의 마지막 비트를 그리면 선을 그릴 수도 있고 모든 홀수 숫자는 한쪽에 있고 짝수는 다른쪽에 있습니다. 같은 이유로 한 계층 네트워크에서 xor 문제를 해결하는 것은 불가능합니다.

확인. 이 문제는 매우 간단 해 보이므로 Heaviside 단계를 활성화 기능으로 사용하십시오. 숫자로 조금 연주 한 후에는 문제가 편견이라는 것을 깨달았습니다. 나는 약간의 구글을 발견했으며, 내가 찾은 것은 지오메트리 표현을 유지하면 바이어스를 통해 좌표 시스템에서 활성화 위치를 변경할 수 있다는 것입니다.

매우 교육적인 문제


1

논리 게이트 NOT, AND, OR은 모두 매우 간단한 신경망 (NN)으로 수행 할 수 있으며 이진수를 입력으로 사용하여 논리 게이트를 사용하여 완전한 산술 계산기를 작성할 수 있다는 것은 잘 알려져 있습니다. 따라서 기수 2로 표현 된 n 및 k 수에 대해 n 모듈로 k를 계산하기 위해 NN을 생성 할 수 있어야합니다.

고정 k 숫자 (예 : k = 4)에 대해 n 모듈로 k를 계산하려면 실제로 다음을 수행하는 매우 간단한 NN을 만들 수 있습니다. 입력 숫자 n을 기본 k로 표현하고 가장 낮은 순위 이외의 모든 숫자를 무시하십시오. 숫자, 당신은 대답이 있습니다!


0

입력에서 명시적인 "mod 2"의 사용을 피하는 한 가지 아이디어는 숫자를 픽셀 시퀀스로 코드화하는 것인데, 세그먼트가 두 개의 동일한 세그먼트로 분할 될 수 있는지 인식하는 데 문제가 있습니다. 이것은 머신 비전 문제이며 기존 네트워크에서 배울 수 있습니다.

반대로 극단적으로 숫자가 부동 소수점으로 저장된 경우, 부동 소수점 숫자가 대략 정수인 경우를 인식하기 위해 질문이 줄어 듭니다 (또는 일반화됩니다).


재미있는 생각. 숫자를 픽셀로 어떻게 정리하고 싶습니까?
Jan Kukacka

"base 1"이라고 생각하십시오. n을 코드화하려면 n 픽셀의 검은 막대를 그립니다. 내 생각에 컨볼 루션 커널은 홀수 픽셀과 짝수 픽셀의 차이를 알 수 있습니다.
arivero

0

여기에 그런 네트워크를 만들었습니다 .

@William Gottschalk의 표현이 기초였습니다.

32 개의 입력을 가진 첫 번째 숨겨진 레이어에서 1 개의 뉴런을 사용합니다. 출력 레이어에는 0과 1의 원핫 인코딩을 위해 2 개의 뉴런이 있습니다.


0

솔루션

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

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


또한 다른 숫자 (예 : 7)로 나누는 것도 좋습니다.

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

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


설명:

나는 두 가지 다른 솔루션을 얻습니다. 그들은 둘 다 좋다 :
1. 활성화로서의 죄
2. 활성화로서의 층 (또는 정수)

그래디언트 디센트를 사용하여 최고의 가중치를 찾는 것은 불가능하며 유전 알고리즘을 사용합니다 ( scikit-opt )


안녕하세요, CV에 오신 것을 환영하며 자세한 답변을 주셔서 감사합니다. 작성한 코드에 설명을 추가해 주시겠습니까?
페르 디

나는이 개 좋은 솔루션을 걸보고 여기 , 1. 죄 활성화 2 층 (또는 int)를 활성화 한
guofei9987
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.