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

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

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

Машинное обучение против глубокого обучения

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

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

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

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

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

Извлечение функций

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Input Layer - Необработанные данные изображения принимаются как есть.

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

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

  • Pooling 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

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

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

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

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
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 как оценка регрессии называется KerasRegressor. В этом разделе мы оценим эту модель со стандартизированным набором данных.

estimator = KerasRegressor(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 представляет собой процесс преобразования всех результирующих 2D-массивов в один длинный непрерывный линейный вектор.

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 - количество скрытых юнитов. Обычно количество скрытых единиц определяют как степень двойки.

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

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'