Какую структуру следует использовать для глубокого обучения? Согласно моему онлайн-исследованию, TensorFlow, Keras и PyTorch - самые популярные библиотеки, упоминаемые в сообществе машинного обучения. TensorFlow лучше работает при крупномасштабной реализации, в то время как PyTorch хорошо работает для быстрого прототипирования в исследованиях. Обе структуры обеспечивают максимальную математическую гибкость. Keras, с другой стороны, самый простой в использовании, но не такой гибкий, как TensorFlow или PyTorch.
Когда я только начал изучать глубокое машинное обучение, я реализовал свой самый первый классификатор текста LSTM с Keras. Добавить новые слои в модель было так же просто, как несколько строк кода, с огромной кривой обучения подключению моих входных данных для встраивания слов в модель. Этот классификатор - это то, что команда использовала для классификации предложений с гендерной предвзятостью в нашем первом прототипе.
Когда мы начали стажировку в Mila, один из наших наставников настоятельно рекомендовал нам изучить PyTorch, поскольку это самый популярный фреймворк, используемый в исследовательской сфере. Он дал нам учебные пособия по пониманию моделей глубокого обучения, а также по их реализации с помощью PyTorch. Чтобы лучше понять PyTorch, мы решили создать наши собственные учебные пособия, поскольку обучение - лучший способ учиться!
В этом сообщении блога я представляю краткое введение в структуру и рабочие камни PyTorch для построения моделей нейронных сетей.
Дорожная карта для поста
- Краткое введение в PyTorch
- Понимание тензоров
- PyTorch и мост NumPy
- Основные тензорные операции
- GPU / CUDA
Что такое PyTorch?
PyTorch - это библиотека машинного обучения с открытым исходным кодом для Python, которая обеспечивает максимальную гибкость и скорость научных вычислений для глубокого обучения. Это замена NumPy, использующая мощь графических процессоров.
Тензоры в PyTorch
Тензор - это n-мерный контейнер данных, который похож на ndarray NumPy. Например, 1d-тензор - это вектор, 2d-тензор - это матрица, 3d-тензор - это куб, а 4d-тензор - это вектор кубов.
Давайте посмотрим на несколько примеров того, как создать тензор в PyTorch. Чтобы инициализировать тензор, мы можем либо присвоить значения напрямую, либо установить размер тензора. torch.Tensor(n,m)
инициализирует тензор размером n x m.
import torch # create a tensor new_tensor = torch.Tensor([[1, 2], [3, 4]]) # create a 2 x 3 tensor with random values empty_tensor = torch.Tensor(2, 3) # create a 2 x 3 tensor with random values between -1and 1 uniform_tensor = torch.Tensor(2, 3).uniform_(-1, 1) # create a 2 x 3 tensor with random values from a uniform distribution on the interval [0, 1) rand_tensor = torch.rand(2, 3) # create a 2 x 3 tensor of zeros zero_tensor = torch.zeros(2, 3)
Чтобы получить доступ или заменить элементы в тензоре, вы можете использовать индексацию. Например, new_tensor[0][0]
вернет тензорный объект, содержащий элемент в позиции 0, 0. К скалярному объекту также можно получить доступ через .item()
. Кроме того, нарезка также может использоваться для доступа к каждой строке и столбцу в тензоре.
new_tensor = torch.Tensor([[1, 2], [3, 4]]) # replace an element at position 0, 0 new_tensor[0][0] = 5 print(new_tensor) # tensor([[ 5., 2.],[ 3., 4.]]) # access an element at position 1, 0 print(new_tensor[1][0]) # tensor([ 3.]) print(new_tensor[1][0].item()) # 3. ## slicing examples slice_tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # elements from every row, first column print(slice_tensor[:, 0]) # tensor([ 1., 4., 7.]) # elements from every row, last column print(slice_tensor[:, -1]) # tensor([ 3., 6., 9.]) # all elements on the second row print(slice_tensor[2, :]) # tensor([ 4., 5., 6.]) # all elements from first two rows print(slice_tensor[:2, :]) # tensor([[ 1., 2., 3.], [ 4., 5., 6.]])
Теперь, как нам получить доступ к тензорной информации? Для проверки типа тензора используется .type()
. Для формы тензора можно использовать .shape
или .size()
. .dim()
предназначен для доступа к размерности тензора.
new_tensor = torch.Tensor([[1, 2], [3, 4]]) # type of a tensor print(new_tensor.type()) # 'torch.FloatTensor' # shape of a tensor print(new_tensor.shape) # torch.Size([2, 2]) print(new_tensor.size()) # torch.Size([2, 2]) # dimension of a tensor print(new_tensor.dim()) # 2
Чтобы изменить форму тензора, просто используйте код .view(n,m)
. Это преобразует форму тензора в размер n x m.
reshape_tensor = torch.Tensor([[1, 2], [3, 4]]) reshape_tensor.view(1,4) # tensor([[ 1., 2., 3., 4.]]) reshape_tensor.view(4,1) # tensor([[ 1.],[ 2.],[ 3.],[ 4.]])
PyTorch и мост NumPy
Иногда бывает полезно преобразовать Numpy ndarray в тензор Pytorch и наоборот. Используйте .from_numpy()
при преобразовании ndarray NumPy в тензор PyTorch. И наоборот, используйте .numpy()
для обратного преобразования в ndarray NumPy.
np_ndarray = numpy.random.randn(2,2) # NumPy ndarray to PyTorch tensor to_tensor = torch.from_numpy(np_ndarray) # PyTorch tensor to NumPy array to_ndarray = to_tensor.numpy()
Основные тензорные операции
Вот несколько основных примеров тензорных операций в PyTorch:
Транспонировать: .t()
или .permute(-1, 0)
# regular transpose function my_tensor.t() # transpose via permute function my_tensor.permute(-1,0)
Перекрестное произведение: a.cross(b)
или torch.cross(a, b)
tensor_1 = torch.randn(3, 3) tensor_2 = torch.randn(3, 3) cross_prod = tensor_1.cross(tensor_2)
Матричный продукт: .mm()
maxtrix_prod = tensor_1.mm(tensor_2)
Поэлементное умножение: .mul()
element_mult = tensor_1.mul(tensor_2)
GPU / CUDA
Тензоры также могут использоваться на графическом процессоре, поддерживающем CUDA, для ускорения вычислений.
if torch.cuda.is_available(): tensor_1 = tensor_1.cuda() tensor_2 = tensor_2.cuda() tensor_1 + tensor_2
Сегодня мы узнали об основах PyTorch, изучив основные операции PyTorch с тензорами. В следующем уроке мы продолжим практиковать основы PyTorch с линейными моделями, чтобы лучше освоиться с фреймворком.
Расписание учебного курса PyTorch
- Изучите основы PyTorch
- Модели линейной и логистической регрессии
- Введение в нейронную сеть (прямая связь)
- Загрузка данных в PyTorch
- Классификатор текста RNN / LSTM
- Модель языка RNN / LSTM
- Изучение классификации текста с помощью CNN
- Может ли языковая модель работать с CNN?