import torch # для начала импортируем саму библиотеку
?torch.tensor()
Docstring:
tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False) -> Tensor
Constructs a tensor with :attr:`data`.
.. warning::
:func:`torch.tensor` always copies :attr:`data`. If you have a Tensor
``data`` and want to avoid a copy, use :func:`torch.Tensor.requires_grad_`
or :func:`torch.Tensor.detach`.
If you have a NumPy ``ndarray`` and want to avoid a copy, use
:func:`torch.as_tensor`.
...
# Тензоры можно создавать несколькими способами:
# Из списка
print('Из списка\n', torch.tensor([1, 2, 3, 4, 5]), '\n---------\n\n')
# Заполняя их нормально распределенными случайными числами.
# Такая функция принимает размер тензора на вход
print('Нормальное распределение\n', torch.randn((5,)), '\n') # Здесь мы создаем вектор длины 5
print(torch.randn((2, 2)), '\n---------\n\n') # А здесь матрицу 2 на 2
# Заполняя их целыми случайными числами
# Такая функция принимает на вход размер тензора
# и верхнюю границу интервала, из которого будут
# выбираться случайные числа.
print('Целые случайные числа\n', torch.randint(high=10, size=(5,)), '\n') # Здесь мы создаем вектор длины 5
print(torch.randint(high=10, size=(2, 2)), '\n---------\n\n') # А здесь матрицу 2 на 2
Из списка
tensor([1, 2, 3, 4, 5])
---------
Нормальное распределение
tensor([2.2068, 2.0775, 2.5762, 1.4185, 1.6751])
tensor([[ 1.3320, -0.2528],
[-0.4859, 0.9697]])
---------
Целые случайные числа
tensor([5, 5, 4, 4, 2])
tensor([[2, 3],
[8, 2]])
# Создадим целочисленный тензор 3-го ранга и обратимся к нему по индексам
our_tensor = torch.randint(high=10, size=(2, 3, 4))
print('А вот и наш тензор:\n', our_tensor)
# Теперь обратимся к какому-то его элементу
# Обращаемся к нулевому элементу.
# Нулевой элемент -- это в данном случае матрица 3 на 4
print('\nНулевой элемент:\n', our_tensor[0])
# Обращаемся к нулевой строке нулевого элемента.
print('\nНулевая строка нулевого элемент:\n', our_tensor[0][0])
# Обращаемся к элементу с индексом 1, 2, 3
# То есть первая матрица, вторая строка, третий элемент
print('\nПервая матрица, вторая строка, третий элемент:\n', our_tensor[1][2][3])
# Кроме того, индексы можно писать через запятую:
print('\nПишем индексы через запятую:\n', our_tensor[1, 2, 3])
А вот и наш тензор:
tensor([[[9, 8, 2, 9],
[0, 5, 3, 9],
[2, 1, 2, 8]],
[[2, 7, 5, 9],
[5, 9, 8, 5],
[6, 8, 0, 2]]])
Нулевой элемент:
tensor([[9, 8, 2, 9],
[0, 5, 3, 9],
[2, 1, 2, 8]])
Нулевая строка нулевого элемент:
tensor([9, 8, 2, 9])
Первая матрица, вторая строка, третий элемент:
tensor(2)
Пишем индексы через запятую:
tensor(2)
# Воспользуемся нашим тензором из предыдущей клетки
print('Все тот же наш тензор:\n', our_tensor)
# Возьмем срез всех строк, всех столбцов всех матриц,
# то есть просто выведем весь тензор, используя знания о срезах
print('\nСрез всего тензора:\n', our_tensor[:, :, :])
Все тот же наш тензор:
tensor([[[6, 7, 6, 6],
[0, 3, 2, 6],
[0, 3, 9, 2]],
[[9, 9, 6, 2],
[5, 5, 8, 1],
[2, 6, 0, 9]]])
Срез всего тензора:
tensor([[[6, 7, 6, 6],
[0, 3, 2, 6],
[0, 3, 9, 2]],
[[9, 9, 6, 2],
[5, 5, 8, 1],
[2, 6, 0, 9]]])
# Теперь выведем только нулевую матрицу со всеми ее строками и столбцами
print('\nТолько нулевая матрица:\n', our_tensor[0, :, :])
# Точно также выведем первую матрицу со всеми ее строками и столбцами
print('\nТолько первая матрица:\n', our_tensor[1, :, :])
Только нулевая матрица:
tensor([[9, 8, 2, 9],
[0, 5, 3, 9],
[2, 1, 2, 8]])
Только первая матрица:
tensor([[2, 7, 5, 9],
[5, 9, 8, 5],
[6, 8, 0, 2]])
# А теперь выведем только нулевые строки всех матриц
print('\nТолько нулевые строки всех матриц:\n', our_tensor[:, 0, :])
# Теперь выведем только вторые строки всех матриц
print('\nТолько вторые строки всех матриц:\n', our_tensor[:, 2, :])
Только нулевые строки всех матриц:
tensor([[9, 8, 2, 9],
[2, 7, 5, 9]])
Только вторые строки всех матриц:
tensor([[2, 1, 2, 8],
[6, 8, 0, 2]])
# А сейчас выведем первые столбцы всех матриц
# Не удивляйтесь, они положены на бок
print('\nТолько первые столбцы всех матриц:\n', our_tensor[:, :, 1])
Только первые столбцы всех матриц:
tensor([[8, 5, 1],
[7, 9, 8]])
# Ну и последнее: выведем нулевые элементы всех вторых строк:
print('\nНулевые элементы всех вторых строк:\n', our_tensor[:, 2, 0]
Нулевые элементы всех вторых строк:
tensor([2, 6])
# Найдем сумму всех элементов тензора
all_sum = our_tensor.sum()
# кстати, выводить данные можно без функции print(),
# но это работает, только если вы выводите данные одной переменной
# вот так:
all_sum
tensor(124)
# Теперь найдем поэлементную сумму двух матриц нашего тензора
# Для этого укажем параметр axis=0
sum_0 = our_tensor.sum(axis=0)
sum_0
tensor([[11, 15, 7, 18],
[ 5, 14, 11, 14],
[ 8, 9, 2, 10]])
# Теперь найдем сумму всех столбцов для каждой матрицы
# Для этого укажем параметр axis=2
sum_2 = our_tensor.sum(axis=2)
sum_2
tensor([[28, 17, 13],
[23, 27, 16]])
# Найдем среднее всех элементов тензора
# mean() работает только с float() тензорами, поэтому преобразуем наш функцией float()
all_mean = our_tensor.float().mean()
all_mean
tensor(5.1667)
# Теперь найдем среднее всех строк для каждой матрицы
# Для этого укажем параметр axis=2
mean_2 = our_tensor.float().mean(axis=2)
mean_2
tensor([[7.0000, 4.2500, 3.2500],
[5.7500, 6.7500, 4.0000]])
from torch import nn
# Создадим экземпляры классов
# Среднеквадратичная ошибка
loss_mse_func = nn.MSELoss()
# Абсолютная ошибка
loss_mae_func = nn.L1Loss()
# Создадим тензоры и сразу зададим им тип float()
t_one = torch.randint(high=7, size=(7,), dtype=torch.float32)
t_two = torch.randint(high=7, size=(7,), dtype=torch.float32)
print(t_one, t_two)
tensor([4., 1., 0., 0., 2., 4., 4.]) tensor([0., 2., 2., 6., 2., 3., 1.])
# Посчитаем ошибки
loss_mse = loss_mse_func(t_one, t_two)
loss_mae = loss_mae_func(t_one, t_two)
print('Mean square error: ', loss_mse, '\nMean absolute error: ', loss_mae)
Mean square error: tensor(9.5714)
Mean absolute error: tensor(2.4286)