Шаг 75.
Глубокое обучение на Python. Введение в Keras и TensorFlow. Первые шаги с TensorFlow. Тензоры-константы и тензоры-переменные

    На этом шаге мы рассмотрим особенности использования этих тензоров.

    В любых операциях, выполняемых с помощью TensorFlow, участвуют тензоры. Тензоры создаются с некоторыми начальными значениями. Например, можно создать тензор с единицами во всех элементах, с нулями (пример 3.1) или со случайными значениями (пример 3.2).


Пример 3.1. Тензоры с единицами и с нулями во всех элементах
import tensorflow as tf

# Эквивалентно вызову np.ones(shape=(2, 1))
x = tf.ones(shape=(2, 1))
print(x)
tf.Tensor(
[[1.]
 [1.]], shape=(2, 1), dtype=float32)

# Эквивалентно вызову np.zeros(shape=(2, 1))
x = tf.zeros(shape=(2, 1))
print(x)
tf.Tensor(
[[0.]
 [0.]], shape=(2, 1), dtype=float32)


Пример 3.2. Тензоры со случайными значениями в элементах
# Для создания тензора со случайными значениями используется 
# нормальное распределение со средним отклонением 0 и 
# стандартным отклонением 1. Эквивалентно вызову 
# np.random.normal(size=(3, 1), loc=0., scale=1.)
x = tf.random.normal(shape=(3, 1), mean=0., stddev=1.)
print(x)
tf.Tensor(
[[ 0.8433557 ]
 [-1.8125836 ]
 [ 0.69369423]], shape=(3, 1), dtype=float32)

# Для создания тензора со случайными значениями 
# используется равномерное распределение между 0 и 1. 
# Эквивалентно вызову 
# np.random.uniform(size=(3, 1), low=0., high=1.)
x = tf.random.uniform(shape=(3, 1), minval=0., maxval=1.)
print(x)
tf.Tensor(
[[0.56918085]
 [0.5042844 ]
 [0.6338109 ]], shape=(3, 1), dtype=float32)

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


Пример 3.3. Массивы NumPy можно изменять
import numpy as np
x = np.ones(shape=(2, 2))
x[0, 0] = 0.

    Если попробовать сделать то же самое с тензором TensorFlow, библиотека сообщит об ошибке:

  EagerTensor object does not support item assignment 
  (Объект EagerTensor не поддерживает присваивание значений элементам).

Пример 3.4. Тензоры TensorFlow не могут изменяться
# Эта операция потерпит неудачу, 
# потому что тензоры не могут изменяться
x = tf.ones(shape=(2, 2))
x[0, 0] = 0.

    Как вы знаете, чтобы обучить модель, нужно в цикле обновлять ее состояние, представленное набором тензоров. Но если тензоры нельзя изменять, как же тогда происходит обучение? В таком случае используются переменные. Для управления изменяемым состоянием в TensorFlow применяется класс tf.Variable. Вы уже видели его в реализации цикла обучения.

    Чтобы создать такую переменную, нужно указать какое-то начальное значение, например случайный тензор


Пример 3.5. Создание переменной TensorFlow
v = tf.Variable(initial_value=tf.random.normal(shape=(3, 1)))
print(v)
<tf.Variable 'Variable:0' shape=(3, 1) dtype=float32, numpy=
array([[-0.5215308 ],
       [-0.43471026],
       [ 0.85999465]], dtype=float32)>

    Состояние переменной можно менять с помощью ее метода assign(), как показано ниже.


Пример 3.6. Присваивание нового значения переменной TensorFlow
v.assign(tf.ones((3, 1)))
print(v)
<tf.Variable 'Variable:0' shape=(3, 1) dtype=float32, numpy=
array([[1.],
       [1.],
       [1.]], dtype=float32)>

    Этот метод применим также к подмножеству элементов.


Пример 3.7. Присваивание новых значений подмножеству элементов переменной TensorFlow
print(v[0, 0].assign(3.))
<tf.Variable 'UnreadVariable' shape=(3, 1) dtype=float32, numpy=
array([[3.],
       [1.],
       [1.]], dtype=float32)>

    Аналогично для выполнения операций += и -= предлагаются методы assign_add() и assign_sub().


Пример 3.8. Пример использования assign_add()
print(v.assign_add(tf.ones((3, 1))))
<tf.Variable 'UnreadVariable' shape=(3, 1) dtype=float32, numpy=
array([[4.],
       [2.],
       [2.]], dtype=float32)>

Блокнот с приведенными на этом шаге примерами можно взять здесь.

    На следующем шаге мы рассмотрим операции с тензорами.




Предыдущий шаг Содержание Следующий шаг