Addestra una rete neurale per distinguere tra numeri pari e dispari


14

Domanda: è possibile addestrare un NN a distinguere tra numeri pari e dispari solo usando come input i numeri stessi?

Ho il seguente set di dati:

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

Ho addestrato un NN con due neuroni di input (uno è il numero variabile, l'altro è un neurone di bias), nove neuroni nello strato nascosto e un neurone di output usando un algoritmo genetico molto semplice: ad ogni epoca, due serie di pesi "combattono " uno contro l'altro; quello con l'errore più alto perde ed è sostituito da una versione modificata del vincitore.

Lo script risolve facilmente problemi semplici come gli operatori AND, OR e XOR, ma rimane bloccato mentre cerca di classificare i numeri pari e dispari. In questo momento il meglio che è riuscito a fare è identificare 53 numeri su 100 e ci sono volute diverse ore. Sia che io normalizzi o meno gli input non sembrano fare alcuna differenza.

Se volessi imbrogliare potrei semplicemente pre-elaborare i dati e inviare% 2 a NN come input, ma non voglio farlo; NN dovrebbe essere in grado di approssimare ogni funzione, incluso l'operatore modulo ( credo ). Che cosa sto facendo di sbagliato?


1
Sembra che tu stia provando ad approssimare la funzione "mod" con una rete neurale. Questa è una delle mie classi preferite di problemi: "quando è la cosa giusta per approssimare un pollo come una sfera". I modelli di elementi finiti sono un ottimo posto per questo. Quando chiedo questo alla rete neurale, mi piace pensare in termini di "base". Sappiamo che la risposta esatta contiene divisione per 2 e troncamento mentre la rete classica è la moltiplicazione vettoriale e le funzioni sigmoidali. Gli NN sono utilizzati al meglio per l'interpolazione, non per l'estrapolazione, quindi il dominio è limitato?
EngrStudent - Ripristina Monica il

4
Penso che la tua domanda sia più profonda della risposta attualmente accettata. Considera la seguente generalizzazione: costruisci una rete neurale (usando solo operazioni che possono verificarsi nel cervello) che calcolerebbe n mod k, dove n e k sono i suoi input. Mi chiedo se ciò sia possibile con una rete feedforward di dimensioni fisse.
user66081

Risposte:


7

Come per qualsiasi attività di apprendimento automatico, la rappresentazione dei tuoi input gioca un ruolo cruciale nel modo in cui apprendi e generalizzi.

Penso che il problema con la rappresentazione sia che la funzione (modulo) è altamente non lineare e non uniforme nella rappresentazione di input scelta per questo problema.

Vorrei provare quanto segue:

  1. Prova un algoritmo di apprendimento migliore (retro-propagazione / discesa del gradiente e sue varianti).

  2. Prova a rappresentare i numeri in binario usando una precisione a lunghezza fissa.

  3. Se la rappresentazione di input è un numero b-bit, assicurerei che il tuo set di allenamento non sia distorto verso numeri piccoli o grandi. Hanno numeri che sono uniformemente e indipendentemente scelti a caso nell'intervallo .[0,2B-1]

  4. Come hai fatto, usa una rete multi-layer (prova prima 2 layer: ovvero nascosto + output, prima di utilizzare più layer).

  5. Utilizzare un set di allenamento + test separato. Non valutare le tue prestazioni sul set di allenamento.


Pensavo che eseguire una trasformazione degli input come il calcolo del logaritmo naturale potesse essere prezioso.
EngrStudent - Ripristina Monica il

Potrebbe. In effetti, conoscendo la risposta qui (modulo 2 è solo l'ultimo bit), la rappresentazione binaria del numero grezzo funzionerebbe estremamente bene. Basta collegare l'ultimo bit di input all'output. :) Sarebbe interessante vedere se modulo (not-power-of-2) funziona bene con una rete neurale. Potrebbe anche non funzionare.
Vimal,

Ciao @Vimal, grazie per la risposta. Sai se rappresentare gli input in binario è sempre una buona idea o è solo stato utile in questo caso specifico?
Edgar Derby,

@AnnoysParrot - non ci sono "proiettili d'argento". Non esiste un'unica migliore rappresentazione universale perché la migliore può significare cose diverse e reciprocamente esclusive. La rappresentazione binaria è utile in questo caso, ma ci sono molti dove non lo è. Prendi in considerazione l'apprendimento approfondito dei dati visivi. Se avessi un neurone di input separato per ciascun bit di input univoco, avresti bisogno di circa 256 * 5,2 milioni di input per un'immagine da 5 Megapixel.
EngrStudent - Ripristina Monica il

2
Accetto con @EngrStudent qui. Molta conoscenza precedente va nella progettazione di una rappresentazione di input adatta e anche della stessa topologia di rete neurale. Poiché una rete neurale è approssimativamente un equivalente continuo e differenziabile di un circuito digitale, è possibile adattare la topologia della rete usando l'ispirazione dai circuiti digitali per addizione / moltiplicazione / divisione / modulo / ecc. Questo precedente sulla topologia (invece di uno strato completamente collegato) può portare ad un addestramento più rapido, una migliore generalizzazione, ecc., Proprio come il modo in cui le reti virtuali funzionavano bene per le immagini naturali.
Vimal,

6

Imparare a classificare numeri dispari e numeri pari è un problema difficile. Un modello semplice continua a ripetersi all'infinito. 2,4,6,8 ..... 1,3,5,7 .....

Le funzioni di attivazione non lineare come sin (x) e cos (x) si comportano in modo simile. Pertanto, se cambi i tuoi neuroni per implementare sin e cos invece di funzioni di attivazione popolari come tanh o relu, immagino che tu possa risolvere questo problema abbastanza facilmente usando un singolo neurone.

Le trasformazioni lineari precedono sempre le trasformazioni non lineari. Quindi un singolo neurone finirà per imparare il peccato (ax + b) che per la giusta combinazione di a & b produrrà 0 e 1 in alternativa nella frequenza desiderata che vogliamo che in questo caso sia 1.

Non ho mai provato peccato o cos nelle mie reti neurali prima. Quindi, mi scuso se finisce per essere una pessima idea.


5

Quindi sto lavorando con le reti neurali in questo momento e ho riscontrato lo stesso problema con te. Quello che ho finito per fare è stato rappresentare il numero di input come un array con valori uguali alla rappresentazione binaria del numero. Poiché ciò che stiamo facendo è la classificazione, ho rappresentato il mio output come un array, non un singolo valore. 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
]

Spero che sia di aiuto!


1
Esattamente Sulla base della sua risposta ho creato il modello qui stackoverflow.com/questions/53671491/...
prosti

Stupendo! Questo dimostra quanto la rappresentazione dei dati sia importante per qualsiasi algoritmo ML. Quando ho usato la rappresentazione decimale, ho ottenuto un'accuratezza del 50%, ma seguendo questa idea, ho ottenuto un'accuratezza del 100% anche su dati invisibili. Grazie. Ecco l'implementazione: colab.research.google.com/drive/…
Kaushal28

2
In binario, i numeri pari finiscono sempre in 0 e i numeri dispari finiscono sempre in 1. Non è sorprendente che il modello funzioni, poiché è probabile che abbia appena imparato a sputare il valore dell'ultima cifra.
Syncrossus,

2

Arrivo qui dove era difficile affrontare un problema simile. Quindi scrivo quello che sono riuscito.

Per quanto ne so, uno strato perceptron è in grado di risolvere ogni problema, che può essere alla fine semplificato per dividere gli oggetti in qualsiasi geometria usando una linea retta. E questo è questo tipo di problema. Se disegni l'ultimo bit di rappresentazione binaria su carta puoi anche disegnare una linea e tutti i numeri dispari sono su un lato e pari sull'altro. Per lo stesso motivo è impossibile risolvere il problema di xor con una rete di livello.

Ok. Questo problema sembra molto semplice, quindi facciamo un passo su Heaviside come funzione di attivazione. Dopo aver giocato un po 'con il mio numero mi sono reso conto che il problema qui è con il bias. Io google un po ', e quello che ho scoperto è che se rimani con la rappresentazione geometrica, la distorsione ti consente di cambiare il luogo di attivazione nel sistema di coordinate.

Problema molto educativo


1

È noto che le porte logiche NOT, AND, OR possono essere tutte eseguite con reti neurali molto semplici (NN) e che è possibile creare un calcolatore aritmetico completo con porte logiche utilizzando numeri binari come input. Quindi dovresti essere in grado di creare un NN per calcolare n modulo k, per tutti i numeri n e k espressi in base 2.

Se desideri calcolare n modulo k per un numero k fisso (ad esempio k = 4) puoi effettivamente creare un NN estremamente semplice che lo faccia: esprimi il numero di input n in base k e ignori tutte le cifre diverse dal rango più basso cifra e hai la risposta!


0

Un'idea che elude l'uso di "mod 2" esplicito nell'input potrebbe essere quella di codificare il numero come una sequenza di pixel, quindi il problema equivale a riconoscere se il segmento può essere diviso in due segmenti uguali. Questo è un problema di visione artificiale che può essere appreso dalle reti convenzionali.

Dall'altro estremo, se il numero è memorizzato come float, la domanda si riduce (o generalizza) per riconoscere quando un numero float è approssimativamente un numero intero.


Pensiero interessante. Puoi elaborare come desideri codificare il numero in pixel?
Jan Kukacka,

bene, pensa "base 1". Per codificare n, disegna una barra nera con n pixel. La mia ipotesi è che i kernel di convoluzione noteranno la differenza tra un numero dispari e un numero pari di pixel.
Arivero,

0

Ho creato una tale rete qui .

La rappresentazione che @William Gottschalk ha dato è stata la base.

Usa solo 1 neurone nel primo strato nascosto con 32 input. Il livello di output ha solo 2 neuroni per la codifica one-hot di 0 e 1.


0

La mia soluzione

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

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


Inoltre, anche dividere per altri numeri (diciamo 7) va bene:

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

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


Spiegazione:

Ottengo 2 soluzioni diverse. Entrambi sono buoni:
1. peccato come attivazione
2. piano (o int) come attivazione

È impossibile trovare i pesi migliori usando la discesa gradiente e utilizzo l'algoritmo genetico (da scikit-opt )


Ciao amico, benvenuto nel CV e grazie per la risposta dettagliata. Potete per favore aggiungere qualche spiegazione al codice che avete scritto?
Ferdi,

Ottengo 2 buone soluzioni, vedi qui , 1. peccato come attivazione 2. piano (o int) come attivazione
guofei9987
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.