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

Итак, прежде чем начать, почему тензоры поначалу так тяжело даются? Это потому, что большинство из нас не очень хорошо визуализирует больше, чем пару измерений. В то время как тензоры могут быть глубже!

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

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

Ранг тензора:
Ранг указывает количество измерений (осей) тензора. Чтобы понять это с помощью подхода «сделай сам», ранг тензора указывает количество индексов, которые вам нужно пройти, чтобы получить одно число, заключенное в эти квадратные скобки. Или подумайте, сколько слоев или оберток квадратных скобок вам нужно развернуть, чтобы, наконец, добраться до вашего подарка, числа!

Форма тензора.
Форма тензора указывает размеры тензора по каждой оси. Он выражает длину каждой оси.

Тип данных тензора
Тип данных внутри тензора. Существуют различные типы данных, такие как целые числа и числа с плавающей запятой. Существуют также подтипы каждого типа.

Следующее изображение объясняет размеры и форму тензоров. Цвета используются для обозначения индексов соответствующего измерения. Красная стрелка показывает число, которого я хочу достичь, чтобы определить количество измерений. Примеры можно воспроизвести после импорта numpy как np.

Наряду с этим изображением я прошу своих читателей сосредоточиться на всех визуализациях, а также на цветах, которые я использовал, чтобы выделить самую сложную часть — размеры!

Тензор ранга 0 (скаляр):

Скалярное значение имеет тензор ранга 0, который представляет собой не что иное, как одно число. Вот и все. Нет размеров, осей и форм. Следующий код можно использовать для создания тензора ранга 0 и проверки его аспектов, таких как размеры, форма и тип данных. Итак, это просто число, и любое число!

import numpy as np

tensor_0d = np.array(4)
print(tensor_0d) 
print(tensor_0d.ndim)
print(tensor_0d.shape)
print(tensor_0d.dtypes)

Тензор ранга 1 (вектор):

Вероятно, вы слышали о векторах. Вектор — это упорядоченный массив чисел. Он имеет одну ось; следовательно, это тензор ранга 1. Его можно рассматривать как единый массив чисел.

import numpy as np

tensor_1d = np.array([1, 2, 3, 4])
print(tensor_1d) 
print(tensor_1d.ndim)
print(tensor_1d.shape)
print(tensor_1d.dtypes)

Вы также можете думать о массиве как о строке (выборке) из фрейма данных или таблицы. Чтобы понять это с помощью таблицы или набора данных, подумайте о любой строке из вашего фрейма данных. За каждой строкой фрейма данных стоит вектор. Здесь это показано на рисунке ниже:

Матрица:

Матрица — это тензор второго ранга. Простой способ представить матрицу — это представить себе таблицу или фрейм данных, где каждое значение идентифицируется со своей осью строки и столбца. Матрицу можно рассматривать как набор векторов, расположенных в виде сетки. Фрагмент кода ниже создает простую матрицу.

import numpy as np

tensor_2d = np.array([1, 2, 3, 4], [5 ,6, 7, 8])
print(tensor_2d) 
print(tensor_2d.ndim)
print(tensor_2d.shape)
print(tensor_2d.dtypes)

Как видно из этого фрагмента кода, матрица имеет два измерения, которые относятся к ее строкам и столбцам. Форма матрицы задается парой целых чисел (m, n), где m — количество строк, а n — количество столбцов. Итак, матрица представлена ​​(количество строк, количество столбцов). Чтобы помочь вам составить интуитивное представление об этом, ниже показана матрица, состоящая из нескольких векторов. Образец фрейма данных показывает некоторые данные о недвижимости. Он состоит из типовых домов со столбцами (признаками), такими как количество комнат, да/нет для гаража, возраст дома и, наконец, его цена:

А теперь начинается самое интересное. Так что приготовьтесь 😉

Тензоры ранга 3:

Тензоры ранга 3 представляют собой трехмерные массивы или тензоры с тремя осями. Их можно рассматривать как набор матриц, где каждая матрица представляет собой срез тензора вдоль третьей оси. Тензоры ранга 3 используются для представления последовательных данных (временных рядов), а также данных изображения. Вот как представлен каждый из них.

Представление последовательных данных в виде тензора ранга 3:
В представлении последовательных данных или данных временного ряда каждый элемент тензора представляет один временной шаг, а значения в каждом элементе представляют функции или измерения для этого временного шага. Таким образом, первое измерение представляет временные шаги, второе измерение представляет особенности каждого наблюдения, а третье измерение представляет отдельные точки данных в каждом наблюдении. В целом это представлено как (образцы, временные метки, функции). Например, предположим, что для товара у нас есть исторический набор данных за 5 дней. Вот как это делается:

Чтобы воссоздать этот пример, используйте следующий код:

import numpy as np
import pandas as pd

# Populating commodities prices data
df_prices = pd.DataFrame([['Mon', 1000, 992], 
                          ['Tue', 1010, 993], 
                          ['Wed', 1012, 999], 
                          ['Thur', 1011, 1000], 
                          ['Fri', 1008, 997]], 
                          columns=['Weekday', 'Highest Value', 'Lowest Value'])
# Isolating highest and lowest values columns
prices_data = df_prices.values[:,1:]

# Reshaping the prices data values
tensor_seq3d = np.array(prices_data).reshape(5, 2, 1)
print(tensor_seq3d)
print(tensor_seq3d.ndim)
print(tensor_seq3d.shape)
print(tensor_seq3d.dtypes)

Представление изображения в виде тензора ранга 3:
тензоры ранга 3 также используются для представления одного изображения с синтаксисом (высота, ширина, цветовые каналы).

Здесь первое измерение представляет высоту изображения, второе измерение представляет ширину изображения, а третье измерение представляет каналы, обычно красный, зеленый и синий (RGB). Каждый элемент тензора представляет интенсивность соответствующего пикселя изображения. Чтобы воспроизвести этот пример, используйте этот код:

import numpy as np
from PIL import Image

# The same image can be downloaded from ...
# ... https://www.pixilart.com/art/28x28-517d2f9c7af2f70 
# and keep it in the working directory

# Load Image
image = Image.open('pic1.png').convert("RGB")
image.show()

# Resize the image
image_resized = image.resize((4, 5))

# Convert the image to a NumPy array
tensor_img3d = np.asarray(image_resized)

print(tensor_img3d)
print(tensor_img3d.ndim)
print(tensor_img3d.shape)
print(tensor_img3d.dtypes)

Тензоры ранга 4:

Тензор ранга 4 представляет собой многомерный массив с четырьмя осями. Тензор ранга 4 представляет собой совокупность нескольких датчиков ранга 3. Ранг 4 используется для представления нескольких изображений. Кроме того, его также можно использовать для представления одного видео! Давайте посмотрим, как сделаны оба представления.

Представление нескольких изображений в виде тензора ранга 4:
Как упоминалось ранее, изображение имеет 3 измерения, поэтому его можно представить с помощью тензора ранга 3. Однако для нескольких изображений используется тензор ранга 4. Здесь первая ось представляет количество выборок. И следующие три оси такие же, как и у датчика ранга 3 (образцы, высота, ширина, цветовые каналы). Обратите внимание, что после первого измерения следующие измерения такие же, как у тензора ранга 3. Вот как тензор ранга 4 представляет пакет из трех изображений:

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

import numpy as np
from PIL import Image

# Multiple Images
image_paths = ['pic1.png', 'pic2.png', 'pic3.png'] # pass a list of some images
image_arrays = []  # list to store the image arrays

# loop through each image path and load the image as an array
for path in image_paths:
    image = Image.open(path).convert("RGB")
    image_resized = image.resize((128, 64))
    array = np.asarray(image_resized)
    image_arrays.append(array)

# Compiling it into a rank 4 tensor
tensor_imgs4d = np.asarray(image_arrays)

print(tensor_imgs4d)
print(tensor_imgs4d.ndim)
print(tensor_imgs4d.shape)
print(tensor_imgs4d.dtypes)

Синтаксис тензора ранга 4, представляющего пакет изображений, следующий:
(выборки, высота, ширина, цветовые каналы).

Представление одного видео с помощью тензора ранга 4:
Чтобы узнать, как видео может быть представлено с использованием того же ранга тензора, который используется для представления нескольких изображений, нам нужно вспомнить, что

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

Например, вот видео всадника, едущего на лошади. Номер каждого кадра отображает его порядок.

Это видео можно разбить на следующие кадры:

Поэтому одно видео похоже на несколько изображений, выставленных по порядку! Следовательно, он следует тому же синтаксису представления с небольшим изменением номенклатуры. Синтаксис: (кадры, высота, ширина, цветовые каналы).
Используйте следующий фрагмент кода, чтобы преобразовать любое видео mp4 в тензорное представление ранга 4. (Я рекомендую вам использовать небольшое видео)

import cv2
import numpy as np

# load the video file
cap = cv2.VideoCapture('video.mp4')

# Get the width and height of each frame
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# empty list to store these frames
frames = []

# Loop through each frame of the video
while cap.isOpened():
    # Read the frame
    ret, frame = cap.read()
    
    # If there are no more frames, break the loop
    if not ret:
        break
    
    # Convert the frame to grayscale color
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # Resize the frame to 28x28 or any you wish for
    resized_frame = cv2.resize(gray_frame, (28, 28))
    
    # Append the resized frame to the frames array
    frames.append(resized_frame)

# Release the video capture object
cap.release()

# Convert the frames array to a numpy array with 5 dimensions
tensor_vid4d = np.array(frames).reshape(1, len(frames), 1, 28, 28)

print(tensor_vid4d)
print(tensor_vid4d.ndim)
print(tensor_vid4d.shape)
print(tensor_vid4d.dtypes)

Тензоры ранга 5:

Тензор пятого ранга представляет собой многомерный массив с четырьмя осями. Тензор ранга 5 — это совокупность нескольких тензоров ранга 4, точно так же, как тензор ранга 4 — это совокупность нескольких тензоров ранга 3!

Обычно для представления пакета видео используются тензоры 5-го ранга. Здесь также аналогия тензора 5-го ранга, представляющего несколько видео, каждое видео тензора 4-го ранга можно вывести из того, как тензор 4-го ранга представляет набор изображений, где каждое изображение является тензором 3-го ранга.
Ранг 5 тензор для as (сэмплы, кадры, высота, ширина, цветовые каналы).

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

Спасибо, что прочитали мою статью 😃