Entrene una red neuronal para distinguir entre números pares e impares

14

Pregunta: ¿es posible entrenar a un NN para distinguir entre números pares e impares solo usando como entrada los números mismos?

Tengo el siguiente conjunto de datos:

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

Entrené a un NN con dos neuronas de entrada (una es el Número variable, la otra es una neurona sesgada), nueve neuronas en la capa oculta y una neurona de salida usando un algoritmo genético muy simple: en cada época, dos conjuntos de pesas "luchan" " unos contra otros; el que tiene el error más alto pierde y se reemplaza por una versión modificada del ganador.

El script resuelve fácilmente problemas simples como los operadores AND, OR y XOR, pero se atasca al intentar categorizar números pares e impares. En este momento, lo mejor que logró hacer fue identificar 53 números de 100 y tomó varias horas. Si normalizo o no las entradas parece no hacer ninguna diferencia.

Si quisiera hacer trampa, podría preprocesar los datos y alimentar% 2 al NN como entrada, pero no quiero hacer eso; NN debería poder aproximar cada función, incluido el operador de módulo ( creo ). ¿Qué estoy haciendo mal?

Edgar Derby
fuente
1
Parece que está intentando aproximar la función "mod" con una red neuronal. Esta es una de mis clases favoritas de problemas: "¿Cuándo es lo correcto aproximar un pollo como esfera"? Los modelos de elementos finitos son un gran lugar para ello. Cuando pregunto esto sobre la red neuronal, me gusta pensar en términos de "base". Sabemos que la respuesta exacta contiene división por 2 y truncamiento, mientras que la red clásica es la multiplicación de vectores y las funciones sigmoideas. Las NN se usan mejor para la interpolación, no para la extrapolación, entonces, ¿está limitado su dominio?
EngrStudent - Restablezca a Monica
44
Creo que su pregunta va más allá de la respuesta actualmente aceptada. Considere la siguiente generalización: construya una red neuronal (usando solo operaciones que se pueden esperar que ocurran en el cerebro) que calcularía n mod k, donde n y k son sus entradas. Me pregunto si esto es posible con una red feedforward de tamaño fijo.
user66081

Respuestas:

7

Al igual que con cualquier tarea de aprendizaje automático, la representación de su aportación juega un papel crucial en lo bien que aprende y generaliza.

Creo que el problema con la representación es que la función (módulo) es altamente no lineal y no es uniforme en la representación de entrada que ha elegido para este problema.

Intentaría lo siguiente:

  1. Pruebe un mejor algoritmo de aprendizaje (propagación hacia atrás / descenso de gradiente y sus variantes).

  2. Intente representar los números en binario usando una precisión de longitud fija.

  3. Si su representación de entrada es un número de bits b, me aseguraría de que su conjunto de entrenamiento no esté sesgado hacia números pequeños o grandes. Tenga números que se elijan de manera uniforme e independiente al azar del rango .[0 0,2si-1]

  4. Como lo ha hecho, use una red de varias capas (pruebe primero con 2 capas: es decir, oculta + salida, antes de usar más capas).

  5. Use un conjunto de entrenamiento + prueba por separado. No evalúe su desempeño en el conjunto de entrenamiento.

Vimal
fuente
Estaba pensando que realizar una transformación en las entradas como calcular el logaritmo natural podría ser valioso.
EngrStudent - Restablezca a Monica
Que podría. De hecho, conociendo la respuesta aquí (el módulo 2 es solo el último bit), la representación binaria del número en bruto funcionaría extremadamente bien. Simplemente conecte el último bit de entrada a la salida. :) Sería interesante ver si el módulo (no-potencia-de-2) funciona bien con una red neuronal. Puede que no funcione tan bien.
Vimal
Hola @Vimal, gracias por la respuesta. ¿Sabe si representar las entradas en binario es siempre una buena idea o si resulta útil en este caso específico?
Edgar Derby
@AnnoysParrot: no hay "balas de plata". No existe una única mejor representación universal porque lo mejor puede significar cosas diferentes y mutuamente excluyentes. La representación binaria es útil en este caso, pero hay muchos donde no lo es. Considere el aprendizaje profundo sobre datos visuales. Si tuviera una neurona de entrada separada para cada bit de entrada único, necesitaría aproximadamente 256 * 5.2 millones de entradas para una imagen de 5 megapíxeles.
EngrStudent - Restablezca a Monica
2
De acuerdo con @EngrStudent aquí. Se necesita mucho conocimiento previo para diseñar una representación de entrada adecuada y también la propia topología de la red neuronal. Dado que una red neuronal es aproximadamente un equivalente continuo y diferenciable de un circuito digital, puede adaptar la topología de la red utilizando la inspiración de los circuitos digitales para la suma / multiplicación / división / módulo / etc. Esto antes de la topología (en lugar de una capa completamente conectada) puede conducir a un entrenamiento más rápido, una mejor generalización, etc., al igual que el funcionamiento de las convnets para imágenes naturales.
Vimal
6

Aprender a clasificar números impares y pares es un problema difícil. Un patrón simple se repite infinitamente. 2,4,6,8 ..... 1,3,5,7 .....

Las funciones de activación no lineal como sin (x) y cos (x) se comportan de manera similar. Por lo tanto, si cambia sus neuronas para implementar pecado y cos en lugar de funciones de activación populares como tanh o relu, creo que puede resolver este problema con bastante facilidad utilizando una sola neurona.

Las transformaciones lineales siempre preceden a las transformaciones no lineales. Por lo tanto, una sola neurona terminará aprendiendo sin (ax + b) que para la combinación correcta de a & b generará 0 y 1 alternativamente en la frecuencia deseada que queremos, que en este caso es 1.

Nunca he probado el pecado o el cos en mis redes neuronales antes. Entonces, disculpas si termina siendo una muy mala idea.

Vignesh Sk
fuente
5

Ahora estoy trabajando con redes neuronales y me encontré con el mismo problema que tú. Lo que terminé haciendo fue representar el número de entrada como una matriz con valores iguales a la representación binaria del número. Como lo que estamos haciendo es clasificar, representé mi salida como una matriz, no como un solo valor. 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
]

¡Espero que esto ayude!

William Gottschalk
fuente
1
Basándome exactamente en tu respuesta, creé el modelo aquí stackoverflow.com/questions/53671491/…
prosti
¡Soberbio! Esto muestra cómo la representación de datos es importante para cualquier algoritmo de ML. Cuando utilicé la representación decimal, obtuve exactamente un 50% de precisión, pero siguiendo esta idea, obtuve un 100% de precisión incluso en datos no vistos. Gracias. Aquí está la implementación: colab.research.google.com/drive/…
Kaushal28
2
En binario, los números pares siempre terminan en 0 y los números impares siempre terminan en 1. No es sorprendente que el modelo funcione, ya que es probable que haya aprendido a escupir el valor del último dígito.
Syncrossus
2

Llegué aquí donde estaba luchando con un problema similar. Entonces escribo lo que logré.

Hasta donde yo sé, el perceptrón de una capa es capaz de resolver todos los problemas, que al final pueden simplificarse para dividir objetos en cualquier geometría usando una línea recta. Y este es este tipo de problema. Si dibuja el último bit de representación binaria en papel, también puede dibujar una línea, y todos los números impares están en un lado, e incluso en el otro. Por la misma razón, es imposible resolver el problema xor con una red de una capa.

Okay. Este problema parece muy simple, así que tomemos el paso Heaviside como función de activación. Después de jugar un poco con mi número, me di cuenta de que el problema aquí es el sesgo. Busco un poco en Google, y lo que encontré es que si te quedas con la representación de la geometría, el sesgo te permite cambiar el lugar de activación en el sistema de coordenadas.

Problema muy educativo

usuario3486361
fuente
1

Es bien sabido que las puertas lógicas NOT, AND, OR se pueden hacer con redes neuronales muy simples (NN), y que se puede construir una calculadora aritmética completa con puertas lógicas utilizando números binarios como entrada. Por lo tanto, debería poder crear un NN para calcular n módulo k, para cualquier número n y k expresado en la base 2.

Si desea calcular n módulo k para un número k fijo (por ejemplo, k = 4), puede crear un NN extremadamente simple que haga eso: exprese el número de entrada n en la base k e ignore todos los dígitos que no sean el rango más bajo dígito, y tienes la respuesta!

Bernard Montaron
fuente
0

Una idea para evadir el uso del "mod 2" explícito en la entrada podría ser codificar el número como una secuencia de píxeles, entonces el problema equivale a reconocer si el segmento se puede dividir en dos segmentos iguales. Este es un problema de visión artificial y eso podría ser aprendido por las redes convencionales.

En el otro extremo, si el número se almacena como flotante, la pregunta se reduce (o generaliza) para reconocer cuándo un número flotante es aproximadamente un número entero.

Arivero
fuente
Interesante pensamiento. ¿Puedes explicar cómo te gustaría codificar el número en píxeles?
Jan Kukacka
bueno, piensa en "base 1". Para codificar n, dibuja una barra negra que tenga n píxeles. Supongo que los núcleos de convolución notarán la diferencia entre un número impar y un número par de píxeles.
arivero
0

Creé una red así aquí .

La representación que dio @William Gottschalk fue la base.

Solo usa 1 neurona en la primera capa oculta con 32 entradas. La capa de salida tiene solo 2 neuronas para una codificación de 0 y 1 en caliente.

prosti
fuente
0

Mi solucion

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

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


Además, dividir entre otros números (digamos, 7) también está bien:

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

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


Explicación:

Tengo 2 soluciones diferentes. Ambos son buenos:
1. el pecado como activación
2. piso (o int) como activación

Es imposible encontrar los mejores pesos usando el descenso de gradiente, y yo uso el algoritmo genético (de scikit-opt )

guofei9987
fuente
Hola, bienvenido a CV y ​​gracias por tu respuesta detallada. ¿Puedes agregar alguna explicación al código que has escrito?
Ferdi
Obtengo 2 buenas soluciones, mira aquí , 1. pecado como activación 2. piso (o int) como activación
guofei9987