0 шт.
Выбрать страницу

Что такое тензор?

Определение тензора

Тензор - это многомерный массив. Существуют более сложные определения тензора, но я не буду вам приводить их.

Библиотеки поддерживающие тензорные вычисления

NumPy, TensorFlow и PyTorch - это основные библиотеки поддерживающие тензорные вычисления.

Операции над тензорами

Мы будем использовать PyTorch для работы с тензорами.

Сгенерируем тензор состоящий из случайных чисел с размерностью [2,3]. 2 - это количество строк и 3 - это количество колонок. torch.rand - генерирует случайные числа.

In [3]:
import torch
tensor = torch.rand([2,3])
print(tensor)
tensor([[0.1117, 0.8807, 0.2294],
        [0.1460, 0.3258, 0.3175]])

Тензоры могут иметь большее количество измерений. Например, можно сгенерировать картинку. Размерности изображения высотой 224, шириной 224 и имеющие три цветовых канала RGB(Reg, Green, Blue) будут [224,224,3].

In [8]:
image = torch.rand([224, 224, 3])
print(image)
tensor([[[0.2108, 0.6413, 0.4129],
         [0.4957, 0.5724, 0.8258],
         [0.1545, 0.6535, 0.1010],
         ...,
         [0.0789, 0.6717, 0.3995],
         [0.3769, 0.1981, 0.0826],
         [0.4333, 0.0498, 0.7846]],

        [[0.3931, 0.6364, 0.5004],
         [0.6990, 0.3117, 0.9264],
         [0.2152, 0.3144, 0.8817],
         ...,
         [0.6506, 0.0955, 0.5790],
         [0.9403, 0.1125, 0.8858],
         [0.8609, 0.8387, 0.5631]],

        [[0.7162, 0.6685, 0.5323],
         [0.0908, 0.7679, 0.9984],
         [0.9343, 0.7144, 0.0608],
         ...,
         [0.2573, 0.3237, 0.7696],
         [0.3373, 0.9305, 0.5573],
         [0.3202, 0.5351, 0.1843]],

        ...,

        [[0.7689, 0.6877, 0.4539],
         [0.1958, 0.3759, 0.0209],
         [0.0944, 0.7666, 0.8888],
         ...,
         [0.4961, 0.6063, 0.9415],
         [0.2198, 0.5448, 0.4410],
         [0.8350, 0.5469, 0.2579]],

        [[0.2326, 0.1460, 0.8571],
         [0.1688, 0.9108, 0.0602],
         [0.6113, 0.5017, 0.9775],
         ...,
         [0.7913, 0.7223, 0.8693],
         [0.4018, 0.6548, 0.5758],
         [0.3276, 0.1723, 0.7972]],

        [[0.0862, 0.7957, 0.8724],
         [0.0795, 0.9897, 0.9071],
         [0.7856, 0.0085, 0.6585],
         ...,
         [0.7840, 0.7573, 0.9514],
         [0.8506, 0.3997, 0.7126],
         [0.2398, 0.4568, 0.6734]]])

Если визуализировать с помощью matplotlib изображение, то мы получим шум, потому что числа сгенерированы случайно. matplotlib - это библиотека Python для визуализации.

In [10]:
import matplotlib.pyplot as plt
plt.imshow(image)
Out[10]:
<matplotlib.image.AxesImage at 0x7fe3f36aaf50>

Можно получить любой элемент из тензора используя индекс. Например:

In [13]:
example_tensor = torch.rand([2,4])
print(example_tensor)
tensor([[0.3529, 0.7532, 0.7743, 0.2301],
        [0.4667, 0.2245, 0.1760, 0.4838]])
In [14]:
example_tensor[1,2]
Out[14]:
tensor(0.1760)

Хочу обратить внимание, что индексы в Python начинаются с нуля. То есть [1,2] вернуть вам элемент во второй строке, 3 колонке.

Поэлементные операции с тензорами

Над тензором доступные обычные математические операции такие как суммирование, вычитание, возведение в степень, sin, cos и другие. Например:

In [15]:
example_pow_tensor = torch.randn([3,3])
print(example_pow_tensor)
tensor([[-0.5697, -0.7838, -0.2360],
        [-0.1116,  1.3665,  1.6166],
        [-0.5598, -0.5104,  1.9507]])
In [18]:
print(torch.pow(example_pow_tensor, 2))
tensor([[0.3246, 0.6143, 0.0557],
        [0.0125, 1.8673, 2.6134],
        [0.3134, 0.2605, 3.8051]])

Поэлементные операции означают, что над каждым элементом тензора производится операция отдельно.

Матричное умножение

Обратите внимание, что умножение матриц производиться не поэлементно, а с помощью специальной операции, которая называется "matrix multiplication" или по-русски умножение матриц. Если вы видите умножение,то это "matrix multiplication", а не поэлементное умножение. Поэлементное умножение есть в Numpy, но применяется достаточно редко. Вам нужно запомнить, что если вы видите умножение двух матриц, то это "matrix multiplication".

In [21]:
matm1 = torch.randn([2,3])
matm2 = torch.randn([3,2])
result = matm1.mm(matm2)
print('Shape of result matrix ', result.shape)
print('Result matrix ', result)
Shape of result matrix  torch.Size([2, 2])
Result matrix  tensor([[-1.8897, -0.6794],
        [-2.0017,  0.2979]])

Измерения матрицы можно получить вызвав метод shape матрицы. Умножение матриц возможно если "внутренние" измерения равные. Например, матрицу с измерениями [2,3] я могу умножить на матрицу с измерениями [3,2], потому что последнее измерение первой матрицы равно первому измерению второй матрицы. Например, [3,2] нельзя умножить на [4,5].

Умножение матрицы на скалярное число производиться поэлементно.

Можно добавить измерение [1] в матрицу при этом смысл матрицы не меняется. Например, в матрицу [224,224,3] можно добавить измерение [1] в любое место, [224,224,3,1] или [224,1,224,3]. Это происходит потому, что при умножении измерений матрицы [224,224,3], 224 224 3 получается то же число, что умножении [224,224,3, 1], 224 224 3 * 1. Это очень важно понимать, так как при проектировании нейронной сети иногда нужно изменить измерения матрицы.

Существует еще одна важная операция под названием транспонирование tensor.T. Эта операция, реверсирует измерения матрицы. Например, [3,2] после транспонирования становиться [2,3]. Зачастую измерения матриц при умножении не совпадает. В этом случае можно использовать транспонирование.

Деление матриц

Деление матриц встречается реже. В двух словах вам нужно умножить первую матрицу на инверс второй матрицы и вы получите результат.

Как это все запомнить?

Запоминать ничего не нужно, вы поймете все операции на практике. Каждая операция имеет свой физический смысл. Главное понять физический смысл. Вы можете записаться на мой курс, где я все объясню.

Обучение

Линейная алгебра - это важная компонента работы нейронных сетей. Но ее можно достаточно быстро изучить.

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

In [ ]: