AI с Python - глубокое обучение

Искусственная нейронная сеть (ANN) - это эффективная вычислительная система, центральная тема которой заимствована из аналогии биологических нейронных сетей. Нейронные сети являются одним из типов моделей для машинного обучения. В середине 1980-х и начале 1990-х годов в нейронных сетях был сделан значительный архитектурный прогресс. В этой главе вы узнаете больше о Deep Learning, подходе AI.

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

Машинное обучение v / s Deep Learning

Глубокое обучение - самая мощная техника машинного обучения в наши дни. Это настолько мощно, потому что они учатся наилучшему способу представления проблемы при обучении, как решить проблему. Сравнение глубокого обучения и машинного обучения приведено ниже -

Зависимость данных

Первая разница основана на производительности DL и ML при увеличении масштаба данных. Когда данные большие, алгоритмы глубокого обучения работают очень хорошо.

Зависимость от машины

Алгоритмы глубокого обучения нуждаются в машинах высокого класса, чтобы работать идеально. С другой стороны, алгоритмы машинного обучения могут работать и на младших машинах.

Функция извлечения

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

Время исполнения

Время выполнения зависит от многочисленных параметров, используемых в алгоритме. Глубокое обучение имеет больше параметров, чем алгоритмы машинного обучения. Следовательно, время выполнения алгоритмов DL, особенно время обучения, намного больше, чем алгоритмы ML. Но время тестирования алгоритмов DL меньше, чем алгоритмов ML.

Подход к решению проблем

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

Сверточная нейронная сеть (CNN)

Сверточные нейронные сети такие же, как обычные нейронные сети, потому что они также состоят из нейронов, которые имеют изучаемые веса и смещения. Обычные нейронные сети игнорируют структуру входных данных, и все данные преобразуются в 1-D массив перед подачей его в сеть. Этот процесс подходит для обычных данных, однако, если данные содержат изображения, процесс может быть громоздким.

CNN решает эту проблему легко. При их обработке учитывается 2D-структура изображений, что позволяет им извлекать свойства, характерные для изображений. Таким образом, главная цель CNN - перейти от необработанных данных изображения во входном слое к правильному классу в выходном слое. Единственная разница между обычными NN и CNN заключается в обработке входных данных и в типе слоев.

Обзор архитектуры CNN

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

Архитектура CNNs имеет нейроны, расположенные в 3 измерениях, называемых шириной, высотой и глубиной. Каждый нейрон в текущем слое связан с небольшим участком выхода предыдущего слоя. Это похоже на наложение фильтра 𝑵 × 𝑵 на входное изображение. Он использует М- фильтры, чтобы быть уверенным в получении всех деталей. Эти М- фильтры являются экстракторами объектов, которые извлекают такие элементы, как края, углы и т. Д.

Слои, используемые для построения CNN

Следующие слои используются для построения CNN -

  • Входной слой - принимает исходные данные изображения как есть.

  • Сверточный слой - этот слой является основным строительным блоком CNN, который выполняет большинство вычислений. Этот слой вычисляет свертки между нейронами и различными участками на входе.

  • Recified Linear Unit Layer - Применяет функцию активации к выходу предыдущего слоя. Он добавляет нелинейность в сеть, так что он может хорошо обобщать функции любого типа.

  • Уровень объединения - Объединение помогает нам сохранять только важные части по мере продвижения в сети. Слой пула работает независимо на каждом срезе глубины ввода и изменяет его размер в пространстве. Он использует функцию MAX.

  • Fully Connected layer / Output layer - этот слой вычисляет выходные баллы в последнем слое. Полученный результат имеет размер 𝟏 × 𝟏 × 𝑳 , где L - количество классов обучающих наборов данных.

Установка полезных пакетов Python

Вы можете использовать Keras , который представляет собой высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow, CNTK или Theno. Он совместим с Python 2.7-3.6. Вы можете узнать больше об этом из https://keras.io/ .

Используйте следующие команды для установки keras -

pip install keras

В среде conda вы можете использовать следующую команду -

conda install –c conda-forge keras

Построение линейного регрессора с использованием ANN

В этом разделе вы узнаете, как построить линейный регрессор, используя искусственные нейронные сети. Вы можете использовать Keras Regressor для достижения этой цели. В этом примере мы используем набор цен на жилье в Бостоне с 13 числами для свойств в Бостоне. Код Python для того же показан здесь -

Импортируйте все необходимые пакеты, как показано на рисунке -

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import Keras Regressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold

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

dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values

Теперь разделите данные на входные и выходные переменные, т. Е. X и Y -

X = dataset[:,0:13]
Y = dataset[:,13]

Поскольку мы используем базовые нейронные сети, определите модель -

def baseline_model():

Теперь создайте модель следующим образом -

model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal', 
   activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))

Далее скомпилируйте модель -

model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor

Теперь исправьте случайное начальное число для воспроизводимости следующим образом:

seed = 7
numpy.random.seed(seed)

Объект-обертка Keras для использования в scikit-learn в качестве оценки регрессии называется Keras Regressor . В этом разделе мы оценим эту модель со стандартизированным набором данных.

estimator = Keras Regressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))

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

Классификатор изображений: приложение глубокого обучения

Сверточные нейронные сети (CNN) решают проблему классификации изображений, то есть к какому классу относится входное изображение. Вы можете использовать библиотеку глубокого обучения Keras. Обратите внимание, что мы используем набор данных для обучения и тестирования изображений кошек и собак по следующей ссылке https://www.kaggle.com/c/dogs-vs-cats/data .

Импортируйте важные библиотеки и пакеты keras, как показано на рисунке -

Следующий пакет, называемый последовательным, инициализирует нейронные сети как последовательную сеть.

from keras.models import Sequential

Следующий пакет, называемый Conv2D , используется для выполнения операции свертки, первого шага CNN.

from keras.layers import Conv2D

Следующий пакет, названный MaxPoling2D , используется для выполнения операции объединения, второго шага CNN.

from keras.layers import MaxPooling2D

Следующий пакет под названием Flatten представляет собой процесс преобразования всех результирующих двумерных массивов в один длинный непрерывный линейный вектор.

from keras.layers import Flatten

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

from keras.layers import Dense

Теперь создайте объект последовательного класса.

S_classifier = Sequential()

Теперь следующим шагом является кодирование части свертки.

S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

Здесь relu - функция выпрямителя.

Теперь, следующий шаг CNN - операция объединения на картах результирующих признаков после свертки.

S-classifier.add(MaxPooling2D(pool_size = (2, 2)))

Теперь преобразуйте все объединенные изображения в непрерывный вектор, используя лестно

S_classifier.add(Flatten())

Далее создайте полностью связанный слой.

S_classifier.add(Dense(units = 128, activation = 'relu'))

Здесь 128 - количество скрытых юнитов. Обычная практика - определять количество скрытых единиц как степень 2.

Теперь инициализируйте выходной слой следующим образом:

S_classifier.add(Dense(units = 1, activation = 'sigmoid'))

Теперь, скомпилируйте CNN, мы построили -

S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

Здесь параметр оптимизатора - это выбор алгоритма стохастического градиентного спуска, параметр потерь - выбор функции потерь, а параметр метрики - выбор метрики производительности.

Теперь выполните аугментации изображений, а затем подгоните изображения к нейронным сетям -

train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = 
   train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size = 
      (64, 64),batch_size = 32,class_mode = 'binary')

test_set = 
   test_datagen.flow_from_directory('test_set',target_size = 
      (64, 64),batch_size = 32,class_mode = 'binary')

Теперь подгоните данные к модели, которую мы создали -

classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 
25,validation_data = test_set,validation_steps = 2000)

Здесь steps_per_epoch имеет количество тренировочных образов.

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

from keras.preprocessing import image

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', 
target_size = (64, 64))

test_image = image.img_to_array(test_image)

test_image = np.expand_dims(test_image, axis = 0)

result = classifier.predict(test_image)

training_set.class_indices

if result[0][0] == 1:
prediction = 'dog'

else:
   prediction = 'cat'