Мне нравится анализировать HTML с регулярными выражениями. Я не пытаюсь разбирать идиот HTML, который намеренно нарушен. Этот код является моим основным парсером (версия Perl):
$_ = join "",; tr/\n\r \t/ /s; s/\n/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print
Он называется htmlsplit, разбивает HTML на строки, с одним тегом или фрагментом текста в каждой строке. Затем линии могут быть обработаны другими текстовыми инструментами и сценариями, такими как grep , sed , Perl и т. Д. Я даже не шучу :) Наслаждайтесь.
Достаточно просто переписать мой скрипт Perl-all-first Perl в приятную поточную вещь, если вы хотите обрабатывать огромные веб-страницы. Но это действительно не обязательно.
Бьюсь об заклад, я заберусь для этого.
Против моего ожидая, что это получило некоторые upvotes, поэтому я предлагаю несколько правильных выражений:
/(<.*?>|[^<]+)\s*/g # get tags and text
/(\w+)="(.*?)"/g # get attibutes
Они хороши для XML / XHTML.
С небольшими вариациями он может справиться с беспорядочным HTML ... или сначала конвертировать HTML -> XHTML.
Лучший способ записи регулярных выражений - в Lex / Yacc стиль, а не непрозрачные однострочные или прокомментированные многострочные чудовища. Я не делал этого здесь; эти им едва ли нужны.
Я непрофессионал, поэтому я помогу вам с терминами непрофессионала:)
input_size = 784
hidden_sizes = [128, 64]
output_size = 10
Это параметры для слоев в вашей сети. Каждая нейронная сеть состоит из layers
, и каждый layer
имеет форму входа и выхода.
В частности, input_size
имеет дело с формой ввода первого слоя. Это input_size
всей сети. Каждый образец, который вводится в сеть, будет 1-мерным вектором длиной 784 (массив длиной 784).
hidden_size
имеет дело с формами внутри сети. Мы расскажем об этом чуть позже.
output_size
имеет дело с выходной формой последнего слоя. Это означает, что наша сеть будет выводить одномерный вектор длиной 10 для каждого образца.
Теперь, чтобы разбить определение модели построчно:
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
Часть nn.Sequential
просто определяет сеть, каждый входной аргумент определяет новый слой в этой сети в этом порядке. [1134 ]
nn.Linear(input_size, hidden_sizes[0])
является примером такого слоя. Это первый слой нашей сети, который принимает входные данные размером input_size
и выводит вектор размером hidden_sizes[0]
. Размер вывода считается «скрытым» в том смысле, что он не является входом или выходом всей сети. Он «скрыт», потому что он расположен внутри сети вдали от входных и выходных концов сети, с которой вы взаимодействуете, когда фактически используете ее.
Это называется Linear
, потому что оно применяет линейное преобразование путем умножения входных данных на его матрицу весов и добавления своей матрицы смещения к результату. (Y = Ax + b, Y = выход, x = вход, A = вес, b = смещение).
nn.ReLU(),
ReLU является примером функции активации. Эта функция применяет какое-то преобразование к выходному сигналу последнего уровня (уровня, описанного выше) и выводит результат этого преобразования. В этом случае используемой функцией является функция ReLU
, которая определяется как ReLU(x) = max(x, 0)
. Функции активации используются в нейронных сетях, потому что они создают нелинейности. Это позволяет вашей модели моделировать нелинейные отношения.
nn.Linear(hidden_sizes[0], hidden_sizes[1]),
Из того, что мы обсуждали выше, это еще один пример layer
. Он принимает входной сигнал hidden_sizes[0]
(такой же формы, что и выходной сигнал последнего слоя) и выдает одномерный вектор длины hidden_sizes[1]
.
nn.ReLU(),
Снова применяет функцию ReLU
.
nn.Linear(hidden_sizes[1], output_size)
То же, что и вышеупомянутые два слоя, но наша выходная форма на этот раз - output_size
.
nn.Softmax(dim=1))
Еще одна функция активации. Эта функция активации превращает логиты, выведенные с помощью nn.Linear
, в фактическое распределение вероятностей. Это позволяет модели выводить вероятность для каждого класса. На данный момент наша модель построена.
# Forward pass through the network and display output
images, labels = next(iter(trainloader))
images.resize_(images.shape[0], 1, 784)
print(images.shape)
Это просто предварительная обработка обучающих данных и перевод их в правильный формат.
ps = model.forward(images[0,:])
Это позволяет передавать изображения через модель (прямая передача) и применять операции, ранее обсуждавшиеся в слое. Вы получите результирующий вывод.