5 простых шагов, чтобы освоить Tensorflow Tensor

машинное обучение глубокое обучение компьютерное зрение NLP

Автор | Орхан Г. Ялчин Компилировать|ВКонтакте Источник | К науке о данных

Если вы читаете это, я считаю, что у нас схожие интересы и мы работаем/будем работать в схожих отраслях.

В этом посте мы углубимся в детали Tensorflow Tensor. Мы рассмотрим все темы, связанные с Tensor в Tensorflow, за следующие пять простых шагов:

  • Шаг 1: Определение тензора → Что такое тензор?

  • Шаг 2: Создайте тензор → функция для создания объекта тензора

  • Шаг 3: Особенности тензорных объектов

  • Шаг 4: Тензорные операции → Индексирование, Основные тензорные операции, Операции с формами, Трансляция

  • Шаг 5: Специальные тензоры

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

Тензоры — это однородные многомерные массивы TensorFlow. Они очень похожи на массивы NumPy и являются неизменяемыми, то есть их нельзя изменить после создания. Для создания новых копий можно использовать только правки.

Давайте посмотрим, как тензоры работают с примерами кода. Но сначала, чтобы использовать объекты TensorFlow, нам нужно импортировать библиотеку TensorFlow. Мы часто используем NumPy с TensorFlow, поэтому мы также можем импортировать NumPy со следующей строкой:

import tensorflow as tf
import numpy as np

Создание тензоров: создание тензорных объектов

Существует несколько способов создания объекта tf.Tensor. Начнем с нескольких примеров. Объекты Tensor можно создавать с помощью нескольких функций TensorFlow, как показано в следующем примере:

# 你可以用`tf.constant`函数创建tf.Tensor对象:
x = tf.constant([[1, 2, 3, 4 ,5]])
# 你可以用`tf.ones`函数创建tf.Tensor对象:
y = tf.ones((1,5))
# 你可以用`tf.zeros`函数创建tf.Tensor对象:
z = tf.zeros((1,5))
# 你可以用`tf.range`函数创建tf.Tensor对象:
q = tf.range(start=1, limit=6, delta=1)

print(x)
print(y)
print(z)
print(q)
输出:

tf.Tensor([[1 2 3 4 5]], shape=(1, 5), dtype=int32)
tf.Tensor([[1. 1. 1. 1. 1.]], shape=(1, 5), dtype=float32) 
tf.Tensor([[0. 0. 0. 0. 0.]], shape=(1, 5), dtype=float32) 
tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

Как видите, мы создали тензорный объект формы (1,5) с помощью трех разных функций и четвертый тензорный объект формы (5,) с помощью функции tf.range(). Обратите внимание, что tf.ones и tf.zeros принимают форму в качестве обязательного параметра, потому что значения их элементов предопределены.

Особенности тензорных объектов

tf.Tensor создает объекты, которые имеют несколько характеристик. Во-первых, они имеют количество измерений. Во-вторых, у них есть форма, список, состоящий из длин измерений. Все тензоры имеют размер, который представляет собой общее количество элементов в тензоре. Наконец, их элементы записываются в унифицированный тип данных (datatype). Рассмотрим эти характеристики подробнее.

измерение

Тензоры классифицируются в зависимости от их размерности:

  • Тензор ранга-0 (скалярный): тензор (0-мерный), содержащий одно значение и не имеющий осей;

  • Тензор ранга-1: тензор, содержащий список одноосных (одномерных) значений;

  • Тензор ранга 2: тензор, содержащий 2 оси (2 измерения); и

  • Тензор ранга N: тензор (в трех измерениях), содержащий N осей.

Например, мы можем создать тензор ранга 3, передав tf.constant объект трехуровневого вложенного списка. В этом примере мы можем разделить числа на 3-уровневый вложенный список с 3 элементами на каждом уровне:

three_level_nested_list = [[[0, 1, 2], 
                             [3, 4, 5]], 
                           [[6, 7, 8], 
                            [9, 10, 11]] ]
rank_3_tensor = tf.constant(three_level_nested_list)
print(rank_3_tensor)
Output:
tf.Tensor( [[[ 0  1  2]   
             [ 3  4  5]]   
             
            [[ 6  7  8]   
             [ 9 10 11]]],
  shape=(2, 2, 3), dtype=int32)

Мы можем видеть, сколько измерений объекта «rank_3_tensor» в настоящее время имеет атрибут «.ndim».

tensor_ndim = rank_3_tensor.ndim
print("The number of dimensions in our Tensor object is", tensor_ndim)
Output:
The number of dimensions in our Tensor object is 3

форма

Функция формы — это еще одно свойство, которое есть у каждого тензора. Он отображает размер каждого измерения в виде списка. Мы можем просмотреть форму объекта rank_3_tensor, созданного с использованием свойства .shape, следующим образом:

tensor_shape = rank_3_tensor.shape
print("The shape of our Tensor object is", tensor_shape)
Output:
The shape of our Tensor object is (2, 2, 3)

Как видите, наш тензор имеет два элемента в первом слое, два элемента во втором слое и три элемента в третьем слое.

размер

Размер — еще одна характеристика тензора, он означает, сколько элементов имеет тензор. Мы не можем измерить размер свойствами тензорных объектов. Вместо этого нам нужно использовать функцию tf.size. Наконец, мы будем использовать функцию экземпляра .NumPy() для преобразования вывода в NumPy для более удобочитаемого результата:

tensor_size = tf.size(rank_3_tensor).numpy()
print("The size of our Tensor object is", tensor_size)
Output:
The size of our Tensor object is 12

тип данных

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

Однако каждый тензорный объект должен хранить все свои элементы в едином типе данных. Следовательно, мы также можем использовать свойство .dtype, чтобы увидеть тип данных, выбранный для конкретного тензорного объекта, например:

tensor_dtype = rank_3_tensor.dtype
print("The data type selected for this Tensor object is", tensor_dtype)
Output:
The data type selected for this Tensor object is <dtype: 'int32'>

Тензорные операции

показатель

Индекс — это числовое представление позиции элемента в последовательности. Эта последовательность может относиться ко многим вещам: к списку, к строке или к любой последовательности значений.

TensorFlow также следует стандартным правилам индексации Python, которые аналогичны индексации списка или индексации массива NumPy.

Некоторые правила индексации:

  1. Индексация начинается с нуля (0).

  2. Отрицательные значения индекса ("-n") означают обратный отсчет с конца.

  3. Двоеточие (":") используется для фрагмента:начало:остановка:шаг.

  4. Запятые (",") используются для достижения более глубоких уровней.

Давайте создадим rank_1_tensor со следующими строками:

single_level_nested_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
rank_1_tensor = tf.constant(single_level_nested_list)
print(rank_1_tensor)
Output: 
tf.Tensor([ 0  1  2  3  4  5  6  7  8  9 10 11], 
  shape=(12,), dtype=int32)

Проверьте наши правила 1, 2, 3:

# 规则1,索引从0开始
print("First element is:",
  rank_1_tensor[0].numpy())


# 规则2,负索引
print("Last element is:",
  rank_1_tensor[-1].numpy())


# 规则3,切片
print("Elements in between the 1st and the last are:",
  rank_1_tensor[1:-1].numpy())
Output: 
First element is: 0 
Last element is: 11 
Elements in between the 1st and the last are: [ 1  2  3  4  5  6  7  8  9 10]

Теперь давайте создадим rank_2_tensor со следующим кодом:

two_level_nested_list = [ [0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11] ]
rank_2_tensor = tf.constant(two_level_nested_list)
print(rank_2_tensor)
Output:
tf.Tensor( [[ 0  1  2  3  4  5]  
            [ 6  7  8  9 10 11]], shape=(2, 6), dtype=int32)

И проверьте правило 4 на нескольких примерах:

print("The 1st element of the first level is:",
  rank_2_tensor[0].numpy())

print("The 2nd element of the first level is:",
  rank_2_tensor[1].numpy())

# 规则4, 逗号代表进入更深层
print("The 1st element of the second level is:",
  rank_2_tensor[0, 0].numpy())

print("The 3rd element of the second level is:",
  rank_2_tensor[0, 2].numpy())
Output: 
The first element of the first level is: [0 1 2 3 4 5] 
The second element of the first level is: [ 6  7  8  9 10 11] 
The first element of the second level is: 0 
The third element of the second level is: 2

Теперь, когда мы рассмотрели основы индексации, давайте посмотрим на основные операции, которые мы можем выполнять с тензорами.

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

Вы можете легко выполнять базовые математические операции с тензорами, например:

  1. добавление

  2. поэлементное умножение

  3. умножение матриц

  4. Найдите максимальное или минимальное значение

  5. Найдите индекс элемента Max

  6. Рассчитать значение Softmax

Давайте рассмотрим эти операции. Мы создадим два тензорных объекта и применим эти операции.

a = tf.constant([[2, 4], 
                 [6, 8]], dtype=tf.float32)
b = tf.constant([[1, 3], 
                 [5, 7]], dtype=tf.float32)

Мы можем начать с дополнения.

# 我们可以使用' tf.add() '函数并将张量作为参数传递。
add_tensors = tf.add(a,b)
print(add_tensors)
Output:
tf.Tensor( [[ 3.  7.]  
            [11. 15.]], shape=(2, 2), dtype=float32)

умножение

# 我们可以使用' tf.multiply() '函数并将张量作为参数传递。
multiply_tensors = tf.multiply(a,b)
print(multiply_tensors)
Output:
tf.Tensor( [[ 2. 12.]  
            [30. 56.]], shape=(2, 2), dtype=float32)

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

# 我们可以使用' tf.matmul() '函数并将张量作为参数传递。
matmul_tensors = tf.matmul(a,b)
print(matmul_tensors)
Output:
tf.Tensor( [[ 2. 12.]  
            [30. 56.]], shape=(2, 2), dtype=float32)

Примечание. Операции Matmul лежат в основе алгоритмов глубокого обучения. Так что даже если вы не будете использовать matmul напрямую, очень важно понимать эти операции.

Примеры других действий, которые мы перечислили выше:

# 使用' tf.reduce_max() '和' tf.reduce_min() '函数可以找到最大值或最小值
print("The Max value of the tensor object b is:",
  tf.reduce_max(b).numpy())

# 使用' tf.argmax() '函数可以找到最大元素的索引
print("The index position of the max element of the tensor object b is:",
  tf.argmax(b).numpy())

# 使用 tf.nn.softmax'函数计算softmax
print("The softmax computation result of the tensor object b is:",
  tf.nn.softmax(b).numpy())
Output:
The Max value of the tensor object b is: 1.0 
The index position of the Max of the tensor object b is: [1 1] 
The softmax computation result of the tensor object b is: [[0.11920291 0.880797  ]  [0.11920291 0.880797  ]]

Управление фигурами

Как и в массивах NumPy и фреймах данных pandas, вы также можете изменять форму тензорных объектов.

Эта операция деформации выполняется очень быстро, потому что базовые данные не нужно копировать. Для операции изменения формы мы можем использовать функцию tf.reshape.

# 我们的初始张量
a = tf.constant([[1, 2, 3, 4, 5, 6]])
print('The shape of the initial Tensor object is:', a.shape)

b = tf.reshape(a, [6, 1])
print('The shape of the first reshaped Tensor object is:', b.shape)

c = tf.reshape(a, [3, 2])
print('The shape of the second reshaped Tensor object is:', c.shape)

# 如果我们以shape参数传递-1,那么张量就变平坦化。
print('The shape of the flattened Tensor object is:', tf.reshape(a, [-1]))
Output:
The shape of our initial Tensor object is: (1, 6) 
The shape of our initial Tensor object is: (6, 1) 
The shape of our initial Tensor object is: (3, 2) 
The shape of our flattened Tensor object is: tf.Tensor([1 2 3 4 5 6], shape=(6,), dtype=int32)

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

транслировать

Когда мы пытаемся объединить операции с несколькими тензорными объектами, меньшие тензоры могут автоматически растягиваться, чтобы соответствовать большим тензорам, точно так же, как массивы NumPy. Например, когда вы пытаетесь умножить скалярный тензор на тензор ранга 2, скаляр будет растянут для умножения каждого элемента тензора ранга 2. См. следующие примеры:

m = tf.constant([5])

n = tf.constant([[1,2],[3,4]])

print(tf.multiply(m, n))
Output:
tf.Tensor( [[ 5 10]  
            [15 20]], shape=(2, 2), dtype=int32)

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

Специальные типы тензоров

Мы склонны генерировать прямоугольные тензоры и хранить значения в виде элементов. Однако TensorFlow также поддерживает нестандартные или специальные типы тензоров, в том числе:

  1. рваный тензор

  2. тензор струн

  3. разреженный тензор

Давайте подробнее рассмотрим, что из себя представляет каждый.

рваный тензор

Рваный тензор — это тензор с разным количеством элементов вдоль размерной оси.

Нерегулярный тензор можно построить следующим образом

ragged_list = [[1, 2, 3],[4, 5],[6]]

ragged_tensor = tf.ragged.constant(ragged_list)

print(ragged_tensor)
Output:
<tf.RaggedTensor [[1, 2, 3], 
                  [4, 5], 
                  [6]]>

тензор струн

Тензоры строк — это тензоры, которые хранят строковые объекты. Мы можем создать строковый тензор точно так же, как вы создали бы обычный тензорный объект. Однако мы передаем строковые объекты как элементы вместо числовых объектов, например:

string_tensor = tf.constant(["With this", 
                             "code, I am", 
                             "creating a String Tensor"])

print(string_tensor)
Output:
tf.Tensor([b'With this' 
           b'code, I am' 
           b'creating a String Tensor'],
  shape=(3,), dtype=string)

разреженный тензор

Наконец, разреженный тензор — это прямоугольный тензор разреженных данных. Разреженный тензор — это объект, когда в данных есть нулевые значения. Создание разреженных тензоров требует немного времени и должно стать более популярным. Вот пример:

sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [2, 2], [4, 4]], 
                                       values=[25, 50, 100], 
                                       dense_shape=[5, 5])

# 我们可以把稀疏张量转换成密集张量
print(tf.sparse.to_dense(sparse_tensor))
Output:
tf.Tensor( [[ 25   0   0   0   0]
            [  0   0   0   0   0]
            [  0   0  50   0   0]
            [  0   0   0   0   0]
            [  0   0   0   0 100]], shape=(5, 5), dtype=int32)

конец

Мы успешно рассмотрели основы тензорных объектов TensorFlow.

Это должно придать вам большую уверенность, потому что теперь вы знаете больше об основах фреймворка TensorFlow.

Ознакомьтесь с частью 1 этой серии руководств:link.medium.com/yJp16uPoqab

Оригинальная ссылка:к data science.com/mastering - он…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/