Использование PyTorch framework для глубокого обучения
Одна из наиболее важных частей построения глубокой нейронной сети - иметь четкое представление о ваших данных, когда они проходят через слои, претерпевающие изменения в размерах, изменении формы, сглаживании и затем изменении формы ...
Мы будем ссылаться на архитектуру LSTM, которую мы видели ранее в нашем учебном пособии по анализу настроений. Ссылка на статью здесь.
Слои следующие:
0. Токенизация: это не слой для сети LSTM, а обязательный этап преобразования наших слов в токены (целые числа).
- Слой встраивания: преобразует токены слов (целые числа) во встраивание определенного размера.
- Слой LSTM: определяется яркостью скрытого состояния и количеством слоев
- Полностью подключенный слой: сопоставляет вывод слоя LSTM с желаемым размером вывода.
- Сигмоидный слой активации: превращает все выходные значения в значение от 0 до 1.
- Выход: сигмовидный выход из последнего временного шага считается окончательным выходом этой сети.
Перед тем, как вы определите класс модели, это даст хорошее представление о каждом из слоев. Это поможет вам получить больше ясности о том, как подготовить входные данные для встраивания, LSTM, линейных слоев архитектуры вашей модели.
Контекст:
Мы используем Набор данных обзора фильмов IMDB, этапы обработки и подготовки данных уже выполнены. Нажмите здесь, если вам нужно вернуться к этим шагам. Мы начинаем с загрузчиков данных (где мы определили batch_size=50
и sequence length=200
). Согласно моей статье о построении Модели анализа настроений с использованием LSTM, мы смотрим на Шаг 14 под микроскопом -
- Начнем с просмотра
inupts
иtargets
из загрузчиков данных:
dataiter = iter(train_loader) x, y = dataiter.next() x = x.type(torch.LongTensor) print ('X is', x) print ('Shape of X and y are :', x.shape, y.shape)
Из формы X
мы видим, что X
- это тензор из 50 строк (= размер пакета) и 200 столбцов (= длина последовательности). Это гарантирует, что наш процесс токенизации работает нормально. Этот X
войдет в качестве входных данных в слой встраивания.
- Встраиваемый слой:
Модуль, позволяющий использовать встраивание, - torch.nn.Embedding
. Он принимает два параметра: размер словаря и размерность вложения.
from torch import nn vocab_size = len(words) embedding_dim = 30 embeds = nn.Embedding(vocab_size, embedding_dim) print ('Embedding layer is ', embeds) print ('Embedding layer weights ', embeds.weight.shape)
embeds_out = embeds(x) print ('Embedding layer output shape', embeds_out.shape) print ('Embedding layer output ', embeds_out)
Из вывода слоя внедрения мы видим, что он создал трехмерный тензор в результате внедрения весов. Теперь он имеет 50 строк, 200 столбцов и 30 измерений встраивания, т.е. для каждого токенизированного слова в нашем обзоре мы добавили измерение встраивания. Теперь эти данные перейдут на уровень LSTM.
- Уровень LSTM:
При определении уровня LSTM мы сохранили Batch First = True и количество скрытых блоков = 512.
# initializing the hidden state to 0 hidden=None lstm = nn.LSTM(input_size=embedding_dim, hidden_size=512, num_layers=1, batch_first=True) lstm_out, h = lstm(embeds_out, hidden) print ('LSTM layer output shape', lstm_out.shape) print ('LSTM layer output ', lstm_out)
Глядя на вывод слоя LSTM, мы видим, что наш тензор теперь имеет 50 строк, 200 столбцов и 512 узлов LSTM. Затем эти данные загружаются на полностью подключенный уровень.
- Полностью связанный слой:
Для полностью связанного слоя количество входных функций = количеству скрытых единиц в LSTM. Размер вывода = 1, потому что мы только двоичный результат (1/0; положительный / отрицательный)
Обратите внимание, что перед помещением вывода lstm в слой fc его необходимо выровнять.
fc = nn.Linear(in_features=512, out_features=1) fc_out = fc(lstm_out.contiguous().view(-1, 512)) print ('FC layer output shape', fc_out.shape) print ('FC layer output ', fc_out)
- Сигмовидный слой активации:
Это нужно только для того, чтобы преобразовать все выходное значение из полностью подключенного слоя в значение от 0 до 1.
sigm = nn.Sigmoid() sigm_out = sigm(fc_out) print ('Sigmoid layer output shape', sigm_out.shape) print ('Sigmoid layer output ', sigm_out)
- Окончательный результат:
Это включает в себя два шага: во-первых, изменить форму вывода таким образом, чтобы строки были равны размеру пакета.
batch_size = x.shape[0] out = sigm_out.view(batch_size, -1) print ('Output layer output shape', out.shape) print ('Output layer output ', out)
Во-вторых, как мы видим в сетевой архитектуре - нам нужен вывод только после последней последовательности (после последнего временного шага)
print ('Final sentiment prediction, ', out[:,-1])
Эти выходные данные получены из неподготовленной сети, поэтому значения могут еще ничего не указывать. Это было сделано только для иллюстрации, и мы будем использовать эти знания для правильного определения модели.
Заключительные замечания:
- Надеюсь, вы получили такое же удовольствие, читая это, как я писал в этой статье.
- Попробуйте воспроизвести этот процесс для любой другой модели глубокого обучения, которую вы пытаетесь реализовать.
- Не стесняйтесь писать свои мысли / предложения / отзывы