пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
В этой статье описывается конфигурация, необходимая на маршрутизаторе Cisco для получения сведений о системе доменных имен (DNS) от поставщика услуг и передачи их внутренним пользователям с помощью DHCP. Протокол DNS используется для разрешения полного доменного имени (FQDN) на его соответствующий IP-адрес.
Получение DNS IP адреса от провайдера с помощью PPP
В большинстве корпоративных сетей, где локальный DNS-сервер недоступен, клиенты должны использовать службу DNS, предоставляемую провайдером, или настроить общедоступный DNS-сервер в свободном доступе.
Рис. 1.1 DNS IP-адрес от провайдера с использованием PPP
Настройка локального DHCP-сервера на маршрутизаторе Cisco
Выполните настройку основных параметров DHCP на маршрутизаторе Cisco и включите его для того, чтобы он действовал как DHCP-сервер для локальной сети.
Во-первых, включите службу DHCP на маршрутизаторе Cisco.
R1(config)#service dhcp
Затем создайте пул DHCP, определяющий сетевую подсеть, которая будет передана в аренду DHCP-клиентам в локальной сети.
ip dhcp pool LAN_MY
network 192.168.1.0 255.255.255.0
default-router 192.168.1.1
dns-server 192.168.1.1
Здесь пул DHCP был назван как LAN_MY.
Оператор network задает подсеть и маску пула адресов DHCP
default-router указывает IP-адрес маршрутизатора по умолчанию для DHCP-клиента. Это должен быть IP-адрес в той же подсети, что и клиент
DNS-сервер задает IP-адрес DNS-сервера, который доступен для DHCP-клиента
Включите DNS-сервер на маршрутизаторе Cisco
В режиме глобальной конфигурации включите службу DNS на маршрутизаторе.
R1(config)#ip dns server
Конфигурация для ретрансляции публичной службы DNS от провайдера через PPP
Для того, чтобы получить Public DNS от провайдера, необходимо настроить ppp ipcp dns request на Dialer интерфейсе.
R1(config)#interface dialer 1
R1(config-if)#ppp ipcp dns request
Когда все вышеперечисленные конфигурации будут выполнены:
Команда ppp ipcp dns request сначала помогает получить информацию о публичном DNS-сервере от провайдера через ipcp-фазу согласования PPP.
Затем команда ip dns server позволяет маршрутизатору начать действовать в качестве самого DNS-сервера. Однако маршрутизатор в конечном итоге использует Public DNS service от провайдера для разрешения доменных имен
Кроме того, когда локальный DHCP-сервер раздаст IP-адреса клиентам, он будет представлять себя как DNS-сервер. Все входящие запросы разрешения DNS от клиентов будут обрабатываться маршрутизатором с использованием Public DNS
Проверка
Шаг 1: Запустите debug ppp negotiation и внимательно прочитайте информацию о IPCP, чтобы проверить, предоставляется ли информация о DNS-сервере провайдером.
Шаг 2: выполните команду show ppp interface virtual-access, чтобы узнать о различных параметрах, успешно согласованных во время настройки PPP.
R1# show ppp interface virtual-access 3
Одной из распространенных проблем, с которыми сталкивается администратор IP – АТС Asterisk является проблема с аудио. Вы можете столкнуться как с односторонней слышимостью, так и с полным отсутствием аудио – потока. Как решить проблему с аудио в Asterisk с помощью FreePBX расскажем с статье.
Проблемы с NAT
В подавляющем большинстве случаев проблемы с односторонней слышимостью вызваны настройками NAT (Network Address Translation). Ниже указаны шаги, выполнение которых поможет вам избавиться от проблем с аудио
Динамический DNS
Если ваша компания не оплачивает провайдеру услугу статического IP – адреса, то ваш внешний IP будет периодически меняться. Причиной может быть перезагрузка маршрутизатора или, например, истечение срока аренды адреса по протоколу DHCP (DHCP Lease Time). Отличной альтернативной будет динамическая DNS запись. Данная запись позволяет серверу DNS периодически обновлять соответствующий доменному имени IP – адрес. Вне зависимости от смены IP вашим провайдером, маршрутизатор будет всегда доступен по его доменному имени. Такие услуги предоставляет такие сервисы как dyndns, no-ip, hldns и другие.
Настройка NAT в FreePBX 13
Когда вы приобрели статический IP – адрес или сделали динамическую запись на DNS сервере, переходим к настройке NAT. Перейдите во вкладку Settings -> Asterisk SIP settings -> Chan SIP Settings
На указанном выше примере, выбрана опция Static IP. Здесь, в выделенном красным поле необходимо указать ваш внешний IP – адрес. На примере ниже, указана опция настройки динамического DNS – выбрана кнопка Dynamic IP:
Локальные сети
Перейдя во вкладку General SIP Settings того же раздела, необходимо настроить внутренние сети. Например, 192.168.13.0/255.255.255.0. Это может быть отдельная сеть, в которой находятся IP – телефоны, или сеть, в которую вынесено все активное сетевое оборудование.
Не забывайте по окончанию настроек нажимать Submit и Apply Config
Настройка RTP портов
Проверьте чтобы на вашем маршрутизаторе не были заблокированы UDP порты 5060 (SIP) и диапазон портов 10000-20000 (RTP). Помимо этого, вы можете сделать проброс этих портов прямо на ваш сервер IP – АТС Asterisk. Перепроверьте, что транспортным протоколом является именно UDP.
Проблемы с настройкой кодеков
Каждый раз, когда вы совершаете вызов, обе стороны, инициирующая и принимающая вызов согласует телефонный кодек. Например, одна из сторон может инициировать согласование кодека g.711u, который может не поддерживаться другой стороной. Это может являться причиной отсутствия аудио в разговоре. Мы рекомендуем всегда включать поддержку кодеков G.711 u – закона и a – закона. Настроить телефонные кодеки можно следующими способами:
Настройка на конкретном телефонном аппарате
В настройка внутреннего номера (Extension) в FreePBX
Мы рекомендуем не настраивать кодеки индивидуально на телефонном аппарате. В случае возникновения каких – либо проблем, на этапе «траблшутинга» вы можете потратить лишнее время просто забыв о данной настройке
На этапе настройки SIP – транка в FreePBX. Разрешенные или запрещенные кодеки определяются опцией allow/disallow
Глобальная настройка. В разделе Settings -> Asterisk SIP Settings -> "General SIP Settings"
Проблема с воспроизведением аудио файлов
Если при звонке на голосовое меню (IVR) вы не слышите ожидаемую аудио – запись, проверьте, корректно ли был импортирован этот файл через модуль System Recordings. Помимо этого проверьте права этого файла. Владельцем этого файла (owner) должен быть пользователь asterisk. В рамках решения проблемы дайте команду amportal chown:
[root@localhost ~]# amportal chown
Please wait...
!!!!amportal is depreciated. Please use fwconsole!!!!
forwarding all commands to 'fwconsole'
Taking too long? Customize the chown command, See http://wiki.freepbx.org/display/FOP/FreePBX+Chown+Conf
Setting Permissions...
37034/37034 [============================] 100%
Finished setting permissions
В этой статье мы заглянем под капот нейронных сетей и узнаем, как построить её с нуля.
Как работает нейронная сеть?
Для начала давайте разберемся, как устроены нейронные сети на самом высоком уровне. Нейронная сеть получает набор данных и выдает предсказание. Это очень просто.
Разберем пример. Допустим, один из ваших друзей (который не является большим поклонником футбола) показывает на старую фотографию известного футболиста — скажем, Лионеля Месси — и спрашивает вас о нем.
Вы сможете опознать футболиста за секунду, даже если фотография старая или сделана при тусклом свете. Причина в том, что вы уже тысячу раз видели его фотографии.
Но что произойдет, если вам дадут фотографию известного бейсболиста (а вы никогда раньше не видели ни одного бейсбольного матча)? Вы не сможете узнать этого игрока, даже если фотография будет четкой и яркой.
Этот же принцип используется для нейронных сетей. Если наша цель — создать нейронную сеть для распознавания кошек и собак, мы просто покажем нейронной сети кучу фотографий собак и кошек. Точнее, мы показываем нейросети фотографии собак, а затем говорим ей, что это собаки. А затем показываем ей фотографии кошек и определяем, что это кошки.
Как только мы обучим нашу нейросеть изображениям кошек и собак, она сможет легко классифицировать, кто изображен на картинке - кошка или собака. Короче говоря, она может отличить кошку от собаки.
Но если показать нашей нейросети изображение лошади или орла, она никогда не определит, что это - лошадь или орел. Это происходит потому, что нейросеть никогда не видела изображения лошади или орла, потому что мы никогда не показывали ей этих животных.
Если вы хотите улучшить возможности нейронной сети, вам нужно показать ей фотографии всех животных, которых вы хотите, чтобы нейронная сеть классифицировала. На данный момент она знает только кошек и собак и больше ничего.
Набор данных, который мы используем для обучения, во многом зависит от поставленной перед нами задачи. Если вы хотите определить, положительно или отрицательно настроен твит, то, вероятно, вам понадобится набор данных, содержащий множество твитов с соответствующими метками - положительными или отрицательными.
Теперь, когда у вас есть общее представление о наборах данных и о том, как нейронная сеть обучается на этих данных, давайте углубимся в то, как работают нейронные сети.
Понимание нейронных сетей
Мы будем строить нейронную сеть для классификации цифр три и семь на изображении. Но прежде чем мы построим нейронную сеть, нам нужно глубже понять, как она работает.
Каждое изображение, которое мы передаем нашей нейронной сети, - это просто набор чисел. То есть каждое изображение имеет размер 28?28, что означает, что в нем 28 строк и 28 столбцов, как в матрице.
Мы видим каждую из цифр как полноценное изображение, но для нейросети это просто набор чисел в диапазоне от 0 до 255.
Вот пиксельное представление цифры пять:
Как вы можете видеть выше, у нас 28 строк и 28 столбцов (индекс начинается с 0 и заканчивается на 27), как и в матрице. Нейронные сети видят только эти матрицы 28?28.
Чтобы показать больше деталей, тени идут вместе со значениями пикселей. Если присмотреться к изображению, то можно увидеть, что значения пикселей, близкие к 255, темнее, а значения, близкие к 0, светлее по оттенку.
В PyTorch мы не используем термин матрица. Вместо этого мы используем термин тензор. Каждое число в PyTorch представлено в виде тензора. Поэтому с этого момента мы будем использовать термин тензор вместо матрицы.
Визуализация нейронной сети
Нейронная сеть может иметь любое количество нейронов и слоев. Вот как выглядит нейронная сеть:
Пусть вас не смущают греческие буквы на картинке.
Возьмем случай, когда нужно предсказать, выживет пациент или нет, на основе набора данных, содержащего имя пациента, температуру, кровяное давление, состояние сердца, месячную зарплату и возраст.
В нашем наборе данных только температура, кровяное давление, состояние сердца и возраст имеют существенное значение для предсказания того, выживет пациент или нет. Поэтому мы присвоим этим значениям больший вес, чтобы показать их большую важность.
Но такие характеристики, как имя пациента и ежемесячная зарплата, практически не влияют на выживаемость пациента. Поэтому мы присваиваем этим признакам меньшие значения веса, чтобы показать их меньшую важность.
На рисунке выше x1, x2, x3...xn - это признаки в нашем наборе данных, которые могут быть значениями пикселей в случае данных об изображениях или такими признаками, как кровяное давление или состояние сердца, как в приведенном выше примере.
Значения признаков умножаются на соответствующие весовые коэффициенты, обозначаемые как w1j, w2j, w3j...wnj. Перемноженные значения суммируются и передаются на следующий слой.
Оптимальные весовые значения узнаются в процессе обучения нейронной сети. Значения весов постоянно обновляются таким образом, чтобы максимизировать количество правильных предсказаний.
Функция активации — это не что иное, как сигмоидная функция в нашем случае. Любое значение, которое мы передаем сигмоиду, преобразуется в значение между 0 и 1. Мы просто накладываем сигмоидную функцию на предсказание нашей нейронной сети, чтобы получить значение между 0 и 1.
Вы поймете важность сигмоидального слоя, когда мы начнем строить нашу модель нейронной сети.
Существует множество других функций активации, которые даже проще в изучении, чем сигмоида.
Это уравнение для сигмоидальной функции:
Узлы круглой формы на диаграмме называются нейронами. На каждом слое нейронной сети веса перемножаются с входными данными. Мы можем увеличить глубину нейронной сети, увеличив количество слоев. Мы можем повысить производительность слоя, увеличив количество нейронов в нем.
Понимание набора данных
Первое, что нам нужно для обучения нашей нейронной сети, это набор данных.
Поскольку цель нашей нейронной сети - классифицировать, содержит ли изображение число три или семь, нам нужно обучить нашу нейронную сеть на изображениях троек и семерок. Итак, давайте создадим наш набор данных.
К счастью, нам не придется создавать набор данных с нуля. Наш набор данных уже присутствует в PyTorch. Все, что нам нужно сделать, — это загрузить его и проделать с ним несколько базовых операций.
Нам нужно загрузить набор данных под названием MNIST (Измененный Национальный институт стандартов и технологий) из библиотеки torchvision в PyTorch.
Что такое набор данных MNIST?
Набор данных MNIST содержит рукописные цифры от 0 до 200 с соответствующими метками, как показано ниже:
Итак, мы просто передаем нейронной сети изображения цифр и соответствующие им метки, которые говорят нейронной сети, что это тройка или семерка.
Как подготовить наш набор данных
В загруженном наборе данных MNIST есть изображения и соответствующие им метки.
Мы просто напишем код, который будет индексировать только изображения с меткой три или семь. Таким образом, мы получим набор данных из троек и семерок.
Сначала импортируем все необходимые библиотеки.
import torch
from torchvision import datasets
import matplotlib.pyplot as plt
Мы импортируем библиотеку PyTorch для построения нашей нейронной сети и библиотеку torchvision для загрузки набора данных MNIST, как обсуждалось ранее. Библиотека Matplotlib используется для отображения изображений из нашего набора данных.
Теперь давайте подготовим наш набор данных.
mnist = datasets.MNIST('./data', download=True)
threes = mnist.data[(mnist.targets == 3)]/255.0
sevens = mnist.data[(mnist.targets == 7)]/255.0
len(threes), len(sevens)
Как мы узнали выше, в PyTorch все представлено в виде тензоров. Поэтому наш набор данных также представлен в виде тензоров.
Мы загружаем набор данных в первой строке. Мы индексируем только те изображения, целевое значение которых равно 3 или 7, нормализуем их путем деления на 255 и сохраняем отдельно.
Мы можем проверить, правильно ли мы проиндексировали, выполнив код в последней строке, который выдает количество изображений в тензоре троек и семерок.
Теперь давайте проверим, правильно ли мы подготовили наш набор данных.
def show_image(img):
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.show()
show_image(threes[3])
show_image(sevens[8])
Используя библиотеку Matplotlib, мы создадим функцию для вывода изображений. Давайте проведем быструю проверку на вменяемость, распечатав форму наших тензоров.
print(threes.shape, sevens.shape)
Если все прошло правильно, вы получите размеры троек и семерок как ([6131, 28, 28]) и ([6265, 28, 28]) соответственно. Это означает, что у нас есть 6131 изображение размером 28?28 для троек и 6265 изображений размером 28?28 для семерок.
Мы создали два тензора с изображениями троек и семерок. Теперь нам нужно объединить их в один набор данных, который будет использоваться в нашей нейронной сети.
combined_data = torch.cat([threes, sevens])
combined_data.shape
Мы объединим два тензора с помощью PyTorch и проверим форму объединенного набора данных.
Теперь мы сплющим изображения в наборе данных.
flat_imgs = combined_data.view((-1, 28*28))
flat_imgs.shape
Мы сплющим изображения таким образом, чтобы каждое из изображений размером 28?28 стало одной строкой с 784 столбцами (28?28=784). Таким образом, форма преобразуется в ([12396, 784]).
Нам нужно создать метки, соответствующие изображениям в объединенном наборе данных.
target = torch.tensor([1]*len(threes)+[2]*len(sevens))
target.shape
Изображениям, содержащим тройку, мы присваиваем метку 1, а изображениям, содержащим семерку, — метку 0.
Как обучить нейронную сеть
Чтобы обучить нейронную сеть, выполните следующие шаги.
Шаг 1: Построение модели
Ниже приведено простейшее уравнение, которое показывает, как работают нейронные сети:
y = Wx + b
Здесь термин «y» означает наше предсказание, то есть три или семь. 'W' - это значения весов, 'x' - входное изображение, а 'b' - смещение (которое, наряду с весами, помогает делать прогнозы).
Короче говоря, мы умножаем значение каждого пикселя на значения весов и прибавляем их к значению смещения.
Веса и величина смещения определяют важность каждого значения пикселя при составлении прогноза.
Мы классифицируем три и семь, поэтому у нас есть только два класса для предсказания.
Поэтому мы можем предсказать 1, если изображение равно трем, и 0, если изображение равно семи. Предсказание, которое мы получим в результате этого шага, может быть любым реальным числом, но нам нужно, чтобы наша модель (нейронная сеть) предсказывала значение между 0 и 1.
Это позволяет нам создать порог в 0,5. То есть если предсказанное значение меньше 0,5, то это семерка. В противном случае это тройка.
Для получения значения между 0 и 1 мы используем сигмоидальную функцию.
Мы создадим функцию сигмоида, используя то же уравнение, которое было показано ранее. Затем мы передадим в сигмоид значения из нейронной сети.
Мы создадим однослойную нейронную сеть.
Мы не можем создавать много циклов для умножения каждого значения веса на каждый пиксель изображения, так как это очень дорого. Поэтому мы можем использовать магический трюк, чтобы выполнить все перемножение за один раз, используя матричное умножение.
def sigmoid(x): return 1/(1+torch.exp(-x))
def simple_nn(data, weights, bias): return sigmoid((data@weights) + bias)
Шаг 2: Определение потерь
Теперь нам нужна функция потерь, чтобы вычислить, на сколько наше предсказанное значение отличается от истинного.
Например, если предсказанное значение равно 0,3, а истинное - 1, то наши потери очень велики. Поэтому наша модель будет пытаться уменьшить этот убыток, обновляя веса и смещение таким образом, чтобы наши предсказания стали близки к истине.
Для проверки величины потерь мы будем использовать среднюю квадратичную ошибку. Среднеквадратичная ошибка - это среднее квадратическое значение разницы между предсказанным значением и истинным значением.
def error(pred, target): return ((pred-target)**2).mean()
Шаг 3: Инициализация значений весов
Мы просто произвольно инициализируем веса и смещение. Позже мы увидим, как эти значения обновляются для получения наилучших предсказаний.
w = torch.randn((flat_imgs.shape[1], 1), requires_grad=True)
b = torch.randn((1, 1), requires_grad=True)
Форма значений весов должна иметь следующий вид:
(количество нейронов в предыдущем слое, количество нейронов в следующем слое).
Мы используем метод градиентного спуска для обновления весов и смещения, чтобы сделать максимальное количество правильных предсказаний.
Наша цель — оптимизировать или уменьшить потери, поэтому лучший метод - вычисление градиентов.
Нам нужно взять производную каждого веса и смещения по отношению к функции потерь. Затем мы должны вычесть это значение из наших весов и смещений.
Таким образом, значения весов и смещения обновляются так, чтобы наша модель делала хорошие предсказания.
Обновление параметра для оптимизации функции не является чем-то новым - вы можете оптимизировать любую произвольную функцию с помощью градиентов.
Мы установили специальный параметр (называется requires_grad) в true, чтобы вычислить градиент весов и смещения.
Шаг 4: Обновление весов
Если наше предсказание не совпадает с истинным, это означает, что мы сделали неправильное предсказание. Это означает, что наши веса не верны. Поэтому нам нужно обновлять веса до тех пор, пока мы не получим хорошие предсказания.
Для этого мы помещаем все описанные выше шаги в цикл for и позволяем ему повторяться любое количество раз.
На каждой итерации вычисляется потеря и обновляются веса и смещения, чтобы получить лучший прогноз на следующей итерации.
Таким образом, наша модель становится лучше после каждой итерации, находя оптимальное значение веса, подходящее для конкретной задачи.
Для каждой задачи требуется свой набор значений весов, поэтому мы не можем ожидать, что нейронная сеть, обученная классифицировать животных, будет хорошо справляться с классификацией музыкальных инструментов.
Вот как выглядит обучение нашей модели:
for i in range(2000):
pred = simple_nn(flat_imgs, w, b)
loss = error(pred, target.unsqueeze(1))
loss.backward()
w.data -= 0.001*w.grad.data
b.data -= 0.001*b.grad.data
w.grad.zero_()
b.grad.zero_()
print("Loss: ", loss.item())
Мы вычислим предсказания и сохраним их в переменной 'pred', вызвав функцию, которую мы создали ранее. Затем мы рассчитаем среднюю квадратичную ошибку.
Затем мы рассчитаем все градиенты для наших весов и смещения и обновим значение, используя эти градиенты.
Мы умножили градиенты на 0,001, и это называется скоростью обучения. Это значение определяет скорость, с которой будет обучаться наша модель. Если оно слишком мало, то модель будет обучаться медленно, или, другими словами, потери будут уменьшаться медленно.
Если скорость обучения слишком высока, наша модель не будет стабильной, прыгая между широким диапазоном значений потерь. Это означает, что она не сможет сходиться.
Мы проделываем описанные выше шаги 2000 раз, и каждый раз наша модель пытается уменьшить потери, обновляя значения весов и смещения.
Мы должны обнулять градиенты в конце каждого цикла или эпохи, чтобы в памяти не накапливались нежелательные градиенты, которые повлияют на обучение модели.
Поскольку наша модель очень мала, обучение в течение 2000 эпох или итераций не займет много времени. После 2000 эпох наша нейронная сеть дала значение потерь 0,6805, что неплохо для такой маленькой модели.
Подведем итоги
В модели, которую мы только что создали, есть огромное пространство для совершенствования.
Это всего лишь простая модель, и вы можете экспериментировать с ней, увеличивая количество слоев, число нейронов в каждом слое или количество эпох.
Одним словом, машинное обучение - это сплошная магия с использованием математики. Всегда изучайте фундаментальные концепции - они могут быть скучными, но со временем вы поймете, что эти скучные математические концепции создали эти передовые технологии, такие как deepfakes.
