Автор оригинала: Pankaj Kumar.
Строительство единой нервной сети PercePtron
Добро пожаловать. Сегодня мы собираемся покрыть, как построить базовую неверную нейронную сеть PercePtron.
Я хочу сделать это первым из серии статей, в которых мы углубляемся во все – CNNS, обучение для передачи и т. Д. Так что обязательно вкладывайте сайт и продолжайте проверять его. Кроме того, это будет включать в себя немного математики, поэтому ремень в.
Что такое перцептрон?
Это самая фундаментальная единица нейронной сети (NN). В комплексе Nn все данные проходят через несколько из них, часто одновременно и выполняют разные роли. Но мы доберемся до этого позже.
На данный момент, что такое перцептрон?
В надзоренном обучении PercePtron является формой линейного классификатора. Таким образом, любой набор данных, который можно разделить на одну прямую линию, можно классифицировать с помощью PercePtron, то есть любой набор данных, который выглядит так:
Последний нельзя считать линейно отделенным, потому что это не одна строка, которая может примерно отделить базу данных.
Строительство единой нервной сети PercePtron
Давайте перейдем к созданию нашей первой нейронной сети PercePtron сегодня. Для этого мы начнем с создания данных.
1. Создайте наш набор данных
Во-первых, нам нужен наш набор данных, который в нашем случае будет 2D-массив. Откройте свои редакторы кода, ноутбук Jupyter или Google Colab.
import pandas as pd import numpy as np import random
Давайте сделаем наши данные. Я рассматриваю самолет 20 * 20 в этом примере, чтобы сохранить наши результаты маленькими и лаконичными.
#Dataset df = pd.DataFrame() df['x'] = [random.randint(1,20) for x in range(10)] df['y'] = [random.randint(1,20) for x in range(10)] df.head()
Теперь нам нужно маркировать их. Итак, мы отфильтровали на основе линии (я рассмотрел). Таким образом, каждая точка ниже линии y
label=[] for i in range(df.shape[0]): if df.iloc[i,0] < df.iloc[i,1]: label.append(1) else: label.append(-1) df['label'] = label df
2. Инициализируйте веса для значений
Теперь мы можем инициализировать вес. Мы не можем использовать нулевое значение, поэтому мы просто пойдем с случайным равномерным распространением для весов:
#weights and bias weights = [np.round(random.uniform(-0.99,0.99),2) for i in range(2)]
Тогда мы умножим веса с входными точками данных и сумма:
w = weights.copy() X = [[df.iloc[i,0],df.iloc[i,1]] for i in range(df.shape[0])] wx = [X[i][0]*w[0]+X[i][1]*w[1] for i in range(df.shape[0])]
Теперь у нас есть сумма весов и входов для каждой точки.
Так что такое процедура, заключается в том, что мы подключаемся все эти значения по одному в функцию активации, а затем на основе вывода мы изменим вес.
3. Создание функции активации
Теперь мы приходим к функции активации. PercePtron относится к сумме и дает нам метку, которую мы сравниваем с оригинальным ярлыком и определяем, правильно ли она. Если это неверно, обнаружена ошибка, и веса настраиваются так, чтобы наше решение * движется * В направлении оригинала.
Мы будем использовать функцию сигнала:
Если WX, то вывод равно 0. Иначе, выход 1.
for i in range(df.shape[0]): if wx[i]<=0: pred = 0 else: pred = 1
Помните, у нас есть только два входа: x и y. Не весь датафарам. Итак, мы расширим эту функцию активации, чтобы забрать в один файл данных за раз, а затем найти ошибку, а затем настроить ошибку:
for i in range(df.shape[0]): if wx[i]<=0: pred = -1 else: pred = 1 if pred != df['label'][i] : err = df['label'][i] - pred w[0] = w[0] + err w[1] = w[1] + err
Это работает отлично сейчас. Чтобы ясно видеть выходы, мы поставим в кучу печатных заявлений:
for i in range(df.shape[0]): print('wx : ',wx[i]) if wx[i]<=0: pred = -1 else: pred = 1 print('label=',df['label'][i]) print('pred = ',pred) if pred != df['label'][i] : err = df['label'][i] - pred print('err',err) print('before', w[0],w[1]) w[0] = w[0] + err w[1] = w[1] + err print('after',w[0],w[1]) else: print('w_i', w[0],w[1])
И теперь, если мы запустим это:
Простое утверждение форматирования печати дает нам последние весы.
4. Тестирование нашей модели в другой базе данных
Подобно тому, как мы сделали Tear-Test-Split, мы будем использовать другую базу данных для нашего тестирования здесь.
#Test Dataset new_df = pd.DataFrame() new_df['x'] = [random.randint(1,20) for x in range(100)] new_df['y'] = [random.randint(1,20) for x in range(100)] new_df.head()
Затем мы генерируем этикетки на основе линии, а сумму весов * входов:
label_text = [] for i in range(new_df.shape[0]): if new_df.iloc[i,0] < new_df.iloc[i,1]: label_text.append(1) else: label_text.append(-1) new_wX = w[0]*new_df['x']+w[1]*new_df['y']
Вот мой:
Итак, теперь момент истины, мы применяем нашу функцию активации, а затем мы можем сравнить данные этикетки с прогнозируемыми метками:
new_df['given label'] = label_text pred_label_text = [] for i in range(new_df.shape[0]): if new_wX[i]>=0: pred_label_text.append(-1) else: pred_label_text.append(1) new_df['predicted labels'] = pred_label_text
Как видите, мы сделали довольно хорошо для себя 🙂
Заключение
Поздравляем с выполнением этого урока. Я надеюсь, что это дало вам много представления о «перцептрене». Оставайтесь на связи с нами, чтобы прочитать наши будущие учебные пособия.