Pull to refresh

Comments 23

Отличная статья, спасибо!


Глаз зацепился за padding='same', я даже собрался вам написать об ошибке на краях, а у вас дальше такой классный разбор :)

Это перевод. Делал сам нечто подобное. С padding='same' точность достигает порядка 91%. Не знаю, как автор получил 98%.

Хм… а сможет ли сеть делать предсказания на несколько шагов вперед за время выше чем классический алгоритм игры жизнь?

За время меньше? Теоретически — да. Если скорость предсказания выше (например, за счет аппаратуры, когда сеть на GPU, алгоритм на CPU, либо за счет оптимизаций), а пересчет всего поля сетью ведется параллельно.
Моделировать такой простой детерминированный алгоритм нейросеткой — это как то грустно, хотя я и не специалист чтобы судить.
А если попробовать скармливать в обучающем наборе последующий шаг как input и требовать от нейросети предыдущий как output?(тогда наверное все поле должно быть в качестве input layer). Получится ли таким способом искать сады Эдема?
Моделировать такой простой детерминированный алгоритм нейросеткой — это как то грустно, хотя я и не специалист чтобы судить.

Смотрите эпиграф.


А если попробовать скармливать в обучающем наборе последующий шаг как input и требовать от нейросети предыдущий как output?

Имеется ввиду, предсказывать временной ряд?


(тогда наверное все поле должно быть в качестве input layer). Получится ли таким способом искать сады Эдема?

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

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


Рекурсия — это всё же вызов функцией самой себя («Рекурсия: см. Рекурсия»). В данном случае просто повторное применение правил, чтобы получить новое поколение.

Состояние задается рекуррентной формулой


state(T) = transition(state(T - 1)), state(0) = state_0

Функция state(t) вполне себе рекурсивная

А почему filters=50? Как подбирался этот параметр? Что-то мне подсказывает, что можно сильно меньше взять, без просадки точности. Тоже и к другим параметрам относится.

Напомню, что это перевод. Но параметр, вероятно, подбирался эмпирически. Некоторые параметры очевидно, почему такие, например размер ядра 3x3 — потому, что клетка в центре зависит от соседей по бокам.

А метка «Перевод» не указана. Поэтому создается впечатление, что это собственная наработка.
А сразу на несколько шагов сеть может предсказать, без промежуточных шагов?

Да, но это уже является предсказанием временного ряда, и количество пропущенных шагов сетки зависит от того, насколько сдвинуто окно предсказания: там есть свои особенности.

Решение самой «Жизни» есть куда более красивое) Взято с
def iterate(Z):
    # Count neighbours
    N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +
         Z[1:-1,0:-2]                + Z[1:-1,2:] +
         Z[2:  ,0:-2] + Z[2:  ,1:-1] + Z[2:  ,2:])

    # Apply rules
    birth = (N == 3) & (Z[1:-1,1:-1]==0)
    survive = ((N == 2) | (N == 3)) & (Z[1:-1,1:-1] == 1)
    Z[...] = 0
    Z[1:-1,1:-1][birth | survive] = 1
    return Z

Что такое model.predict_classes? Не нашел описания на сайте keras.io. Я так понял, статья довольно старая, т.к. на том-же keras.io и в книге самого Шолле активация уже не выделяется в отдельный слой, а передается параметром слоя.
Что такое model.predict_classes? Не нашел описания на сайте keras.io.

https://kite.com/python/docs/tensorflow.keras.Sequential.predict_classes


Я так понял, статья довольно старая, т.к. на том-же keras.io и в книге самого Шолле активация уже не выделяется в отдельный слой, а передается параметром слоя.

Нет, вывод неверный. Статья от 02.2019. Активацию возможно указать без отдельного слоя года с 2016, если не ошибаюсь, тут видимо привычка.

Похоже либо пропущена нелинейность либо промежуточный слой лишний:
model.add(Dense(hidden_dims))
model.add(Dense(1))


без нелинейности после первого уровня оба уровня заменяются одним Dense(1)

Да, похоже вы правы. Без нелинейности два слоя возможно свести к линейной функции, которую может представить и один слой. Разве что, параметров больше.
Но у автора так, видимо он забыл.
Добавление активации (например, 'tanh') немного улучшает качество предсказания.

Sign up to leave a comment.

Articles