Что такое Tensorflow и с чем его едят?

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


В прошлой статье мы разобрались с обучением нейросети и частью того, как она работает. А в этой статье, мы разберём на коде, что такое TensorFlow, как пишут нейросеть и из чего она состоит.

Tensorflow

Tensorflow — это открытая программная библиотека для машинного обучения, разработанная компанией Google для решения задач построения и тренировки нейронной сети с целью автоматического нахождения и классификации образов, достигая качества человеческого восприятия. Применяется как для исследований, так и для разработки собственных продуктов Google. Основной API для работы с библиотекой реализован для Python, также существуют реализации для R, C Sharp, C++, Haskell, Java, Go и Swift.

В наших статьях мы будем использовать Python, так что давайте перейдём к установке tensorflow на python.

Tensorflow устанавливается также, как и обычная библиотека python через pip — pip install tensorflow. Но нужно следить за совместимости других библиотек с tensorflow, иначе они могут быть не совместимы и код может не работать. При наличии видеокарты, рекомендуем установить CUDA и cuDDN.

Процесс установки Tensorflow для видеокарты

Для начала смотрим, какая версия tensorflow подходит нам для pytohn, CUDA и cuDNN — *тык*
Представлено всего две операционных системы — Linux и macOS, но если вы обладатель Windows, как и мы, то смотрит по таблице Linux, GPU

Вот так выглядит нужная нам таблица

Для начала начнём именно с cuDNN, а не с CUDA и tensorflow. Переходим в cuDNN Archive( *тык*), заходим в аккаунт Nvidia и смотрим подходящие версии для tensorflow и CUDA (*тык*). На момент написания статьи, мне подходит tensorflow-2.4.0. Я могу взять и 2.7.0, но предпочитаю чуть старые версии. После того, как вы определились с версиями, скачивайте необходимые, дальше подводных камней нет и вы с лёгкостью справитесь, но рассмотрим как установить cuDNN.

После установки tensorflow и CUDA, идёт установка cuDNN. Вы скачиваете архив, распаковывайте и скопировать с возможной заменной файлы по пути к CUDA. Обычный путь установки: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/*ваша версия CUDA*

Поздравляю, вы установили все необходимые компоненты для tensorflow и его самого.
Что же дальше? А дальше, выбираем среду для выполнения кода.

Рекомендую использовать среду Anaconda — дистрибутив Python и R для научных вычислений, который призван упростить управление пакетами и их развертывание. В состав дистрибутива входят пакеты обработки данных, подходящие для Windows, Linux и macOS. Он разработан и поддерживается компанией Anaconda, Inc., основанной Питером Ваном и Трэвисом Олифантом в 2012 году. Нужная нам среда бесплатная, но есть и не бесплатные версии.

В процессе установки анаконды нет ничего сложного, как обычная установка, но после установки нужно будет проверить версию python в этой среде и установить tensorflow и нужные ему компоненты (рассмотрели это вверху). В анаконде нам нужен jupyter notebook, который также бесплатный и который, как не странно, нужно установить.

Плюсы jupyter notebook в том, что мы можем запускать не весь код, а по отдельности, по частям и тем самым перезапускать не весь код при ошибке, а только часть. Это очень хорошая особенность, помогающая Data Science разработчикам. Даже в Google Colab такая функция есть.

И всё, мы установили всё, что нужно и теперь можем перейти к коду. (Для новичков Python, Anaconda/Jupyter Notebook рекомендую посмотреть обучалки, чтобы понимать из чего, как и где работать).

Для начала импортируем нужные объекты из tensorflow и создадим однослойную нейросеть:

from tensorflow.keras.models import Sequential # Подключаем класс создания модели Squential
from tensorflow.keras.layers import Dense # Подключаем класс полносвязанного слоя
model = Sequential() # Создаём пустую модель нейронной сети
model.add(Dense(2, input_dim=2, use_bias=False)) # Добавляем скрытый полносвязанный слой с 2мя нейронами, на вход принимается 2 элемента и отключаем использование смещение нейронов
model.add(Dense(1, use_bias=False)) # Добавляем выходной полносвязанный слой с 1 нейроном и отключаем использование смещение нейронов

Раньше Data Science разработчики писали всё полностью с нуля, было очень много кода, а сейчас всего пару строчек для создания такой простой модели.

Теперь мы можем посмотреть, как она выглядят данные (характеристика) нейросети:

model.summary() # Отображаем данные созданной модели
Пример вывода model.summary()

Что же мы можем увидеть здесь?
Самое первое класс модели, не самое полезное для новичков.
Дальше мы можем увидеть какие слои у нас есть, их тип, их выходы и количество нейронов на каждом слое.
И самое последнее — итог. Сколько всего нейронов, контролируемых и неконтролируемых.

Давайте рассмотрим на коде, что такое веса.

weights = model.get_weights() # Получаем веса модели (до этого, были сгенерированы случайным образом)
print(weights) # Отображаем веса модели

При создании модели все веса генерируются случайным образом, то есть этакий набор для старта. С помощью кода выше нам выводиться массив со значениями весов. Мы можем поменять каждый вес нейрона по отдельности, так и вместе или вообще загрузить уже готовые. Посмотрим, как это реализовать.

import numpy as np # Подключаем библиотеку numpy
w1 = 0.42 # Задаём коэфицент w1 вручную
w2 = 0.15
w3 = -0.56
w4 = 0.83
w5 = 0.93
w6 = 0.02
new_weight = [np.array([[w1, w3], [w2, w4]]), np.array([[w5], [w6]])] # Создаём новый список весов
print(new_weight) # Отображаем новый список весов
model.set_weights(new_weight) # Устанавливаем новые весы модели

Видим новую для нас библиотеку numpy — библиотека с открытым исходным кодом, является быстрой, а в силу того, что поддерживает векторные операции с многомерными массивами — крайне удобная. Каждый вес имеет своё обозначение w1, w2, … wn. Переменную new_weight легко создать ориентируясь на model.summary(). Один слой — np.array([]). Внутренности определяем по количеству выводов, для одного — [wa, wb …, wn]. А веса идут по порядку, всё просто и нет ничего страшного.

Посмотрим как загрузить и выгрузить веса:

model.save_weights('model.h5') # Сохранение весов (чтобы не обучать заново)
model.load_weights('model.h5') # Загрузка весов (чтобы не обучать заново)

Всё просто и понятно, переходим дальше.

Делаем предсказание нейросети.

Да, мы её не обучили, но к обучению мы вернёмся через несколько статей. Предсказание получить легко, для начала придумаем входные значения от —? до +?. Затем преобразуем в формат для нейросети, добавляем размерность. А после делаем предсказание и выводим его. Код:

x1 = 7.2 # Установим входное значение для x1
x2 = -5.8 # Установим входное значение для x2
x_train = np.expand_dims(np.array([x1, x2]), 0) # Создаём по входным значениям набор данные для обучения нейросети
x_train.shape
k.shape # Выводим и видим, что ВСЕГДА нужно ставить в нулевой индекс ХОТЯ БЫ 1 пример
k = np.array([x1, x2]) # Если не поставить в нулевой индекс 1
print(y_linear)
y_linear = model.predict(x_train) # Обработка данных и предсказание

Мы получили предсказание, обработанное нейросетью по случайным или вашим весам. Попробуем вручную подсчитать вывод нейросети. Вывод = первый скрытый слой * wa + второй скрытый слой * wb (wa и wb последние нейроны, в нашем случае w5 и w6). Каждый скрытый слой = входное значение 1 * wa + входное значение 2 * wb. Для первого скрытого слоя веса w1 и w2, для второго w3 и w4. Код:

H1 = x1 * w1 + x2 * w2 # Получаем значение скрытого нейрона H1
H2 = x1 * w3 + x2 * w4 # Получаем значение скрытого нейрона H2
print(H1, H2, sep=' ') # Выводим значения скрытых нейронов
Y_linear = H1 * w5 + H2 * w6 # Получаем вывод сети
print(Y_linear) # Присутствует ошибка округления
print(f"Значение посчитанное вручную:", round(Y_linear, 6))
print(f"Значение предикта модели:", round(y_linear[0][0], 6))

Значения совпадают, значит подсчитано всё верно.

На этом моменте наша статья подошла к концу. Мы разобрали на коде, что такое TensorFlow, как пишут нейросеть и из чего она состоит. Надеюсь, что вам было интересно. В следующей статье рассмотрим функции активации и функции ошибок на коде.
Всем спасибо за внимание, всем добра!


Источник: m.vk.com

Комментарии: