Tensorflow туториал. часть 2: установка и начальная настройка
Содержание:
软件包位置
部分安装方式需要您提供 TensorFlow Python 软件包的网址。您需要根据 Python 版本指定网址。
版本 | 网址 |
---|---|
Linux | |
Python 2.7(支持 GPU) | https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp27-cp27mu-manylinux2010_x86_64.whl |
Python 2.7(仅支持 CPU) | https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp27-cp27mu-manylinux2010_x86_64.whl |
Python 3.5(支持 GPU) | https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp35-cp35m-manylinux2010_x86_64.whl |
Python 3.5(仅支持 CPU) | https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp35-cp35m-manylinux2010_x86_64.whl |
Python 3.6(支持 GPU) | https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl |
Python 3.6(仅支持 CPU) | https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp36-cp36m-manylinux2010_x86_64.whl |
Python 3.7(支持 GPU) | https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-2.1.0-cp37-cp37m-manylinux2010_x86_64.whl |
Python 3.7(仅支持 CPU) | https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.1.0-cp37-cp37m-manylinux2010_x86_64.whl |
macOS(仅支持 CPU) | |
Python 2.7 | https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp27-cp27m-macosx_10_9_x86_64.whl |
Python 3.5 | https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp35-cp35m-macosx_10_6_intel.whl |
Python 3.6 | https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp36-cp36m-macosx_10_9_x86_64.whl |
Python 3.7 | https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl |
Windows | |
Python 3.5(支持 GPU) | https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-2.1.0-cp35-cp35m-win_amd64.whl |
Python 3.5(仅支持 CPU) | https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.1.0-cp35-cp35m-win_amd64.whl |
Python 3.6(支持 GPU) | https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-2.1.0-cp36-cp36m-win_amd64.whl |
Python 3.6(仅支持 CPU) | https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.1.0-cp36-cp36m-win_amd64.whl |
Python 3.7(支持 GPU) | https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-2.1.0-cp37-cp37m-win_amd64.whl |
Python 3.7(仅支持 CPU) | https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.1.0-cp37-cp37m-win_amd64.whl |
Raspberry PI(仅支持 CPU) | |
Python 3、Pi0 或 Pi1 | https://storage.googleapis.com/tensorflow/raspberrypi/tensorflow-2.1.0-cp35-none-linux_armv6l.whl |
Python 3、Pi2 或 Pi3 | https://storage.googleapis.com/tensorflow/raspberrypi/tensorflow-2.1.0-cp35-none-linux_armv7l.whl |
Размеры
Размеры тензора это количество элементов в каждом измерении.
TensorFlow автоматически выводит размеры по ходу построения графа. Эти выведенные
размеры могут иметь известный или неизвестный ранг. Если ранг известен, размеры тензора
по каждому измерению могут быть известны или неизвестны.
Документация TensorFlow использует три условных обозначения для описания
размерности тензора: ранг, размеры и количество измерений. Следующая таблица
показывает как они соотносятся друг с другом:
Ранг | Размеры | Количество измерений | Пример |
---|---|---|---|
[] | 0-D | 0-D тензор. Скаляр. | |
1 | 1-D | 1-D тензор размера . | |
2 | 2-D | 2-D тензор размера . | |
3 | 3-D | 3-D тензор размера . | |
n | n-D | Тензор размера . |
Размеры могут быть представлены в виде списков Python/кортежей целых чисел, или с
.
Получение размера объекта
Есть два способа получить размеры . При построении
графа часто полезно спросить, что уже известно о размерах тензора.
Это можно сделать, прочитав свойство объекта .
Этот метод возвращает объект , который является удобным способом
представления частично определенных размеров (поскольку при построении графа
не все размеры могут быть полностью известны).
Также можно получить который представляет полностью определенные
размеры другого во время выполнения. Это делается вызовом
операции . Этим способом вы можете построить граф, который
манипулирует размерами тензоров строя другие тензоры зависящие от
динамических размеров входных .
Например, так можно сделать вектор нулей того же размера,
что и число столбцов данной матрицы:
Изменение размеров
Количество элементов тензора это произведение всех его
измерений. Количество элементов скаляра всегда равно . Так как много
разных размеров могут давать одно и то же число элементов
часто удобно менять размеры , не изменяя его
элементы. Это может быть сделано с помощью .
Следующие примеры показывают как изменить размеры тензора:
Постройте модель
Нейронная сеть создается послойно — это требует три основных архитектурных решения:
- Как представить текст?
- Сколько слоев использовать в модели?
- Сколько скрытых нейронов использовать в каждом слое?
В этом примере, входные данные состоят из предложений. Метки которые нужно предсказать являются 0 либо 1.
Одним из способов представления текста является преобразование предложений в векторные представления слов. Мы можем использовать предварительно обученное векторное представление текста в качестве первого слоя. Это имеет три преимущества:
- нам не нужно беспокоиться о препроцессинге текста,
- мы можем извлечь выгоду из переноса обучения,
- векторное представление фиксированного размера, поэтому его проще обрабатывать.
Для этого примера мы используем предобученную модель векторного представления текста из TensorFlow Hub называемую google/tf2-preview/gnews-swivel-20dim/1.
Есть еще три другие предварительно обученных модели подходящие для этого руководства:
- google/tf2-preview/gnews-swivel-20dim-with-oov/1 — аналогичная google/tf2-preview/gnews-swivel-20dim/1, но с 2.5% словаря конвертированного в OOV buckets. Это может помочь, если словарь задачи и словарь модели не полностью совпадают.
- google/tf2-preview/nnlm-en-dim50/1 — Намного большая модель с размером словаря ~1M и размерностью вложения 50.
- google/tf2-preview/nnlm-en-dim128/1 — Еще большая модель с размером словаря ~1M и размерностью вложения 128.
Давайте сначала создадим слой Keras, который использует модель TensorFlow Hub для векторного представления предложений, и опробуем его на нескольких входных примерах
Обратите внимание, что независимо от длины входного текста, размерность векторного представления будет следующей:
<tf.Tensor: id=402, shape=(3, 20), dtype=float32, numpy= array(, , ], dtype=float32)>
Давайте построим полную модель:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= keras_layer (KerasLayer) (None, 20) 400020 _________________________________________________________________ dense (Dense) (None, 16) 336 _________________________________________________________________ dense_1 (Dense) (None, 1) 17 ================================================================= Total params: 400,373 Trainable params: 400,373 Non-trainable params: 0 _________________________________________________________________
Для построения классификатора зададим слои последовательно:
- Первый слой это слой TensorFlow Hub. Этот слой использует предобученную Saved Model, отображающую предложения в векторные представления. Предобученная модель векторного представления слов которую мы используем (google/tf2-preview/gnews-swivel-20dim/1) разбивает предложение на токены, встраивает каждый токен и затем объединяет вложения. В результате получаются размерности: .
- Получившийся в результате вектор фиксированной длины пропускается сквозь полносвязный () слой состоящий из 16 скрытых нейронов.
- Последний слой плотно связан с единственным выходным нейроном. С использованием функции активации , значение получается между 0 и 1, представляя вероятность или уровень доверия.
Давайте скомпилируем модель.
Функция потерь и оптимизатор
Для модели нам необходимо указать функцию потерь и оптимизатор для обучения. Поскольку мы решаем задачу бинарной классификации и на выходе модели будут вероятности (слой из единственного элемента с сигмоидой в качестве функции активации), то мы воспользуемся функцией потерь binary_crossentropy (пер. «Перекрестная энтропия»).
Это не единственный выбор для функции потерь: Вы можете, например, выбрать . Но обычно лучше справляется с вероятностями — она измеряет «дистанцию» между распределениями вероятностей, или, как в нашем случае, между истинным распределением и предсказаниями.
Далее, когда мы исследуем задачи регрессии (например, предсказание цен на недвижимость), мы посмотрим как использовать другую функцию потерь, которая называется среднеквадратическая ошибка (MSE).
А сейчас настроим модель с использованием оптимизатора и функции потерь:
Tested build configurations
CPU
Version | Python version | Compiler | Build tools |
---|---|---|---|
tensorflow-2.3.0 | 3.5-3.8 | MSVC 2019 | Bazel 3.1.0 |
tensorflow-2.2.0 | 3.5-3.8 | MSVC 2019 | Bazel 2.0.0 |
tensorflow-2.1.0 | 3.5-3.7 | MSVC 2019 | Bazel 0.27.1-0.29.1 |
tensorflow-2.0.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.26.1 |
tensorflow-1.15.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.26.1 |
tensorflow-1.14.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.24.1-0.25.2 |
tensorflow-1.13.0 | 3.5-3.7 | MSVC 2015 update 3 | Bazel 0.19.0-0.21.0 |
tensorflow-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 |
tensorflow-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 |
tensorflow-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
GPU
Version | Python version | Compiler | Build tools | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-2.3.0 | 3.5-3.8 | MSVC 2019 | Bazel 3.1.0 | 7.4 | 10.1 |
tensorflow_gpu-2.2.0 | 3.5-3.8 | MSVC 2019 | Bazel 2.0.0 | 7.4 | 10.1 |
tensorflow_gpu-2.1.0 | 3.5-3.7 | MSVC 2019 | Bazel 0.27.1-0.29.1 | 7.4 | 10.1 |
tensorflow_gpu-2.0.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.26.1 | 7.4 | 10 |
tensorflow_gpu-1.15.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.26.1 | 7.4 | 10 |
tensorflow_gpu-1.14.0 | 3.5-3.7 | MSVC 2017 | Bazel 0.24.1-0.25.2 | 7.4 | 10 |
tensorflow_gpu-1.13.0 | 3.5-3.7 | MSVC 2015 update 3 | Bazel 0.19.0-0.21.0 | 7.4 | 10 |
tensorflow_gpu-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tf.Example
Типы данных для
Фундаментально это соответствие .
Вид сообщений допускает один из следующих трех типов (См. файл для справки). Большинство других общих типов может быть сведено к одному из этих трех:
-
(можно привести следующие типы)
-
(можно привести следующие типы)
- ()
- ()
-
(можно привести следующие типы)
Чтобы преобразовать стандартный тип TensorFlow в -совместимый, вы можете использовать приведенные ниже функции
Обратите внимание, что каждая функция принимает на вход скалярное значение и возвращает содержащий один из трех вышеприведенных типов:. Замечание: Для простоты этот пример использует только скалярные входные данные
Простейший способ обработки нескалярных признаков — использование для конвертации тензоров в двоичнеые строки. Стоки являются скалярами в тензорфлоу. Используйте для обратной конвертации двоичных сток в тензор
Замечание: Для простоты этот пример использует только скалярные входные данные. Простейший способ обработки нескалярных признаков — использование для конвертации тензоров в двоичнеые строки. Стоки являются скалярами в тензорфлоу. Используйте для обратной конвертации двоичных сток в тензор.
Ниже приведены несколько примеров того как работают эти функции
Обратите внимание на различные типы ввода и стандартизированные типы вывода. Если входной тип функции не совпадает с одним из приводимых типов указанных выше, функция вызовет исключение (например выдаст ошибку поскольку это значение с плавающей точкой и должно быть использовано с функцией ):
bytes_list { value: "test_string" } bytes_list { value: "test_bytes" } float_list { value: 2.7182817459106445 } int64_list { value: 1 } int64_list { value: 1 }
Все proto сообщения могут быть сериализованы в двоичную строку с использованием метода :
b'\x12\x06\n\x04T\xf8-@'
Создание сообщения
Допустим вы хотите создать сообщение из существующих данных. На практике данные могут прийти откуда угодно, но процедура создания сообщения из одного наблюдения будет той же:
-
В рамках каждого наблюдения каждое значение должно быть преобразовано в содержащее одно из 3 совместимых типов, с использованием одной из вышеприведенных функций.
-
Вы создаете отображение (словарь) из строки названий признаков в закодированное значение признака выполненное на шаге #1.
-
Отображение (map) созданное на шаге 2 конвертируется в .
В этом уроке вы создадите датасет с использованием NumPy.
У этого датасета будет 4 признака:
- булев признак, или с равной вероятностью
- целочисленный признак — равномерно случайно выбранный из
- строковый признак сгенерированный из табицы строк с использованием целочисленного признака в качестве индекса
- признак с плавающей точкой из стандартного нормального распределения
Рассмотрим выборку состающую из 10 000 независимых, одинаково распределенных наблюдений из каждого вышеприведенного распределения:
Каждый из этих признаков может быть приведен к -совместимому типу с использованием одного из , , . Вы можете затем создать -сообщение из этих закодированных признаков:
Возьмем, например, одно наблюдение из датасета, . Вы можете создать и распечатать -сообщение для этого наблюдения с использованием . Каждое наблюдение может быть записано в виде -сообщения как указано выше. Note that the — это всего лишь обертка вокруг -сообщения:
b'\nR\n\x11\n\x08feature0\x12\x05\x1a\x03\n\x01\x00\n\x11\n\x08feature1\x12\x05\x1a\x03\n\x01\x04\n\x14\n\x08feature2\x12\x08\n\x06\n\x04goat\n\x14\n\x08feature3\x12\x08\x12\x06\n\x04[\xd3|?'
Для декодирования сообщения используйте метод .
features { feature { key: "feature0" value { int64_list { value: 0 } } } feature { key: "feature1" value { int64_list { value: 4 } } } feature { key: "feature2" value { bytes_list { value: "goat" } } } feature { key: "feature3" value { float_list { value: 0.9876000285148621 } } } }
Модули совместимости
Некоторые символы API не могут быть обновлены просто с использованием замены строк. Чтобы гарантировать поддержку вашего кода в TensorFlow 2.0, скрипт обновления включает в себя модуль . Этот модуль заменяет символы TF 1.x, такие как , на эквивалентную ссылку. Хотя модуль совместимости хорош, мы рекомендуем вам вручную вычитать замены и перенести их на новые API в пространстве имен вместо пространства имен как можно быстрее.
Из-за депрекации модулей TensorFlow 2.x (например, и) некоторые изменения не могут быть обойдены путем переключения на . Обновление этого кода может потребовать использования дополнительной библиотеки (например, ) или переключения на пакет в tenorflow / addons.