Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

112    Глава 3. Введение в Keras и TensorFlow

Рис. 3.5. Выбор среды выполнения GPU в Colab

Обратите.внимание,.что.в.раскрывающемся.списке.Hardware Accelerator .(Аппаратный.ускоритель).присутствует.также.пункт.TPU..В.отличие.от.среды.выполнения. GPU,.для.использования.TPU.в.TensorFlow.и.Keras.вам.потребуется.выполнить. в.своем.коде.небольшую.ручную.настройку..Я.расскажу.об.этом.в.главе.13,.а.до. тех.пор.для.примеров.данной.книги.советую.брать.среду.выполнения.GPU.

Теперь,.организовав.окружение.для.запуска.кода.Keras,.посмотрим,.как.основные.идеи,.с.которыми.мы.познакомились.в.главе.2,.переводятся.на.язык.Keras. и.TensorFlow.

3.5. ПЕРВЫЕ ШАГИ С TENSORFLOW

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

.во-первых,.тензоры.и.низкоуровневые.операции.с.ними.—.основа.всего.со- временного.машинного.обучения..В.TensorFlow.это:

. тензоры,.в.том.числе.специальные,.хранящие.состояние.сети.(переменные);

. тензорные операции,.такие.как.сложение,.relu,.matmul;

3.5. Первые шаги с TensorFlow    113

. обратное распространение.—.механизм.вычисления.градиента.матема- тических.выражений.(в.TensorFlow.этот.механизм.предоставляет.объект.

GradientTape);

.во-вторых,.высокоуровневые.идеи.глубокого.обучения..В.Keras.это:

. слои,.которые.объединяются.в.модель;

. функция потерь,.которая.определяет.сигнал.обратной.связи,.используемый.для.обучения;

. оптимизатор,.определяющий.порядок.продвижения.обучения;

. метрики.для.оценки.качества.модели.(такие.как.точность);

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

В.предыдущей .главе .вы .уже .познакомились .с .некоторыми .компонентами .TensorFlow .и .Keras: .с .классом .Variable, .операцией .matmul .и .объектом. GradientTape .из.TensorFlow;.вы.создали.экземпляры.слоев.Dense .в.Keras,.упаковали.их.в.модель.Sequential .и.обучили.эту.модель.с.помощью.метода.fit().

Теперь.более.подробно.рассмотрим.реализацию.всех.этих.идей.на.практике. с.помощью.TensorFlow.и.Keras.

3.5.1. Тензоры-константы и тензоры-переменные

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

Листинг 3.1. Тензоры с единицами и с нулями во всех элементах

>>> import tensorflow as tf

 

 

>>> x = tf.ones(shape=(2, 1))

 

 

Эквивалентно вызову

 

 

>>> print(x)

 

 

np.ones(shape=(2, 1))

tf.Tensor(

 

 

 

[[1.]

 

 

 

[1.]], shape=(2, 1), dtype=float32)

 

 

>>> x = tf.zeros(shape=(2, 1))

 

 

Эквивалентно вызову

 

 

>>> print(x)

 

 

np.zeros(shape=(2, 1))

tf.Tensor(

 

 

 

[[0.]

 

 

 

[0.]], shape=(2, 1), dtype=float32)

 

 

114    Глава 3. Введение в Keras и TensorFlow

Листинг 3.2. Тензоры со случайными значениями в элементах

>>> x = tf.random.normal(shape=(3, 1), mean=0., stddev=1.)

>>> print(x)

Для создания тензора со случайными значениями используется нормальное

tf.Tensor(

[[-0.14208166]

распределение со средним отклонением 0 и стандартным отклонением 1.

Эквивалентно вызову np.random.normal(size=(3, 1), loc=0., scale=1.)

[-0.95319825]

 

[ 1.1096532 ]], shape=(3, 1), dtype=float32)

>>> x = tf.random.uniform(shape=(3, 1), minval=0., maxval=1.)

 

 

>>> print(x)

Для создания тензора со случайными значениями используется

tf.Tensor(

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

[[0.33779848]

вызову np.random.uniform(size=(3, 1), low=0., high=1.)

[0.06692922]

 

 

[0.7749394 ]], 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..Вы.уже. видели.его.в.реализации.цикла.обучения.в.конце.главы.2.

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

Листинг 3.5. Создание переменной TensorFlow

>>>v = tf.Variable(initial_value=tf.random.normal(shape=(3, 1)))

>>>print(v)

array([[-0.75133973], [-0.4872893 ],

[ 1.6626885 ]], dtype=float32)>

3.5. Первые шаги с TensorFlow    115

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

Листинг 3.6. Присваивание нового значения переменной TensorFlow

>>> v.assign(tf.ones((3, 1))) array([[1.],

[1.],

[1.]], dtype=float32)>

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

Листинг 3.7. Присваивание новых значений подмножеству элементов переменной TensorFlow

>>> v[0, 0].assign(3.) array([[3.],

[1.],

[1.]], dtype=float32)>

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

Листинг 3.8. Пример использования assign_add()

>>> v.assign_add(tf.ones((3, 1))) array([[2.],

[2.],

[2.]], dtype=float32)>

3.5.2. Операции с тензорами: математические действия в TensorFlow

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

Листинг 3.9. Некоторые простые математические операции

a = tf.ones((2, 2))

 

Возведение в квадрат

 

b = tf.square(a)

 

 

 

Квадратный корень

 

 

 

c = tf.sqrt(a)

 

 

 

 

d = b + c

 

 

Сложение двух тензоров (поэлементное)

 

 

e = tf.matmul(a, b)

 

 

Произведение двух тензоров

 

 

e *= d

 

 

 

 

 

 

 

 

 

 

 

 

(как обсуждалось в главе 2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Умножение двух тензоров

 

 

 

 

 

(поэлементное)