Treine uma rede neural para distinguir entre números pares e ímpares

14

Pergunta: é possível treinar um NN para distinguir entre números pares e ímpares usando apenas como entrada os próprios números?

Eu tenho o seguinte conjunto de dados:

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

Treinei um NN com dois neurônios de entrada (um sendo a variável Number, o outro sendo um neurônio de viés), nove neurônios na camada oculta e um neurônio de saída usando um algoritmo genético muito simples: em cada época, dois conjuntos de pesos "lutam" " um contra o outro; aquele com o erro mais alto perde e é substituído por uma versão modificada do vencedor.

O script resolve facilmente problemas simples como os operadores AND, OR ou XOR, mas fica parado ao tentar categorizar números pares e ímpares. No momento, o melhor que conseguiu fazer é identificar 53 números em 100 e levou várias horas. Normalizar ou não as entradas parece não fazer diferença.

Se eu quisesse trapacear, poderia apenas pré-processar os dados e alimentar% 2 para o NN como uma entrada, mas não quero fazer isso; NN deve ser capaz de aproximar todas as funções, incluindo o operador de módulo ( acredito ). O que estou fazendo de errado?

Edgar Derby
fonte
1
Parece que você está tentando aproximar a função "mod" com uma rede neural. Essa é uma das minhas classes favoritas de problema - "quando é a coisa certa aproximar uma galinha como uma esfera". Modelos de elementos finitos são um ótimo lugar para isso. Ao perguntar isso à rede neural, gosto de pensar em termos de "base". Sabemos que a resposta exata contém a divisão por 2 e o truncamento, enquanto a rede clássica é a multiplicação de vetores e funções sigmóides. As NNs são mais usadas para interpolação, não extrapolação - seu domínio é limitado?
EngrStudent - Reinstate Monica
4
Acho que sua pergunta é mais profunda do que a resposta atualmente aceita. Considere a seguinte generalização: construa uma rede neural (usando apenas operações que se espera que ocorram no cérebro) que computem n mod k, onde n e k são suas entradas. Gostaria de saber se isso é possível com uma rede feedforward de tamanho fixo.
user66081

Respostas:

7

Como em qualquer tarefa de aprendizado de máquina, a representação de suas informações desempenha um papel crucial na forma como você aprende e generaliza.

Penso que o problema com a representação é que a função (módulo) é altamente não linear e não suave na representação de entrada que você escolheu para esse problema.

Eu tentaria o seguinte:

  1. Tente um algoritmo de aprendizado melhor (retropaginação / gradiente descendente e suas variantes).

  2. Tente representar os números em binário usando uma precisão de comprimento fixo.

  3. Se sua representação de entrada for um número b-bit, eu garantiria que seu conjunto de treinamento não seja enviesado para números pequenos ou grandes. Tenha números que sejam uniformemente escolhidos aleatoriamente e de forma independente no intervalo .[0 0,2b-1]

  4. Como você fez, use uma rede de várias camadas (tente duas camadas primeiro: por exemplo, oculto + saída, antes de usar mais camadas).

  5. Use um treinamento separado + conjunto de teste. Não avalie seu desempenho no conjunto de treinamento.

Vimal
fonte
Eu estava pensando que realizar uma transformação nas entradas, como calcular o logaritmo natural, pode ser valioso.
EngrStudent - Reinstate Monica
Poderia. De fato, sabendo a resposta aqui (o módulo 2 é apenas o último bit), a representação binária do número bruto funcionaria extremamente bem. Basta conectar o último bit de entrada à saída. :) Seria interessante ver se o módulo (não-poder-de-2) funciona bem com uma rede neural. Pode não funcionar tão bem.
Vimal
Oi @Vimal, obrigado pela resposta. Você sabe se a representação das entradas no binário é sempre uma boa ideia ou apenas foi útil nesse caso específico?
Edgar Derby
@ AnnoysParrot - não há "balas de prata". Não existe uma única melhor representação universal, porque melhor pode significar coisas diferentes e mutuamente exclusivas. A representação binária é útil neste caso, mas há muitas onde não está. Considere o aprendizado profundo sobre dados visuais. Se você tivesse um neurônio de entrada separado para cada bit de entrada exclusivo, seria necessário cerca de 256 * 5,2 milhões de entradas para uma imagem de 5 megapixels.
EngrStudent - Restabelece Monica
2
Concorde com @EngrStudent aqui. Muito conhecimento prévio é necessário para projetar uma representação de entrada adequada e também a topologia da rede neural. Como uma rede neural é aproximadamente um equivalente contínuo e diferenciável de um circuito digital, você pode adaptar a topologia da rede usando a inspiração dos circuitos digitais para adição / multiplicação / divisão / módulo / etc. Isso antes na topologia (em vez de uma camada totalmente conectada) pode levar a um treinamento mais rápido, melhor generalização etc., bem como o modo de convnets funcionou bem para imagens naturais.
Vimal
6

Aprender a classificar números ímpares e pares é um problema difícil. Um padrão simples continua repetindo infinitamente. 2,4,6,8 ..... 1,3,5,7 .....

Funções de ativação não linear como sin (x) e cos (x) se comportam de maneira semelhante. Portanto, se você alterar seus neurônios para implementar o pecado e o cos, em vez de funções de ativação populares como tanh ou relu, acho que você pode resolver esse problema facilmente usando um único neurônio.

As transformações lineares sempre precedem as transformações não lineares. Portanto, um único neurônio acaba aprendendo o pecado (ax + b) que, para a combinação correta de a & b, gera 0 e 1 como alternativa na frequência desejada que queremos, que neste caso é 1.

Eu nunca tentei pecado ou cos em minhas redes neurais antes. Então, desculpas se isso acabar sendo uma péssima idéia.

Vignesh Sk
fonte
5

Então, eu estou trabalhando com redes neurais agora e tive o mesmo problema que você. O que acabei fazendo foi representar o número de entrada como uma matriz com valores iguais à representação binária do número. Como o que estamos fazendo é classificar, eu representei minha saída como uma matriz, e não um único 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 isto ajude!

William Gottschalk
fonte
1
Exatamente com base na sua resposta, criei o modelo aqui stackoverflow.com/questions/53671491/…
prosti
Soberbo! Isso mostra como a representação dos dados é importante para qualquer algoritmo de ML. Quando usei a representação decimal, obtive exatamente 50% de precisão, mas seguindo essa ideia, obtive 100% de precisão, mesmo em dados não vistos. Obrigado. Aqui está a implementação: colab.research.google.com/drive/…
Kaushal28
2
Em binário, números pares sempre terminam em 0 e números ímpares sempre terminam em 1. Não é surpresa que o modelo funcione, pois é provável que ele tenha aprendido a cuspir o valor do último dígito.
Syncrossus 07/07/19
2

Eu chego aqui onde estava lutando com um problema semelhante. Então eu escrevo o que consegui.

Tanto quanto sei, o perceptron é capaz de resolver todos os problemas, que no final podem ser simplificados para dividir objetos em qualquer geometria usando linha reta. E esse é esse tipo de problema. Se você desenhar o último pedaço de representação binária no papel, também poderá desenhar uma linha, e todos os números ímpares estarão de um lado e Mesmo do outro. Pela mesma razão, é impossível resolver o problema xor com uma rede de camada.

Está bem. Esse problema parece muito simples, então vamos dar o passo Heaviside como função de ativação. Depois que brinquei um pouco com o meu número, percebi que o problema aqui é o viés. Pesquisei um pouco no google e descobri que, se você permanecer com a representação geométrica, o viés permitirá alterar o local de ativação no sistema de coordenadas.

Problema muito educacional

user3486361
fonte
1

É sabido que as portas lógicas NOT, AND, OR podem ser feitas com redes neurais (NN) muito simples, e que você pode construir uma calculadora aritmética completa com portas lógicas usando números binários como entrada. Portanto, você deve poder criar um NN para calcular n módulo k, para qualquer número de ne expressado na base 2.

Se você deseja calcular n módulo k para um número fixo k (por exemplo, k = 4), é possível criar um NN extremamente simples que faça isso: expresse o número de entrada n na base k e ignore todos os dígitos que não sejam da classificação mais baixa dígito e você tem a resposta!

Bernard Montaron
fonte
0

Uma idéia que evita o uso do "mod 2" explícito na entrada pode ser codificar o número como uma sequência de pixels, então o problema é reconhecer se o segmento pode ser dividido em dois segmentos iguais. Esse é um problema de visão de máquina e pode ser aprendido por redes convencionais.

Por outro lado, se o número for armazenado como um flutuador, a questão será reduzida (ou generalizada) para reconhecer quando um número flutuante é aproximadamente um número inteiro.

arivero
fonte
Pensamento interessante. Você pode elaborar como gostaria de codificar o número em pixels?
Jan KUKACKA
bem, pense na "base 1". Para codificar n, desenhe uma barra preta com n pixels. Meu palpite é que os kernels de convolução perceberão a diferença entre um número ímpar e um número par de pixels.
Arivero
0

Eu criei uma rede aqui .

A representação que @William Gottschalk deu foi a base.

Ele usa apenas 1 neurônio na primeira camada oculta com 32 entradas. A camada de saída possui apenas 2 neurônios para a codificação one-hot de 0 e 1.

prosti
fonte
0

Minha solução

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


Além disso, dividir por outros números (digamos, 7) também é bom:

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


Explicação:

Eu recebo 2 soluções diferentes. Ambos são bons:
1. pecado como ativação
2. andar (ou int) como ativação

É impossível encontrar os melhores pesos usando descida de gradiente, e eu uso o algoritmo genético (do scikit-opt )

guofei9987
fonte
Olá, seja bem-vindo ao CV e obrigado pela resposta detalhada. Você pode adicionar alguma explicação ao código que você escreveu?
Ferdi
Eu recebo 2 boas soluções, veja aqui , 1. pecado como ativação 2. floor (ou int) como ativação
guofei9987 14/01