Введение в Python (Исскуственный интелект и параллельное програм. 1 лр понятие тензора 19. 1 Понятие тензора Тензор
Скачать 147.95 Kb.
|
1 ЛР Понятие тензора 19.1 Понятие тензора Те́нзор (от лат. tensus, «напряжённый») — объект линейной алгебры, линейно преобразующий элементы одного линейного пространства в элементы другого. Частными случаями тензоров являются скаляры, векторы, билинейные формы и т. п. Таблицу чисел мы называем матрицей, но не всякая матрица является тензором. Матрица является лишь одним из способов записи тензора, а не самим математическим объектом — тензором. Часто тензор представляют как многомерную таблицу d x d x ... x d, заполненную числами — компонентами тензора (где d — размерность векторного пространства, над которым задан тензор, а число сомножителей совпадает с т. н. валентностью или рангом тензора). Такие таблицы, в случае двумерного массива (тензор ранга 2) отображают матричной записью: Примеры частного случая тензора: Тензор нулевого ранга называют тензором ранга (0 , 0) или скаляром, его математической записью является число. Тензором считается лишь тот параметр предмета, которому приписываются разные числа и существует закон преобразования одних чисел в другие. Например, длина предмета в разных единицах измерения и правило для преобразования размерности. Тензор 1-го ранга называют вектором, например [6, 8, 9] . Количество чисел (элементов) в векторе не влияет на ранг тензора. Математической записью тензора 2-го ранга может служить таблица чисел, например [[6, 8, 9], [2, 5, 7]], мы называем это «матрицей» (которая имеет две строки и три столбца). Тензор - это контейнер для данных, но не просто массив чисел, это математический объект, который как объект не зависит от смены системы координат, но его компоненты при смене системы координат преобразуются по определенному математическому закону. Тензорное исчисление является основой для вычислений в нейронных сетях. Как раз название одной из доминирующих сред глубокого обучения для Data Scientists - TensorFlow происходит от операций с многомерными массивами данных - тензорами. В терминах TensorFlow скаляр является тензором ранга 0, вектор - рангом 1, матрица - рангом 2 и т. д. Материалы для самостоятельного изучения: 1. Краткое введение в тензоры - https://habr.com/ru/post/261563/ 2. Магия тензорной алгебры: Часть 1 — что такое тензор и для чего он нужен? https://habr.com/ru/post/261421/ 3. Тензор https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BD%D0%B7%D0%BE%D1%80 4. Тензорное исчисление для «чайников» https://ftfsite.ru/wp-content/files/tensor_dla_chainikov_2.1.pdf 19.2 Оси тензора Ранг тензора совпадает с количеством его осей . Соответственно: количество осей для тензора 0-го ранга = 0; количество осей для тензора 1-го ранга = 1; количество осей для тензора 2-го ранга или матрицы = 2 - это строки и столбцы матрицы; количество осей для тензора 3-го ранга = 3 и т.д. Метод (атрибут) ndim позволяет определить количество осей тензора Numpy. Пример кода для определения количества осей тензора: import numpy as np x = np.array(1) print(x.ndim) y = np.array([1, 2, 3]) print(y.ndim) z = np.array([[1, 2, 3], [4,5,6]]) print(z.ndim) Введите в окно ответа результат выполнения данного кода. import numpy as np x = np.array(200) print(x.ndim) Ответ 0 import numpy as np y = np.array([1, 2, 3, 4, 5, 6]) print(y.ndim) Ответ 1 import numpy as np x = np.array([[1, 2, 3], [4,5,6], [4,5,6], [4,5,6]]) print(x.ndim) Ответ 2 19.3 Массивы. Основы линейной алгебры. В рамках линейной алгебры мы рассмотрим основные операции, которые можно производить над матрицами: умножение матрицы на число сложение матриц скалярное произведение векторов векторное произведение векторов произведение матриц Умножение матрицы на число - это последовательное умножение каждого элемента матрицы на число, результатом умножения матрицы на числоявляется новая матрица; Сложение матриц - это последовательное сложение элементов каждой из матриц, в случае если размерность матриц совпадает (аналогично для разности двух матриц - каждый элемент новой матрицы будет равен поэлементной разности двух других матриц), результатом сложения или разности матриц является новая матрица. Пример кода умножения матрицы на число и сложения матриц: a = np.eye(3, 4, 0, int) # матрица из 3-х строк и 4-х столбцов из 0, с 1 - по главной диагонали b = np.eye(3, 4, 1, int) # матрица из 3-х строк и 4-х столбцов из 0, с 1 - по верхней диагонали c = 2*a + b print(c) Результат выполнения кода: [[2 1 0 0] [0 2 1 0] [0 0 2 1]] Добавьте вывод элементов каждой из матриц - исходных, умноженной на число. import numpy as np a = np.eye(3, 4, 0, int) b = np.eye(3, 4, 1, int) c = 2*a + b print(c) Результат выполнения кода: [[2 1 0 0] [0 2 1 0] [0 0 2 1]] Скалярное произведение векторов Длина (модуль) вектора a = (a1, a2, a3) равна квадратному корню из суммы квадратов элементов вектора |а| = {\sqrt{(а1)^2 + (а2)^2 + (a3)^2 } }∣а∣=(а1)2+(а2)2+(a3)2 Скалярное произведение векторов (a, b), гдеa = (a1, a2, a3...) и b = (b1, b2, b3...) - это число (скаляр), равное сумме произведений поэлементного умножения векторов, т.е. (a, b) = a1·b1+a2·b2 + a3·b3 + ... или произведению длин векторов на косинус угла между ними. Пусть мы имеем два вектора a = [1, 2, 3] и b = [4, 5, 6], их скалярное произведение будет равно (a, b) = 1·4 + 2·5 + 3·6 = 32. Пакетnumpy.linalg в Python содержит стандартные операции с матрицами. Для реализации скалярного произведения векторов и произведения матриц одинакового размера используется функция numpy.dot(массив1, массив2) или другой формат записи : массив1.dot(массив2). Пример кода для вычисления скалярного произведения векторов: import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) print("Скалярное произведение векторов a = {} и b = {}:".format(a, b)) print(np.dot(a, b)) print("Скалярное произведение:", a.dot(b)) # другой формат функции dot Результат выполнения кода: Скалярное произведение векторов a = [1 2 3] и b = [4 5 6]: 32 Скалярное произведение: 32 Пример кода для вычисления скалярного произведения векторов: import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) print("Скалярное произведение векторов a = {} и b = {}:".format(a, b)) print(np.dot(a, b)) print("Скалярное произведение:", a.dot(b)) Результат выполнения кода: Скалярное произведение векторов a = [1 2 3] и b = [4 5 6]: 32 Скалярное произведение: 32 Чему будет равно скалярное произведение векторов а = [4, 1, 8] и b = [4, 5, 6]? кода для вычисления скалярного произведения векторов: import numpy as np a = np.array([4,1,8]) b = np.array([4,5,6]) print("Скалярное произведение векторов a = {} и b = {}:".format(a, b)) print(np.dot(a, b)) print("Скалярное произведение:", a.dot(b)) Результат выполнения кода: Скалярное произведение векторов a = [4 1 8] и b = [4 5 6]: 69 Скалярное произведение: 69 Векторное произведение двух векторов [a х b], гдеa = (a1, a2, a3...) и b = (b1, b2, b3...) - это вектор, равный произведению длин векторов на синус угла между ними, его значение можно вычислить по схеме приведенной ниже. В Python для реализации векторного произведения векторов используется функция numpy.cross(массив1, массив2): Пример кода векторного произведения двух векторов: import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = np.cross(a, b) print("Вектор а =", a) print("\nВектор b =", b) print("\nВекторное произведение [a x b] =", c) Результат выполнения кода: Вектор а = [1 2 3] Вектор b = [4 5 6] Векторное произведение [a x b] = [-3 6 -3] Повторите этот код в Colaboratory. Измените значения числовых векторов. Произведение матриц Умножать матрицы можно при условии, если количество столбцов первой матрицы равно количеству строк второй матрицы! Пример кода произведения матриц: import numpy as np a = np.array([[1,2], [3,4]]) print( "\nМассив a:\n", a) b = np.array([[1,2], [3,4]]) print( "\nМассив b:\n", b) print( """\nПроизведение двух массивов а и b: 1 - (1,2)*(1,3) = 1*1 + 2*3 = 7 2 - (1,2)*(2,4) = 1*2 + 2*4 = 10 3 - (3,4)*(1,3) = 3*1 + 4*3 = 15 4 - (3,4)*(2,4) = 3*2 + 4*4 = 22""") print(a.dot(b)) Результат выполнения кода: Массив a: [[1 2] [3 4]] Массив b: [[1 2] [3 4]] Произведение двух массивов а и b: 1 - (1,2)*(1,3) = 1*1 + 2*3 = 7 2 - (1,2)*(2,4) = 1*2 + 2*4 = 10 3 - (3,4)*(1,3) = 3*1 + 4*3 = 15 4 - (3,4)*(2,4) = 3*2 + 4*4 = 22 [[ 7 10] [15 22]] Повторите этот код в Colaboratory, поэкспериментируйте с нахождением произведений разных матриц. import numpy as np a = np.array([[1,2], [3,4]]) print( "\nМассив a:\n", a) b = np.array([[1,2], [3,4]]) print( "\nМассив b:\n", b) print( """\nПроизведение двух массивов а и b:""") print(a.dot(b)) Результат выполнения кода: Массив a: [[1 2] [3 4]] Массив b: [[1 2] [3 4]] Произведение двух массивов а и b: [[ 7 10] [15 22]] Найдите произведение двух матриц. Первая матрица состоит из единиц, формат массива (5, 3); вторая матрица состоит из семерок, формат массива (3, 2). Сделайте вывод каждой матрицы и их произведения. Для корректной проверки кода, вывод текста и соответствующей ему матрицы реализуйте в операторе print для каждой матрицы. Для переноса на следующую строку используйте \n. Sample Input: Sample Output: Первая матрица: [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] Вторая матрица: [[7 7] [7 7] [7 7]] Произведение матриц: [[21. 21.] [21. 21.] [21. 21.] [21. 21.] [21. 21.]] Код произведение двух матриц import numpy as np a=np.full((5, 3), 1, dtype=float) print("\nПервая матрица:\n", a) b=np.full((3, 2), 7, dtype=int) print("\nВторая матрица:\n", b) print("\nПроизведение матриц:\n", a.dot(b)) 2 ЛР Представление данных для нейронных сетей. Часть 1. Тензор определяется тремя ключевыми атрибутами: Количество осей (ранг) Форма — кортеж целых чисел, описывающих количество измерений на каждой оси тензора. Тип данных — это тип данных, содержащихся в тензоре; например, тензор может иметь тип float32, uint8, float64 и др. (стандартный способ определить тип данных в Python через метод dtype) Подробнее о ключевых атрибутах тензора прочитайте в разделе 2 .2 .5 . Ключевые атрибуты, Шолле Ф. "Глубокое обучение на Python". Вставьте описание в отчет. Ключевые атрибуты тензоров Тензор определяется тремя ключевыми атрибутами: 1-Количество осей (ранг) — например, трехмерный тензор имеет три оси, а матрица — две. В библиотеках для Python, таких как Numpy, этот атрибут тензоров имеет имя ndim . 2-Форма — кортеж целых чисел, описывающих количество измерений на каждой оси тензора. Например, матрица в предыдущем примере имеет форму (3, 5) , а трехмерный тензор имеет форму (3, 3, 5) . Вектор имеет форму с единственным элементом, например (5,) , тогда как скаляр имеет пустую форму (). В NumPy форма хранится в атрибуте shape. 3-Тип данных (обычно в библиотеках для Python ему дается имя dtype ) — это тип данных, содержащихся в тензоре; например, тензор может иметь тип float32 , uint8 , float64 и др. В редких случаях можно встретить тензоры типа char. Обратите внимание, что в Numpy (и в большинстве других библиотек) отсутствуют строковые тензоры, потому что тензоры хранятся в заранее выделенных, непрерывных сегментах памяти и строки, будучи сущностями с изменяющейся длиной, препятствуют использованию такой реализации. В NumPy форма хранится в атрибуте dtype. 20.2 Добавление осей Размерность массива может быть увеличена при использовании константы newaxis (подробнее https://habr.com/ru/post/352678/) или с помощью функции expand_dims() (подробнее https://pyprog.pro/array_manipulation/expand_dims.html). 20.3 Набор данных MNIST Решение» задачи MNISTв глубоком обучении - это аналог «Hello World» в программировании на Python. Посмотрим на данные из набора MNIST и разберемся как подготовить данные для нейронной сети. Запустите этот блокнот и следуйте инструкции. Удачи! https://colab.research.google.com/drive/1EDYBOC4Ozm1ROpyVVA85X2l50DDnCFwx |