TensorFlow - первая неделя

В рамках моих личных заданий в Mercap я решил просмотреть руководства TensorFlow.

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

Этот пост представляет собой краткое изложение уроков, извлеченных в течение первой недели взаимодействия с учебными пособиями, API-интерфейсами и проектами, которые по счастливой случайности связаны с моими собственными.

Что такое TensorFlow?

Прежде чем объяснять, что я сделал, давайте поговорим об актуальности задачи.

TensorFlow - это стандарт машинного обучения. Он управляется Google, используется большинством технологических компаний и помог вдохнуть новую жизнь в разработку систем искусственного интеллекта.

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

TensorFlow - это, по сути, библиотека для управления тензорами. Тензор - это просто обобщение матрицы размером N. Одно число (скаляр) - это 0-мерный тензор. Массив / вектор - это одномерный тензор. Матрица чисел - это двумерный тензор. Матрица, значения которой сами являются векторами, представляет собой трехмерный тензор. И так далее.

Интерфейс по умолчанию

Сегодня TensorFlow обычно используется через Python. Большинство онлайн-руководств написано с использованием Python API.

Это означало, что лучший способ начать - это установить Python, а затем выполнить руководство по Keras.

Единственная проблема с шагами заключалась в том, что Учебник по базовой классификации требует matplotlib, но не указывает, что он должен быть установлен. Это легко сделать, выполнив: pip install matplotlib.

На Smalltalk

После успешного прохождения уроков Text, Regression и Over / Under Fit я был готов выпрыгнуть из среды Python и перейти к Smalltalk.

Первоначальная идея заключалась в том, что на этом этапе обучения я перейду к Pharo и научусь вызывать аналогичные функции TensorFlow из Smalltalk, используя привязки PolyMath.

К моему удивлению, был еще один проект, который был намного ближе к моим целям: TensorFlow для VASmalltalk. Это проект, разработанный Херардо Рихарте при содействии Мариано Мартинеса Пека из Instantiations. Это, в свою очередь, является переносом / улучшением оригинальной работы Херардо в Cuis Smalltalk, выполненной в сотрудничестве с Хавьером Буррони. Для версии VAST Instantiations также обеспечили разработку вызовов FFI и добавили поддержку возврата структур по значению в FFI Framework и Virtual Machine.

Я использую VAST в качестве среды разработки в Mercap более 16 лет, поэтому это была прекрасная возможность изучить, как использовать TensorFlow и в конечном итоге подключить его к нашим продуктам.

Небольшая помощь от моих друзей

Я не смог бы выполнить следующие шаги и выполнить все тесты, которые я выполнил, без помощи marianopeck и gerasdf на канале # машинное обучение в Буэнос-Айресе. Smalltalk Slack .

Спасибо за время, потраченное на помощь в моих исследованиях, и за предоставленные знания.

Следуй по моим следам

Чтобы начать работу с TensorFlow в VAST, вам нужна последняя версия, которая позволяет подключаться к необходимым библиотекам (Dll).

Поскольку в последней версии (VA Smalltalk v9.2 ECAP 2 Pre-Release, Released 2019.06.19) было несколько неудачных тестов, я получил неизданный ECAP 3 для своих тестов. Имейте это в виду, если вы пытаетесь воспроизвести результаты упомянутого здесь исследования.

Я знал, что собираюсь работать на разных машинах, некоторые из которых являются виртуальными, поэтому я остановился на реализации библиотеки TensorFlow C ++ для ЦП. Изменение тестов, которые я в конечном итоге реализовал, для запуска на графическом процессоре, пока остается делом будущего.

Окна

Чтобы сделать библиотеку C ++ видимой изнутри VAST, я отредактировал файл конфигурации FULL_PATH_TO_VAST_DIRECTORY \ image64 \ abt.ini, нашел раздел [PlatformLibrary Name Mappings] и добавил строка TENSORFLOW_LIB=FULL_PATH_TO_DIRECTORY_WITH_DOWNLOADED_LIBRARY\tensorflow.dll.

Это относится как к Windows 7, так и к Windows 10. Впоследствии я также попробовал использовать версию для Linux, о которой вы можете прочитать в следующем разделе.

Важно: файл ini необходимо редактировать после первого использования VAST, иначе некоторые сценарии «первого запуска» перезапишут ваше изменение. Итак, запустите VAST, сохраните изображение, закройте, отредактируйте ini-файл, и все готово!

После получения последнего коммита Репозитория с обширным тензорным потоком я импортировал содержимое библиотеки в REPOSITORY_LOCATION \ envy \ TensorFlow.dat. Хотя я начал, когда это была версия 0.45, на момент написания эта версия была 0.51, и все тесты проходят.

Чтобы версия для Windows заработала, мне также потребовалось установить распространяемый компонент Visual C ++. Я выбрал, который сработал с первого раза, Распространяемый пакет Microsoft Visual C ++ для Visual Studio 2017.

После этих шагов и после того, как я импортировал версию 0.51 карты конфигурации TensorFlow, все ожидаемые тесты прошли успешно!

Linux

В ожидании карты конфигурации с прохождением тестов я также попробовал установить xubuntu для VAST.

Я скачал Библиотеку процессора TensorFlow Linux. Все содержимое было распаковано до /usr/local (библиотеки, похоже, не используют подкаталог, в то время как включаемые файлы используют). Я выполнил шаги установки Linux, выполнив sudo ldconfig и создав образец файла hello_tf.c, предложенный там. Я смог скомпилировать и запустить этот файл, как было предложено, что подтвердило, что установка работает.

Прежде чем я смог использовать VAST в Linux, необходимо было установить некоторые предварительные условия, что я и сделал, выполнив sudo apt-get install libxm4 xterm.

Как и в случае с Windows, необходимо отредактировать FULL_PATH_TO_VAST_DIRECTORY / image64 / abt.ini, в данном случае: TENSORFLOW_LIB=/usr/local/lib/tensorflow.so. Помните, что это изменение необходимо внести после хотя бы одного запуска VAST.

Теперь я был готов работать на любой из ОС с одинаковыми результатами.

Распознавание изображений

На момент написания этой статьи Mariano опубликовал 2 сообщения с примерами того, как распознавать изображения в VAST с помощью TensorFlow. Первый описывает мотивацию, установку и пример, как получить результат в текстовом виде. Второй загружает предварительно обученную нейронную сеть и показывает имена объектов на изображении, включая ограничивающие рамки, указывающие, где они расположены.

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

В публикации используется устаревший сценарий, поскольку атрибут imageSize для LabelImage должен быть экстентом, а не числом. Поскольку все используемые изображения являются квадратами, это просто означает, что x становится x@x.

Я получил все ожидаемые результаты из первого набора примеров.

Из второго поста мне удалось выполнить только первый скрипт. Следующие ниже, похоже, требуют загрузки дополнительных файлов, не представленных в репозитории с обширным тензорным потоком.

Делать все по-своему

В Mercap мы всегда стараемся встроить наши знания в код. Наша философия заключается в том, что как только мы что-то узнаем, мы пишем это, чтобы другие могли извлечь пользу из наших знаний, а мы сами могли помнить то, что мы узнали.

Идея заключалась в том, чтобы как можно больше воспроизвести официальные учебные пособия TensorFlow, попытаться изучить эквивалентные сценарии на Smalltalk и создать классы и сообщения, чтобы как можно проще было узнать об оболочке для других.

Поскольку Keras API в настоящее время недоступен в оболочке Smalltalk, я сосредоточился на Руководстве по исполнению с нетерпением, которое, казалось, обучает основам использования TensorFlow без интерфейса более высокого уровня.

Один из самых важных уроков этой недели взаимодействия с TensorFlow заключался в том, что Python API - это больше, чем просто TensorFlow. Он добавляет большую интеграцию с Python и NumPy и предлагает множество способов использования функций библиотеки. У меня этого не было. VAST взаимодействует через библиотеку, которая использует эти базовые подпрограммы TensorFlow C ++, точно так же, как это делает Python. Таким образом, мы на один уровень ближе к истинной реализации TensorFlow, но это означает, что нам нужно будет предоставить наши собственные абстракции и вспомогательные объекты и сообщения.

Еще больше усложняет ситуацию то, что документация для C ++ API не такая полная, как документация для Python, и мы даже обнаружили устаревшие версии, которые не указаны в списке, не говоря уже о том, что нет официальных примеров.

Некоторые предлагаемые инструменты

Если вы намерены выполнить эти шаги и использовать VAST или просто использовать VAST в целом, я настоятельно рекомендую установить 2 функции из доступных: ST: ENVY / QA, который позволяет форматировать исходный код, и ST: Refactoring Browser, который позволит вам находить ссылки на переменные экземпляра и класса из любого браузера в среде IDE.

Все является операцией в графике

Я начал читать первые примеры Python. Вы заметите, что там не упоминаются ни графики, ни слои, ни сети, ни что-либо подобное. Текущее взаимодействие с C ++ API, доступным из VAST, не включает функции для использования Eager Execution, поэтому для моего исследования в течение недели большинство операций приходилось выполнять в контексте графика; даже сумма двух чисел требуется с использованием концепции операций. 2 + 3 при использовании TensorFlow без нетерпеливого выполнения можно получить с помощью графика, который выводит операцию Add с двумя входами, которые, в свою очередь, являются выходами операций, возвращающих константу 2 и 3 соответственно. Кроме того, 2 и 3 должны быть объявлены как 0-мерные тензоры.

Чтобы лучше узнать, как использовать эти функции, и найти лучший способ создать компактный и простой способ взаимодействия с API, я создал среду TensorFlow (представленную в классе TensorFlowEnvironment), которую вы можете увидеть в среде ветвь проекта tenorflow-обширный . В этой ветке есть файл под названием REPOSITORY_LOCATION \ envy \ Environment.dat, который содержит карту конфигурации с кодом, сгенерированным в процессе обучения. Поскольку это было сделано с использованием разработки через тестирование, также существуют тесты для различных сообщений.

Чтобы упростить задачу, в Number, TFTensor, TFGraph были созданы расширения, которые сделали объекты более полиморфными и упростили их использование. Некоторые из них теперь интегрированы в основную ветку проекта.

Где искать ответы

Одной из самых разочаровывающих частей этого исследования до сих пор было отсутствие документации и примеров по C ++ API. Лучшим инструментом в нашем распоряжении является код Python на github, поскольку он, похоже, использует C ++ API внутри.

Чтобы дать вам представление, в Индивидуальном обучении: учебник по основам упоминается использование функции random_normal, которая, кажется, связана с функцией RandomNormal в C ++ API (чтобы найти этот поиск RandomNormal в вашем браузере в main страница C ++ API ). Но при вызове этой функции API ответил, что такого имени нет. Короче говоря, функция теперь называется RandomStandardNormal. Чтобы найти это, перейдите в Документацию Python для функции, нажмите кнопку Просмотреть исходный код на GitHub, которая приведет вас сюда. Оттуда вы увидите подозрительный звонок на ops.NotDifferentiable("RandomStandardNormal”). Вот и все. Еще раз спасибо gerasdf за то, что узнали об этом.

Текущее положение вещей

На момент написания этой статьи вы можете найти достаточно протокола для запуска некоторых примеров из руководств Основы активного выполнения, Автоматическая дифференциация и градиентная лента и Пользовательское обучение: основы.

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

Например, TensorFlowEnvironmentTest>>#testAddSquares показывает, что для вычисления тензора 2^2+3^2 мы пишем:

TensorFlowEnvironment new calculate: 
 [:calculator | (calculator square: 2) +
                (calculator square: 3)]

или также:

TensorFlowEnvironment new calculate: 
 [:calculator | (calculator constant: 2) squared +
                (calculator constant: 3) squared]

Безусловно, предстоит сделать больше улучшений, поскольку мы продолжаем изучать возможности TensorFlow и легкость, с которой теперь мы можем интегрировать его в наши разработки Smalltalk.