Обучите нейронную сеть, чтобы различать четные и нечетные числа

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
Кажется, вы пытаетесь приблизить функцию «мод» с нейронной сетью. Это один из моих любимых классов задач - «когда правильно подходить к курице как к сфере». Модели с конечными элементами - отличное место для этого. Когда я спрашиваю об этой нейронной сети, мне нравится думать в терминах «основы». Мы знаем, что точный ответ содержит деление на 2 и усечение, в то время как классическая сеть - это векторное умножение и сигмоидальные функции. NN лучше всего использовать для интерполяции, а не для экстраполяции - так ограничен ли ваш домен?
EngrStudent - Восстановить Монику
4
Я думаю, что ваш вопрос идет глубже, чем принятый в настоящее время ответ. Рассмотрим следующее обобщение: построим нейронную сеть (используя только те операции, которые можно ожидать в мозге), которая вычислит n mod k, где n и k - ее входные данные. Интересно, возможно ли это с сетью прямой связи фиксированного размера.
user66081

Ответы:

7

Как и в любой задаче машинного обучения, представление вашего вклада играет решающую роль в том, насколько хорошо вы учитесь и обобщаете.

Я думаю, проблема с представлением состоит в том, что функция (по модулю) сильно нелинейна и не является гладкой во входном представлении, которое вы выбрали для этой задачи.

Я бы попробовал следующее:

  1. Попробуйте лучший алгоритм обучения (обратное распространение / градиентный спуск и его варианты).

  2. Попробуйте представить числа в двоичном формате, используя фиксированную точность длины.

  3. Если ваше входное представление является b-битным числом, я бы позаботился о том, чтобы ваш тренировочный набор не был смещен в сторону малых или больших чисел. Имеют числа, которые равномерно и независимо выбираются случайным образом из диапазона .[0,2б-1]

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

  5. Используйте отдельный тренинг + тестовый набор. Не оценивайте свои результаты на тренировочном наборе.

Vimal
источник
Я думал, что выполнение преобразования входных данных, таких как вычисление натурального логарифма, может быть полезным.
EngrStudent - Восстановить Монику
Это может. Фактически, зная ответ здесь (по модулю 2 - только последний бит), двоичное представление необработанного числа будет работать очень хорошо. Просто подключите последний бит ввода к выходу. :) Было бы интересно посмотреть, хорошо ли работает модуль (не-сила-2) с нейронной сетью. Это может не сработать.
Вимал
Привет @Vimal, спасибо за ответ. Знаете ли вы, является ли представление входных данных в двоичном коде всегда хорошей идеей или это оказалось полезным в данном конкретном случае?
Эдгар Дерби
@ AnnoysParrot - «серебряных пуль» нет. Не существует единого универсального лучшего представления, потому что лучшее может означать разные и взаимоисключающие вещи. Двоичное представление полезно в этом случае, но есть много, где это не так. Рассмотрим глубокое изучение визуальных данных. Если бы у вас был отдельный входной нейрон для каждого уникального входного бита, вам понадобилось бы около 256 * 5,2 миллиона входов для 5-мегапиксельного изображения.
EngrStudent - Восстановить Монику
2
Согласитесь с @EngrStudent здесь. Многие предварительные знания ушли на разработку подходящего входного представления, а также самой топологии нейронной сети. Поскольку нейронная сеть представляет собой непрерывный, дифференцируемый эквивалент цифрового канала, вы можете адаптировать топологию сети, используя вдохновение из цифровых каналов для сложения / умножения / деления / по модулю / и т. Д. Это до топологии (вместо полностью связного слоя) может привести к более быстрому обучению, лучшему обобщению и т. Д., Очень похоже на то, как хорошо работают коннететы для естественных изображений.
Вимал
6

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

Нелинейные функции активации, такие как sin (x) и cos (x), ведут себя аналогично. Поэтому, если вы измените свои нейроны для реализации sin и 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
Superb! Это показывает, как представление данных важно для любого алгоритма ML. Когда я использовал десятичное представление, я получил точность ровно 50%, но, следуя этой идее, я получил точность 100% даже на невидимых данных. Благодарю. Вот реализация: colab.research.google.com/drive/…
Kaushal28
2
В двоичном коде четные числа всегда заканчиваются на 0, а нечетные числа всегда заканчиваются на 1. Неудивительно, что модель работает, поскольку вполне вероятно, что она только что научилась выплевывать значение последней цифры.
Синкросс
2

Я попал сюда, где была борьба с подобной проблемой. Поэтому я пишу, что мне удалось.

Насколько я знаю, один слой персептрона способен решить любую проблему, которая в конце может быть упрощена для разделения объектов в любой геометрии с использованием прямой линии. И это такая проблема. Если вы рисуете последний бит двоичного представления на бумаге, вы также можете нарисовать линию, и все нечетные числа находятся на одной стороне, а четные - на другой. По этой же причине невозможно решить проблему XOR с сетью одного уровня.

Ok. Эта проблема выглядит очень простой, поэтому давайте сделаем шаг Хевисайда в качестве функции активации. После того, как я немного поиграл со своим номером, я понял, что проблема здесь в предвзятости. Я немного погуглил, и обнаружил, что если вы останетесь с геометрическим представлением, смещение позволит вам изменить место активации в системе координат.

Очень образовательная проблема

user3486361
источник
1

Хорошо известно, что логические вентили NOT, AND, OR можно выполнять с очень простыми нейронными сетями (NN) и что вы можете построить полный арифметический калькулятор с логическими вентилями, используя двоичные числа в качестве входных данных. Следовательно, вы должны иметь возможность создать NN для вычисления n по модулю k для любых n и k чисел, выраженных в базе 2.

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

Бернард Монтарон
источник
0

Одна идея, уклоняющаяся от использования явного «mod 2» во входных данных, может состоять в том, чтобы кодифицировать число как последовательность пикселей, тогда проблема состоит в том, чтобы распознать, можно ли разделить сегмент на два равных сегмента. Это проблема машинного зрения, которая может быть изучена обычными сетями.

С другой стороны, если число хранится как число с плавающей запятой, вопрос сводится (или обобщается) к распознаванию, когда число с плавающей запятой приблизительно равно целому числу.

arivero
источник
Интересная мысль. Можете ли вы уточнить, как бы вы хотели кодировать число в пикселях?
Ян Кукацка
ну, подумайте "база 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 )

guofei9987
источник
Привет, добро пожаловать в резюме и спасибо за подробный ответ. Не могли бы вы добавить пояснения к написанному вами коду?
Ферди
Я получаю 2 хороших решения, см. Здесь , 1. грех как активация 2. floor (или int) как активация
guofei9987