Скаляры, векторы, матрицы и тензоры с Tensorflow 2.0
Скаляры: всего лишь одно число. Например, температура, которая обозначается всего одним числом.
Векторы: представляют собой массив чисел. Числа расположены по порядку, и мы можем идентифицировать каждый отдельный номер по его индексу в этом порядке. Мы можем думать о векторах как об идентифицирующих точках в пространстве, где каждый элемент задает координаты по разным осям. Проще говоря, вектор — это стрелка, представляющая величину, которая имеет как величину, так и направление, где длина стрелки представляет величину, а ориентация указывает вам направление. Например ветер, который имеет направление и величину.
Матрицы: Матрица представляет собой двумерный массив чисел, поэтому каждый элемент идентифицируется двумя индексами вместо одного. Если вещественная матрица А имеет высоту м и ширина н, то мы говорим, что A в Rm x n. Мы идентифицируем элементы матрицы как A_ (m, n), где м представляет строку и н представляет столбец.
Тензоры: В общем случае массив чисел, расположенных на регулярной сетке с переменным числом осей, называется тензором. Отождествим элементы тензора А по координатам(я, дж, к), написав A_(i, j, k). Но чтобы по-настоящему понять тензоры, нам нужно расширить представление о векторах как о стрелках с величиной и направлением. Помните, что вектор может быть представлен тремя компонентами, а именно компонентами x, y и z (базисными векторами). Если у вас есть ручка и бумага, давайте проведем небольшой эксперимент, поместите ручку вертикально на бумагу и наклоните ее под некоторым углом, а теперь посветите сверху светом так, чтобы тень ручки падала на бумагу, эта тень, представляет компонент x вектора «ручка», а высота от бумаги до кончика пера представляет собой компонент y. Теперь давайте возьмем эти компоненты для описания тензоров, представьте, что вы Индиана Джонс или охотник за сокровищами, и вы попали в куб, и к вам летят три стрелы с трех граней (для представления осей x, y, z) куба. куб 😬, я знаю, что это будет последнее, что вы подумали бы в такой ситуации, но вы можете думать об этих трех стрелках как о векторах, указывающих на вас с трех граней куба, и вы можете представить эти векторы (стрелки) в x , компоненты y и z, теперь это тензор (матрица) ранга 2 с 9 компонентами. Помните, что это очень простое объяснение тензоров. Ниже приведено представление тензора:
Мы можем добавлять матрицы друг к другу, если они имеют одинаковую форму, просто добавляя соответствующие элементы:
C = A + B, где C_(i,j) = A_(i,j) + B_(i,j)
Если у вас возникли проблемы с просмотром уравнений в браузере, вы также можете прочитать главу в Юпитер nbviewer в целом. Если нет, продолжим.
В тензорном потоке:
- Тензор ранга 0 является скаляром
- Тензор ранга 1 является вектором
- Тензор ранга 2 является матрицей
- Тензор ранга 3 является 3-тензором
- Тензор ранга n является n-тензором
# let's create a ones 3x3 rank 2 tensor
rank_2_tensor_A = tf.ones([3, 3], name="MatrixA")
print("3x3 Rank 2 Tensor A: \n{}\n".format(rank_2_tensor_A)) # let's manually create a 3x3 rank two tensor and specify the data type as float
rank_2_tensor_B = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]], name="MatrixB", dtype=tf.float32)
print("3x3 Rank 2 Tensor B: \n{}\n".format(rank_2_tensor_B)) # addition of the two tensors
rank_2_tensor_C = tf.add(rank_2_tensor_A, rank_2_tensor_B, name="MatrixC")
print("Rank 2 Tensor C with shape={} and elements: \n{}".format(rank_2_tensor_C.shape, rank_2_tensor_C)) 3x3 Rank 2 Tensor A:
[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] 3x3 Rank 2 Tensor B:
[[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]] Rank 2 Tensor C with shape=(3, 3) and elements:
[[2. 3. 4.] [5. 6. 7.] [8. 9. 10.]]
# Let's see what happens if the shapes are not the same
two_by_three = tf.ones([2, 3])
try: incompatible_tensor = tf.add(two_by_three, rank_2_tensor_B)
except: print("""Incompatible shapes to add with two_by_three of shape {0} and 3x3 Rank 2 Tensor B of shape {1} """.format(two_by_three.shape, rank_2_tensor_B.shape)) Incompatible shapes to add with two_by_three of shape (2, 3) and 3x3 Rank 2 Tensor B of shape (3, 3)
Мы также можем добавить скаляр к матрице или умножить матрицу на скаляр, просто выполнив эту операцию над каждым элементом матрицы:
D = aB + c, где D_(i,j) = a.B_(i,j) + c
# Create scalar a, c and Matrix B
rank_0_tensor_a = tf.constant(2, name="scalar_a", dtype=tf.float32)
rank_2_tensor_B = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]], name="MatrixB", dtype=tf.float32)
rank_0_tensor_c = tf.constant(3, name="scalar_c", dtype=tf.float32) # multiplying aB
multiply_scalar = tf.multiply(rank_0_tensor_a, rank_2_tensor_B)
# adding aB + c
rank_2_tensor_D = tf.add(multiply_scalar, rank_0_tensor_c, name="MatrixD") print("""Original Rank 2 Tensor B: \n{0} \n\nScalar a: {1}
Rank 2 Tensor for aB: \n{2} \n\nScalar c: {3} \nRank 2 Tensor D = aB + c: \n{4}
""".format(rank_2_tensor_B, rank_0_tensor_a, multiply_scalar, rank_0_tensor_c, rank_2_tensor_D)) Original Rank 2 Tensor B:
[[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]] Scalar a: 2.0
Rank 2 Tensor for aB:
[[2. 4. 6.] [8. 10. 12.] [14. 16. 18.]] Scalar c: 3.0
Rank 2 Tensor D = aB + c:
[[5. 7. 9.] [11. 13. 15.] [17. 19. 21.]]
Одной из важных операций над матрицами является транспонировать. Транспонированием матрицы называют зеркальное отображение матрицы поперек диагональной линии, называемой главная диагональ. Обозначим транспонирование матрицы А как AT и определяется как таковой: AT (я, j) = А(дж, я)
# Creating a Matrix E
rank_2_tensor_E = tf.constant([[1, 2, 3], [4, 5, 6]])
# Transposing Matrix E
transpose_E = tf.transpose(rank_2_tensor_E, name="transposeE") print("""Rank 2 Tensor E of shape: {0} and elements: \n{1}\n
Transpose of Rank 2 Tensor E of shape: {2} and elements: \n{3}""".format(rank_2_tensor_E.shape, rank_2_tensor_E, transpose_E.shape, transpose_E)) Rank 2 Tensor E of shape: (2, 3) and elements:
[[1 2 3] [4 5 6]] Transpose of Rank 2 Tensor E of shape: (3, 2) and elements:
[[1 4] [2 5] [3 6]]
В глубоком обучении мы допускаем добавление матрицы и вектора, что дает другую матрицу, где C_(i, j) = A_(i, j) + b_(j). Другими словами, вектор б добавляется к каждой строке матрицы. Это неявное копирование б во многие места называется вещание
# Creating a vector b
rank_1_tensor_b = tf.constant([[4.], [5.], [6.]])
# Broadcasting a vector b to a matrix A such that it yields a matrix F = A + b
rank_2_tensor_F = tf.add(rank_2_tensor_A, rank_1_tensor_b, name="broadcastF") print("""Rank 2 tensor A: \n{0}\n \nRank 1 Tensor b: \n{1}
\nRank 2 tensor F = A + b:\n{2}""".format(rank_2_tensor_A, rank_1_tensor_b, rank_2_tensor_F)) Rank 2 tensor A:
[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] Rank 1 Tensor b:
[[4.] [5.] [6.]] Rank 2 tensor F = A + b:
[[5. 5. 5.] [6. 6. 6.] [7. 7. 7.]]
Это второй раздел главы о линейной алгебре с Tensorflow 2.0 книги. Глубокое обучение с Tensorflow 2.0.
Вы можете прочитать этот раздел и следующие темы:
02.01 — Скаляры, векторы, матрицы и тензоры
02.02 — Умножение матриц и векторов
02.03 — Тождественные и обратные матрицы
02.04 — Линейная зависимость и размах
02.05 — Нормы
02.06 — Специальные виды матриц и векторов
02.07 — Собственная композиция
02.08 — Разложение по сингулярным числам
02.09 — Псевдоинверсия Мура-Пенроуза
02.10 — Оператор трассировки
02.11 — Определитель
02.12 — Пример: анализ основных компонентов
в Глубокое обучение с TF 2.0: 02.00 — Линейная алгебра. Вы можете получить код для этой статьи и остальной части главы здесь. Ссылки на блокнот в Google Colab и Jupyter Binder находятся в конце ноутбук.