Как написать нейросеть
Перейти к содержимому

Как написать нейросеть

  • автор:

Нейросеть с нуля своими руками. Часть 1. Теория

Здравствуйте. Меня зовут Андрей, я frontend-разработчик и я хочу поговорить с вами на такую тему как нейросети. Дело в том, что ML технологии все глубже проникают в нашу жизнь, и о нейросетях сказано и написано уже очень много, но когда я захотел разобраться в этом вопросе, я понял что в интернете есть множество гайдов о том как создать нейросеть и выглядят они примерно следующим образом:

  1. Берем Tensorflow
  2. Создаем нейросеть

Более подробная информация разбросана кусками по всему интернету. Поэтому я постарался собрать ее воедино и изложить в этой статье. Сразу оговорюсь, что я не являюсь специалистом в области ML или биологии, поэтому местами могу быть не точным. В таком случае буду рад вашим комментариям.

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

Так как это моя первая публикация, появляться они будут по мере прохождения модерации, после чего я добавлю ссылки на все части. Итак, приступим.

Для чего нужны нейросети

Нейросети встречаются везде. Основная их функция — это управление различными частями организма в зависимости от изменения окружающих условий. В качестве примера можно рассмотреть механизм сужения и расширения зрачка в зависимости от уровня освещения.

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

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

Устройство нейрона

Нейросети встречаются в природе в виде нервной системы того или иного существа. В зависимости от выполняемой функции и расположения, они делятся на различные отделы и органы, такие как головной мозг, спинной мозг, различные проводящие структуры. Но все их объединяет одно — они состоят из связанных между собой структурно-функциональных единиц — клеток нейронов.

Нейрон условно можно разделить на три части: тело нейрона, и его отростки — дендриты и аксон.

Дендриты нейрона создают дендритное дерево, размер которого зависит от числа контактов с другими нейронами. Это своего рода входные каналы нервной клетки. Именно с их помощью нейрон получает сигналы от других нейронов.

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

Аксон — это выходной интерфейс нейрона. Он крепится так называемыми синапсами к дендриту другого нейрона, и по нему сигнал, выходящий из тела нейрона, поступает к следующей клетке нашей нейросети.

Нейросети в IT

Что же, раз механизм нам понятен, почему бы нам не попробовать воспроизвести его с помощью информационных технологий?

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

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

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

Такой простейший вариант нейронной сети называется перцептрон, и именно его мы с вами и попробуем воссоздать.

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

Но в таком случае, получается, что все нейроны любого слоя будут получать одинаковый сигнал, и отдавать одинаковое значение. Таким образом мы могли бы заменить всю нашу сеть на один нейрон. Чтобы устранить эту проблему, мы присвоим входу каждого нейрона определенный вес. Этот вес будет обозначать насколько важен для каждого конкретного нейрона сигнал, получаемый от другого нейрона. И тут мы подходим к самому интересному.

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

То есть мы подаем на вход нейросети определенные данные, для которых мы знаем, каким должен быть результат. Далее мы сравниваем результат, который нам выдала нейросеть с ожидаемым результатом, вычисляем ошибку, и корректируем веса нейронов таким образом, чтобы эту ошибку минимизировать. И повторяем это действие большое количество раз для большого количества наборов входных и выходных данных, чтобы сеть поняла какие сигналы на каком нейроне ей важны больше, а какие меньше. Чем больше и разнообразнее будет набор данных для обучения, тем лучше нейросеть сможет обучиться и впоследствии давать правильный результат. Этот процесс называется обучением с учителем.

Добавим немного математики.

В качестве активационной функции нейрона может выступать любая функция, существующая на всем отрезке значений, получающихся на выходе нейрона и входных данных. Для нашего примера мы возьмем сигмоиду. Она существует на отрезке от минус бесконечности до бесконечности, плавно меняется от 0 до 1 и имеет значение 0,5 в точке 0. Идеальный кандидат. Выглядит она следующим образом:

Таким образом наш нейрон сможет принимать любую сумму значений всех входящих сигналов и на выходе будет выдавать значение от 0 до 1. Это хорошо подходит для принятия бинарных решений, и мы условимся, что если число на выходе нейросети > 0.5, мы будем расценивать его как истину, иначе — как ложь.

Итак, давайте рассмотрим пример с топологией сети рассмотренной выше. У нас есть три входных нейрона со значениями ИСТИНА, ЛОЖЬ и ИСТИНА соответственно, два нейрона в среднем слое нейросети (эти слои также называют скрытыми), и один выходной нейрон, который сообщит нам о решении, принятом нейросетью. Так как наша сеть еще не обучена, поэтому значения весов на входах нейронов мы возьмем случайными в диапазоне от -0,5 до 0,5.

Таким образом сумма входных значений первого нейрона скрытого слоя будет равна

1 * 0,43 + 0 * 0,18 + 1 * -0,21 = 0,22

Передав это значение в активационную функцию, мы получим значение, которое наш нейрон передаст далее по сети в следующий слой.

sigmoid(0,22) = 1 / (1 + e^-0,22) = 0,55

Аналогичные операции произведём для второго нейрона скрытого слоя и получим значение 0,60.

И, наконец, повторим эти операции для единственного нейрона в выходном слое нашей нейросети и получим значение 0,60, что мы условились считать как истину.

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

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

error = 0.60 — 0 = 0.60

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

Таким образом наша дельта весов будет равна

delta = 0.60 * (1 — 0.60) = 0.24

Новый вес для входа нейрона рассчитывается по формуле

weight = weight — output * delta * learning rate

Где weight — текущий вес, output — значение на выходе предыдущего нейрона, delta — дельта весов, которую мы рассчитали ранее и learning rate — значение, подбираемое экспериментально, от которого зависит скорость обучения нейросети. Если оно будет слишком маленьким — нейросеть будет более чувствительна к деталям, но будет обучаться слишком медленно и наоборот. Для примера возьмем learning rate равным 0,3. Итак новый вес для первого входа выходного нейрона будет равен:

w = 0,22 — 0,55 * 0,24 * 0,3 = 0,18

Аналогичным образом рассчитаем новый вес для второго входа выходного нейрона:

w = 0.47 — 0.60 * 0.24 * 0.3 = 0.43

Итак, мы скорректировали веса для входов выходного нейрона, но чтобы рассчитать остальные, нам нужно знать ошибку для каждого из нейронов нашей нейросети. Это делается не так очевидно как для выходного нейрона, но тоже довольно просто. Чтобы получить ошибку каждого нейрона нам нужно новый вес нейронной связи умножить на дельту. Таким образом ошибка первого нейрона скрытого слоя равна:

error = 0.18 * 0.24 = 0.04

Теперь, зная ошибку для нейрона, мы можем произвести все те же самые операции, что провели ранее, и скорректировать его веса. Этот процесс называется обратным распространением ошибки.

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

  • JavaScript
  • Программирование
  • Научно-популярное

Как написать простую нейросеть на Python

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

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

Основы нейронных сетей

В этом разделе мы расскажем основную информацию, связанную с нейронными сетями. А именно:

  • Архитектура нейронных сетей: рассмотрим основные типы архитектур нейронных сетей, такие как перцептрон, сверточные и рекуррентные нейронные сети, а также их применение.
  • Определение весов и смещений: рассмотрим, как нейронные сети извлекают признаки из входных данных, определяя веса и смещения, которые позволяют им делать выводы на основе этих признаков.
  • Функции активации: рассмотрим различные функции активации, которые используются в нейронных сетях, и их роль в управлении выводом нейронов.
  • Функции потерь и оптимизации: рассмотрим различные функции потерь, которые используются для измерения ошибки нейронной сети, а также различные методы оптимизации, которые используются для обновления весов и смещений нейронной сети в процессе обучения.

Архитектура нейронных сетей

Архитектура нейронных сетей описывает структуру нейронной сети и определяет, как она будет обрабатывать входные данные и выдавать выходные значения. Существует несколько типов архитектур нейронных сетей, каждый из которых предназначен для решения определенных задач.

Перцептрон

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

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

Сверточные нейронные сети

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

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

Рекуррентные нейронные сети

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

Определение весов и смещений

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

Для этого каждый нейрон в нейронной сети имеет свой вес и смещение. Веса определяют, насколько каждый входной параметр важен для определения выхода нейрона, а смещение позволяет нейрону изменять свой выход в зависимости от входных данных.

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

Функция активации

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

Существует несколько типов функций активации, но одной из самых популярных является функция ReLU (Rectified Linear Unit). Она имеет вид f(x) = max(0, x) и позволяет нейрону передавать значение, если оно положительно, а иначе – передавать нулевое значение.

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

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

Функции потерь и оптимизация

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

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

Существуют и другие методы оптимизации, такие как Adam и Adagrad, которые могут быть более эффективны в некоторых случаях. При выборе оптимизатора также следует учитывать задачу и характеристики данных.

Выбор правильной функции потерь и оптимизатора — это важный шаг при создании нейронной сети. Они должны быть выбраны в соответствии с задачей и характеристиками данных, чтобы обеспечить наилучшую производительность нейронной сети.

Создание простой нейросети на Python

Рассмотрим создание простой нейросети на Python для решения определенной задачи. Возьмем таблицу с 4 столбцами: 3 из них будут входами, а последний — выходом.

С чего начать свой путь в нейронные сети, или Ответы будущему AI-специалисту

Я Михаил Константинов — Senior Deep Learning Research Engineer в SQUAD. Специалист по глубокому обучению в области компьютерного зрения и обработки естественного языка. Долгое время занимался автоматическим прохождением капчи с использованием современных Deep Learning подходов, а также adversarial защитой капчи от нейронных сетей.

Здесь могло быть нудное вступление, но давайте попробуем перейти сразу к сути.

Хочу писать нейронные сети

Сразу ответьте себе на вопрос — зачем вам нужны нейронные сети? Я считаю, что это должен быть вопрос номер ноль. А, как вы знаете, у программистов все начинается с нуля. Я спрашиваю об этом всех своих студентов. Также это мой первый вопрос на собеседованиях, который я задаю еще до непосредственного знакомства с кандидатом. Ответить на него сложно, но если это сделать, то можно понять все внутренние мотивации, а это самое важное. Вам это нужно ради карьеры или ради научного интереса? Вы хотели бы заниматься ресерчем или стать Data Scientist’ом?

Что вам ближе: работа с табличными данными, компьютерное зрение или обработка естественного языка? Возможно, есть конкретные задачи или проекты, которые хотели бы взять на себя? Если дать себе честный ответ, станет намного яснее, к чему стремиться. И еще, как вы заметили, писать про знание Python и классических алгоритмов я, конечно, не буду.

Что дальше

Хотите выучить английский, переезжайте в Англию. Погрузите себя в среду. Это самое важное, что советуют для быстрого изучения иностранных языков. Правда, с языками проще, чем с изучением нейронных сетей. Тут можно начать смотреть фильмы с субтитрами (возможно, с двойными), обучаться, слушая речь актеров и обогащая словарный запас, запоминая конструкции. Можно. Вы знаете, что можно многое, но при чем тут машинное обучение и нейронные сети? Поступите похожим образом.

Подписывайтесь на тематические телеграм-каналы, чтобы быть в курсе новостей и трендов в машинном обучении. Например, «Мишин Лернинг» — мой субъективный телеграм-канал об искусстве машинного обучения, нейронных сетях и новостях из мира искусственного интеллекта. Пусть рекомендательная система будет на вашей стороне. Начните смотреть тематические видео на YouTube, чтобы видеть больше полезного контента, к примеру, лекцию «Нейронные сети: как их создают и где применяют?». Создайте свою среду сами. Подпишитесь на твиттер Andrew Ng. Вы ведь знаете, кто это?

Хочу написать крутую нейронную сеть

Сразу в бой? Что ж. Сначала поищите готовые решения, их уже миллионы, многие из них в открытом коде. Загуглите ту технологию или нейросеть, что вам интересна. Найдите ее код или уже готовый colab (ноутбук с кодом, который можно запускать прямо в твоем браузере) и проверьте, как эта сеть работает. Возможно, вам и не нужна собственная модель, не надо самим ее тренировать. Огромное количество продуктов делаются вокруг уже написанных и натренированных нейтронных сетей.

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

Нет, я хочу сам написать свою сеть с нуля и натренировать ее

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

С чего начать? Зайдите на сайт фреймворка Keras и посмотрите туториал по своей первой нейронной сети: тут вас ждет целое море нейросетей под разные задачи. Запускайте, пробуйте, тренируйте и тестируйте. Но, чтобы начать изменять готовые архитектуры и писать свои, нужно понимать, что именно в них происходит и почему они так устроены.

А как тогда начать изучать нейронные сети?

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

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

Скажи уже, какие книги купить?

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

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

Есть много прекрасных книг типа «Pattern Recognition and Machine Learning» Кристофера Бишопа и прочих. Но для старта я бы порекомендовал две (одну на русском, другую на английском): «Глубокое обучение. Погружение в мир нейронных сетей» — Сергей Николенко; «Deep Learning» — Ian Goodfellow, Yoshua Bengio, Aaron Courville.

Я получал удовольствие от этих книг, от их языка и подачи. Это просто маст-хэв в каждой библиотеке специалиста по машинному обучению. Но опять же учить ML только по книгам, думаю, — очень долгий и неоптимальный путь.

Я так понимаю, что курсы необходимы?

Да, именно это я имею в виду. Я считаю, что курсы — лучший способ быстро и, главное, последовательно двигаться в нужном направлении. Сейчас таких очень много.

Офлайн и онлайн-курсы имеют ряд своих преимуществ и недостатков. К плюсам онлайн-курсов можно отнести возможность проходить их в любое время и в свободном темпе. Формат требует, чтобы такие курсы были хорошо записаны. Да и не нужно ездить в метро туда и обратно. Минусы — отсутствие фидбэка, нет возможности задать вопрос и сразу получить на него ответ.

Офлайн-подход более классический, но он требует определенной привязки к расписанию. И если пропустить занятие и записи нет, то «все пропало». Ну а если запись есть, видео и звук там записаны идеально, то все равно нет ощущения присутствия на занятии.

Онлайн или офлайн

Зависит только от вас. От того, как вы лучше воспринимаете информацию, от вашего календаря. Но смотрите, не все ограничивается только онлайном или офлайном. Canon’ом или Nikon’ом. Не забывайте, что есть и Sony, и Fujifilm.

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

Курсовая работа моего студента Артема Валеева Sneakers StyleGan. Дизайн, цвет форма, да что там, каждый пиксель этих кроссовок был сгенерирован с помощью нейронной сети

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

Чтобы вы не выбрали (онлайн, офлайн или интерактивный онлайн), важен стиль, подход, темп, который будет оптимален именно для вас. И поэтому особенно внимательно выбирайте куратора. Нравится ли вам его речь, манера изложения? Где он работает, чем занимается? Подходит ли вам предлагаемый им формат?

На какие курсы стоит пойти

Я не боюсь выглядеть банально. По моему мнению, лучший курс для старта — онлайн-курс по Machine Learning от Andrew Ng. Не буду расписывать его плюсы, иначе мы погрязнем в тексте на несколько страниц. Это лучший онлайн-курс! Из минусов лишь то, что он относительно не новый, а также ведется на языке Octave/Matlab, который в этой сфере полностью уступил Python.

Кроме того, на Coursera есть множество специализаций от deeplearning.ai, которые подойдут для последующего продолжения обучения. Например, по Deep Learning или TensorFlow, где серия курсов рассчитана на более глубокое, если можно так выразиться о Deep Learning, погружение в сам фреймворк. Появилась и новая специализация по GAN, которая подойдет специалистам, продолжающим свой путь и желающим овладеть искусством генеративно-состязательных сетей. И как я писал в первом пункте, не забывайте про YouTube. Там полно прекрасных материалов — от обычных разборов статей энтузиастами в сфере машинного обучения до лекций по теме от преподавателей Стэнфорда и MIT. Еще рекомендую курс Introduction to Deep Learning, отличный украинский онлайн-курс по Data Science и нейронным сетям.

Офлайн-курсы стоит искать у себя в регионе: смотрите отзывы, читайте о преподавателе. Если есть возможность найти интерактивный онлайн, то, кроме преимуществ офлайна и куратора вместо лектора, чаще всего вы получаете более качественные занятия благодаря высокой конкуренции в онлайн-пространстве.

Желаю вам удачи! И запомните: все зависит от вас, вашей мотивации и усидчивости.

�� Подобається Сподобалось 4

До обраного В обраному 13

Как написать лингвистическую нейросеть?

Мне нужно написать нейросеть которая находит общий смысл между словами и выражает его кратко например:

Переноска для собак, водонепроницаемая сумка для собак, корзина, товары для домашних животных, безопасная переноска для дома, сумка для щенков, собачье автомобильное сиденье

Автокресло для животных

База данных для обучения у меня есть. Все что остается это создать архитектуру нейросети , может у кто нибудь натыкался на статьи и туториалы по данной теме или кто то вообще знает как реализовать архитектуру, буду рад любой помощи!

  • python-3.x
  • нейронные-сети
  • машинное-обучение
  • tensorflow
  • искусственный-интеллект

Отслеживать
задан 23 июн 2019 в 14:28
73 6 6 бронзовых знаков

Хм, а что общего — с точки зрения здрвого смысла — между «водонепроницаемой сумки» и «автокреслом»? Про то, что «безопасная переноска» — это вообще-то говоря из разряда электротоваров — я скромно умолчу.

23 июн 2019 в 17:06

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

23 июн 2019 в 17:56

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

import sys import numpy as np import pickle import re from Stemmer import Stemmer from sklearn.feature_extraction.text import TfidVectorizer from sklearn.linear_model import SGDClassifier from sklearn.pipeline import Pipeline from sklearn.metrics import accuracy_score def text_cleaner(text): text = text.lower() stemmer = Stemmer('russian') text = ' '.join( stemmer.stemWords(text.split() ) ) text = re.sub( r'\b\d+\b', ' digit ', text ) return text def load_data(): data = < 'text':[],'tag':[] >for line in open('learning.txt'): if(not('#' in line)): row = line.split("@") data['text'] += [row[0]] data['tag'] += [row[1]] return data def train_test_split( data, validation_split = 0.1): sz = len(data['text']) indices = np.arange(sz) np.random.shuffle(indices) X = [ data['text'][i] for i in indices ] Y = [ data['tag'][i] for i in indices ] nb_validation_samples = int(validation_split * sz) return < 'train': < 'x': X[:- nb_validation_samples], 'y': Y[:- nb_validation_samples] >, 'text': > def openai(): data = load_data() D = train_test_split( data ) text_clf = Pipeline([ ('tfidf',TfidVectorizer()), ('clf',SGDClassifier(loss='hinge')), ]) text_clf.fit(D['train']['x'], D['train']['x'] ) z=input('Введите слова через запятую и пробел: ') zz=[] zz.append(z) predicted = text_clf.predict(zz) print(predicted[0]) if __name__ == '__main__': sys.exit(openai()) 

создаёшь текстовик в той же директории, что и код, под названием
learning.txt туда заносишь обучающую базу по шаблону:

Запрос @ Правильный_ответ 

Отслеживать
ответ дан 13 июл 2019 в 17:33
795 5 5 серебряных знаков 18 18 бронзовых знаков

  • python-3.x
  • нейронные-сети
  • машинное-обучение
  • tensorflow
  • искусственный-интеллект
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *