Тренуйте нейронну мережу, щоб розрізняти парні та непарні числа


14

Питання: чи можна навчити NN розрізняти непарні і парні числа, використовуючи лише як введення самих числа?

У мене є такий набір даних:

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

Я тренував NN з двома вхідними нейронами (один - змінною числом, другий - зсувом нейроном), дев'ятьма нейронами у прихованому шарі та одним вихідним нейроном, використовуючи дуже простий генетичний алгоритм: у кожну епоху два набори ваг "борються" "один проти одного; той, який має найбільшу помилку, втрачає, і його замінює модифікована версія переможця.

Сценарій легко вирішує прості проблеми, такі як оператори AND, OR або XOR, але застрягають при спробі класифікувати непарні і парні числа. Наразі найкраще це вдалося зробити - це визначити 53 числа зі 100, і це зайняло кілька годин. Незалежно від того, нормалізую я чи ні введення, схоже, це не має ніякого значення.

Якби я хотів обдурити, я міг би попередньо обробити дані і подати% 2 до NN як вхід, але я не хочу цього робити; NN повинен мати можливість наближати кожну функцію, включаючи оператор модуля (я вважаю ). Що я роблю неправильно?


1
Здається, ви намагаєтеся наблизити функцію "mod" до нейронної мережі. Це один з моїх улюблених занять проблеми - "коли правильно визначити курку як сферу". Моделі з кінцевими елементами - чудове місце для цього. Запитуючи це про нейронну мережу, я люблю думати про "основу". Ми знаємо, що точна відповідь містить ділення на 2 та усічення, тоді як класична мережа - це векторне множення та сигмоподібні функції. NN найкраще використовувати для інтерполяції, а не для екстраполяції - так чи обмежений ваш домен?
EngrStudent

4
Я думаю, що ваше запитання йде глибше, ніж прийнята зараз відповідь. Розглянемо наступне узагальнення: побудуйте нейронну мережу (використовуючи лише ті операції, які, як можна очікувати, відбудуться в головному мозку), які б обчислили n mod k, де n і k - її входи. Цікаво, чи можливо це за допомогою нової мережі фіксованого розміру.
user66081

Відповіді:


7

Як і у будь-якому завданні машинного навчання, представлення вашого вкладу відіграє вирішальну роль у тому, наскільки добре ви навчаєтесь та узагальнюєте.

Я думаю, що проблема представлення полягає в тому, що функція (модуль) дуже нелінійна і не є рівною у вхідному поданні, яке ви вибрали для цієї проблеми.

Я б спробував таке:

  1. Спробуйте кращий алгоритм навчання (спуск назад / схил градієнта та його варіанти).

  2. Спробуйте представити числа у двійкових, використовуючи точність фіксованої довжини.

  3. Якщо ваше вхідне представлення - це бітове число, я б переконався, що ваш навчальний набір не є упередженим щодо малих чи великих чисел. Мати числа, які однаково і незалежно вибираються навмання з діапазону .[0,2b1]

  4. Як ви зробили, використовуйте багатошарову мережу (спробуйте спочатку 2 шари: тобто прихований + вихід, перш ніж використовувати більше шарів).

  5. Використовуйте окремий навчальний + тестовий набір. Не оцінюйте свою роботу на навчальному наборі.


Я думав, що здійснення перетворення на таких входах, як обчислення природного логарифму, може бути цінним.
EngrStudent

Це могло б. Насправді, знаючи відповідь тут (модуль 2 - лише останній біт), двійкове представлення необробленого числа працювало б надзвичайно добре. Просто підключіть останній біт входу до виводу. :) Було б цікаво подивитися, чи добре працює модуль (не потужність-2) з нейронною мережею. Це також може не працювати.
Vimal

Привіт @Vimal, дякую за відповідь. Чи знаєте ви, чи завжди представлення вхідних даних у двійковій справі є гарною ідеєю або це просто було корисним у цьому конкретному випадку?
Едгар Дербі

@AnnoysParrot - "срібних куль" немає. Не існує єдиного універсального найкращого представництва, оскільки найкраще може означати різні та взаємовиключні речі. Бінарне представлення корисне в цьому випадку, але є багато, де його немає. Розглянемо глибоке вивчення візуальних даних. Якщо у вас був окремий вхідний нейрон для кожного унікального вхідного біта, вам знадобиться близько 256 * 5,2 мільйонів входів для зображення 5 Мп.
EngrStudent

2
Погодьтеся з @EngrStudent тут. Багато попередніх знань входить в розробку відповідного вхідного подання, а також на саму топологію нейронної мережі. Оскільки нейронна мережа є приблизно суцільним, диференційованим еквівалентом цифрового кола, ви можете адаптувати топологію мережі, використовуючи натхнення з цифрових схем для додавання / множення / ділення / модуля / тощо. Це попереднє значення для топології (замість повністю пов'язаного шару) може призвести до швидшої підготовки, кращого узагальнення тощо.
Vimal

6

Навчитися класифікувати непарні числа і парні числа - це складна проблема. Простий шаблон постійно повторюється нескінченно. 2,4,6,8 ..... 1,3,5,7 .....

Нелінійні функції активації, такі як sin (x) та cos (x), поводяться аналогічно. Тому, якщо ви зміните свої нейрони на реалізацію sin and cos замість популярних функцій активації, таких як tanh або relu, я думаю, ви можете вирішити цю проблему досить легко, використовуючи один нейрон.

Лінійні перетворення завжди передують нелінійним перетворенням. Таким чином, один нейрон в кінцевому підсумку вивчить гріх (ax + b), який для правильної комбінації a & b виведе 0 і 1 в альтернативному варіанті в бажаній частоті, яку ми хочемо, що в цьому випадку дорівнює 1.

Я ніколи раніше не випробовував гріх чи союз у своїх нейронних мережах. Отже, вибачте, якщо це в кінцевому підсумку є дуже поганою ідеєю.


5

Тож я зараз працюю з нейронними мережами, і я зіткнувся з тим же питанням, що і ви. Що я в кінцевому підсумку робив - представляв вхідне число як масив зі значеннями, рівними двійковому поданню числа. Оскільки те, що ми робимо, це класифікація, я представляв свій результат як масив, а не єдине значення. колишній:

input = [
  [0, 0, 0, 1], // 1
  [0, 0, 1, 0], // 2
  [0, 0, 1, 1], // 3
  [0, 1, 0, 0]  // 4
]
output = [
  [1, 0], // odd
  [0, 1], // even
  [1, 0], // odd
  [0, 1]  // even
]

Сподіваюся, це допомагає!


1
Саме на основі вашої відповіді я створив модель в тут stackoverflow.com/questions/53671491 / ...
PrOSTi

Чудово! Це показує, як представлення даних є важливим для будь-якого алгоритму ML. Коли я використовував десяткове представлення, я отримав рівно 50% точності, але, слідуючи цій ідеї, я отримав 100% точність навіть на невидимих ​​даних. Спасибі. Ось реалізація: colab.research.google.com/drive/…
Kaushal28

2
У двійкових, парні числа завжди закінчуються на 0, а непарні числа завжди закінчуються на 1. Це не дивно, що модель працює, оскільки, ймовірно, вона просто навчилася виплювати значення останньої цифри.
Syncrossus

2

Я потрапляю сюди, де була боротьба з подібною проблемою. Тому я пишу те, що мені вдалося.

Наскільки мені відомо, один шар персептрон здатний вирішити кожну проблему, яку в кінці можна спростити ділити об'єкти в будь-якій геометрії за допомогою прямої лінії. І це така проблема. Якщо ви малюєте останній бітний бінарний подання на папері, ви також можете намалювати лінію, і всі непарні номери знаходяться на одній стороні, і навіть на іншій. З тієї ж причини неможливо вирішити задачу xor за допомогою одношарової мережі.

Добре. Ця проблема виглядає дуже просто, тому давайте можемо зробити крок Heaviside як функцію активації. Після того, як я трохи пограв зі своїм номером, я зрозумів, що тут проблема полягає в упередженості. Я трохи гугл, і я виявив, що якщо ви залишаєтесь із представленням геометрії, упередження дозволять вам змінити місце активації в системі координат.

Дуже освітня проблема


1

Добре відомо, що логічні ворота НЕ, А АБО все можна зробити за допомогою дуже простих нейронних мереж (NN), і що ви можете побудувати повний арифметичний калькулятор з логічними воротами, використовуючи для введення двійкові числа. Тому ви повинні мати можливість створити NN для обчислення n модуля k для будь-яких чисел n і k, виражених у базі 2.

Якщо ви хочете обчислити n модуль k для фіксованого числа k (наприклад, k = 4), ви можете створити надзвичайно простий NN, який робить це: виразити вхідне число n у базовому k та ігнорувати всі цифри, окрім найнижчого рангу цифра, і у вас є відповідь!


0

Одна ідея, що уникає використання явного "mod 2" у вході, може полягати в кодифікації числа як послідовності пікселів, тоді проблема полягає в тому, щоб визнати, чи можна поділити сегмент на два рівні сегменти. Це проблема машинного зору, яку можна дізнатися за допомогою звичайних мереж.

З іншого боку, якщо число зберігається як плаваюче, питання зменшує (або узагальнює), щоб визнати, коли число з плавкою є приблизно цілим числом.


Цікава думка. Чи можете ви пояснити, як би ви хотіли зашифрувати число в пікселі?
Ян Кукацька

ну, подумайте "база 1". Щоб кодувати n, намалюйте чорну смугу, що має n пікселів. Я думаю, що ядра згортки помітять різницю між непарною та парною кількістю пікселів.
аріверо

0

Я створив таку мережу тут .

Основою було представництво @William Gottschalk.

Він просто використовує 1 нейрон в першому прихованому шарі з 32 входами. Вихідний шар містить всього 2 нейрони для однокольорового кодування 0 і 1.


0

Моє рішення

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 2 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 2:{}'.format(x, y_hat == 0))

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


Більше того, добре розділити і на інші числа (скажімо, 7):

import numpy as np


def layer_1_z(x, w1, b1):
    return 1 / w1 * x + b1


def layer_2(x, w1, b1, w2, b2):
    y1 = layer_1_z(x, w1, b1)
    y2 = y1 - np.floor(y1)
    return w2 * y2 + b2


def layer_2_activation(x, w1, b1, w2, b2):
    y2 = layer_2(x, w1, b1, w2, b2)
    # return 1 / (1 + np.exp(-y2))
    return (y2 > 0) * 1


def loss(param):
    w1, b1, w2, b2 = param
    x = np.arange(0, 1000, 1)
    y_hat = layer_2_activation(x, w1, b1, w2, b2)
    y_true = (x % 7 > 0) * 1
    return sum(np.square(y_hat - y_true))


# %%

from sko.GA import GA

ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

for x in range(1001, 1200):
    y_hat = layer_2_activation(x, *best_x)
    print('input:{},divide by 7:{}'.format(x, y_hat == 0))

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


Пояснення:

Я отримую 2 різні рішення. І те і інше добре:
1. гріх як активація
2. підлога (або int) як активізація

Неможливо знайти найкращі ваги за допомогою градієнтного спуску, і я використовую генетичний алгоритм (від scikit-opt )


Привіт, людина, ласкаво просимо до резюме та дякую за детальну відповідь. Чи можете ви додати трохи пояснення до написаного вами коду?
Ферді

Я отримую 2 хороших рішення, дивіться тут , 1. гріх як активація 2. підлога (або int) як активація
guofei9987
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.