Почему порядок данных имеет значение для нейронной сети?

Недавно я обнаружил действительно странное поведение моей модели ИИ. Я хотел построить модель ИИ, которая попыталась бы угадать неявные функции на основе данных, которые я ей предоставил. Например, уравнение цветка:

И вот как я записал это в массиве Numpy:

K = 0.75
a = 9

def f(x):
    return x - 2 - 2*np.floor((x - 1)/2)

def r1(x):
    return abs(6 * f(a * K * x / 2 / np.pi)) - a/2
    
t = np.linspace(0, 17 * math.pi, 1000)
x = np.cos(t) * r1(t)
y = np.sin(t) * r1(t)

points = np.vstack((x, y)).T

После этого я попробовал немного поэкспериментировать и позволил своему ИИ угадать форму этого цветка! С первой попытки все действительно было написано.

Вот:

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

И я не мог объяснить, почему порядок декартовых координат имеет значение для приближенной неявной функции цветка. Может ли кто-нибудь объяснить это?

Вот код для AI.

# Define the neural network model
model = Sequential()
model.add(Dense(128, input_dim=2, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(2, activation='linear'))

# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')

# Train the model
model.fit(points, points, epochs=100, batch_size=32)

Решено, так что на самом деле проблема заключалась в том, как я рисовал реальный результат работы ИИ. На самом деле Ай хорошо обобщил это, но, поскольку точки были перетасованы, matplotlib просто соединил точки не по порядку и получил странные результаты.

NikoMolecule 30.07.2024 14:42

Не могли бы вы исправить/исправить утверждения «позволил моему ИИ на самом деле попытаться угадать форму» и «Приблизительная форма», чего на самом деле не произошло? Правильный текст может быть таким: «Как Matplotlib соединил заданный список точек», а может быть и нет?

user3666197 30.07.2024 15:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Решено, так что на самом деле проблема заключалась в том, как я рисовал реальный результат работы ИИ. На самом деле Ай хорошо обобщил это, но, поскольку точки были перетасованы, matplotlib просто соединил точки не по порядку и получил странные результаты.

Не могли бы вы доказать это утверждение? Лучше всего опубликовать полный код, а также запустить и опубликовать результаты «предсказывающей» модели со случайным порядком входных точек сетки [x_i, y_i] для некоторых тестовых случаев 1E9, охватывающих 2D-домены (-1E1, + 1E1), ( -1E401, -1E400 ), ( -1E-400, +1E-400 ), чтобы увидеть фактический уровень «правильности» модели как есть. В любом случае, наслаждайтесь будущим :о)

user3666197 30.07.2024 15:10

ну, зачем мне включать такие большие значения, если исходная функция не распространяется на эти пределы @user3666197

NikoMolecule 30.07.2024 21:25

Цель состоит в том, чтобы действительно проверить, хорошо ли «обученный» предсказатель преуспевает в реальных ситуациях (реальный мир не курирует «академически» наивные наборы данных, а как раз наоборот — сигналы тревоги НАСА «Аполлон-11» о посадке на Луну (были очень близки) до крушения или очистки миссии с очернением пролета и возвращением обратно на Землю) был кристально ясным примером того, как «академически»-наивные «испытания»-(только предварительно обработанные)-примеры могут убить весь экипаж. То же самое и здесь. если вы при обучении не привели примеров из этих областей (чего вы не сделали), тем более ответственно вы должны протестировать, что выйдет «выходом наружу», если вас об этом попросят .predict()...

user3666197 30.07.2024 21:45
Ответ принят как подходящий

На самом деле, это вопрос сюжета. Порядок в сюжете имеет значение, а порядок в разбросе нет:

import matplotlib.pyplot as plt

shuffled_points = np.random.permutation(points)

plt.scatter(*points.T)          # in .scatter()-method POINT-s are depicted
plt.scatter(*shuffled_points.T) # in .scatter()-method order does NOT matter

plt.plot(*points.T, color = "r")  # in .plot()-method interpolator follows the order
plt.plot(*shuffled_points.T, color = "r") #    method creates a SEQUENCE of LINEs

Правильно ли я прочитал, что вы «тестируете» обученную модель не чем иным, как точками, по которым она была «обучена»? На каком университетском курсе этому учили? Проверка «предсказывающих» способностей «обученной» модели должна предоставить такую ​​модель с еще не увиденными данными (не просто тем же набором, просто в другом порядке появления), не так ли? Не могли бы вы улучшить свой ответ фактическими результатами настоящего тестирования, как указано в stackoverflow.com/questions/78811505/… ?

user3666197 30.07.2024 15:29

Не придавайте этому большого значения. Проблема ОП связана с Matplotlib, а не с ML. Не стесняйтесь «улучшить» ответ ;)

Timeless 30.07.2024 15:32

Нарисуйте хотя бы .scatter() из на самом деле predicted_points...

user3666197 30.07.2024 15:37

Обновил ответ, удалив предсказание встретиться с вами на полпути. Лучше не получится ;)

Timeless 30.07.2024 15:45

@ user3666197 Основная цель ИИ — аппроксимировать функцию и нарисовать какую-то фигуру на основе заданных точек.

NikoMolecule 30.07.2024 21:26

При всём уважении, не так. Как указано в исходном коде, «ИИ» не тестировался ни в одной другой точке, кроме тех, которые были «обучены» (что неудивительно) и «соответствовали» функции (поэтому не имея контрпримеров, нет была предпринята попытка увидеть, насколько хорошо или плохо модель «обобщала» обученный набор данных). Исходный код рисует точки (в .scatter()-методе) или интерполированные линии (в .plot()-методе), но ни первое, ни второе не было результатом модели ИИ, только стандартный вывод из Matplotlib, модель ИИ не имеет подсказка «формы», она видела точки.

user3666197 30.07.2024 21:54

@user3666197 user3666197 ну, как следует составлять данные тестирования для точек, которые представляют некоторую неявную функцию?

NikoMolecule 30.07.2024 21:56

Как было описано здесь - stackoverflow.com/users/3666197/user3666197 Если обученный преобразователь (2-в-2-выход) действительно покрывает «правильные» переводы во всех таких доменах, вы можете быть уверены, что он работает. Если он генерирует мусор или выходит из строя, лучше знать об этом, прежде чем он «убьет следующую команду», как объяснялось выше — это справедливо, не так ли? Кто захочет еще раз повторить какую-либо ошибку, допущенную НАСА? Никогда не знаешь, кто будет экипажем, которого «(не) убьют снова», не так ли?

user3666197 30.07.2024 22:04

@user3666197 user3666197 о, спасибо за замечание! Я допустил критическую ошибку, мне следует сопоставить координаты с одним выходом, потому что по определению неявная функция — это такая функция, что F(r1, r2, r3 .... rn) = 0

NikoMolecule 30.07.2024 22:08

Другие вопросы по теме