Использование PyTorch framework для глубокого обучения

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

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



Слои следующие:

0. Токенизация: это не слой для сети LSTM, а обязательный этап преобразования наших слов в токены (целые числа).

  1. Слой встраивания: преобразует токены слов (целые числа) во встраивание определенного размера.
  2. Слой LSTM: определяется яркостью скрытого состояния и количеством слоев
  3. Полностью подключенный слой: сопоставляет вывод слоя LSTM с желаемым размером вывода.
  4. Сигмоидный слой активации: превращает все выходные значения в значение от 0 до 1.
  5. Выход: сигмовидный выход из последнего временного шага считается окончательным выходом этой сети.

Перед тем, как вы определите класс модели, это даст хорошее представление о каждом из слоев. Это поможет вам получить больше ясности о том, как подготовить входные данные для встраивания, 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])

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

Заключительные замечания:

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