[Stove AI] Глубокое обучение 003 — Создание и обучение моделей глубокой нейронной сети
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Ранее мы объяснили модель однослойной нейронной сети и обнаружили, что она имеет простую структуру и с ней трудно решать некоторые практические и более сложные задачи, поэтому сейчас разработана модель глубокой нейронной сети.
Глубина глубокой нейронной сети в основном отражается в количестве скрытых слоев.Предыдущая однослойная нейронная сеть имеет только один скрытый слой, в то время как глубокая нейронная сеть использует >= 2 скрытых слоя. Его базовая структура такова:
На рисунке есть два скрытых слоя: коричневый круг (с 4 нейронами) и зеленый круг (с 2 нейронами), поэтому структура этой глубокой нейронной сети представляет собой структуру 3-4-2. Изображение из20 июля 2017 г. Академическая лекция профессора Чжу Синцюаня Точки зрения и итоговая лекция 2: Один нейрон / однослойная нейронная сеть.
Для некоторых очень сложных глубоких нейронных сетей количество скрытых слоев может быть сотнями или тысячами, например структура сети ResNet и т. д., а процесс обучения также является более сложным и трудоемким. Потом эти модели очень "глубокие".
Использование более глубокой нейронной сети может получить лучший эффект выражения, который можно интуитивно понять следующим образом: на каждом уровне сети характеристики входных объектов шаг за шагом абстрагируются; следующий уровень сети напрямую использует предыдущий уровень абстракции. далее объединяются линейно или нелинейно, чтобы получить результат шаг за шагом.
1. Создайте и обучите модель глубокой нейронной сети
1.1 Подготовьте набор данных
На этот раз я использовал некоторые данные, сгенерированные мной, и сгенерировал код следующим образом:
# 准备数据集
# 此处自己生成一些原始的数据点
dataset_X=np.linspace(-10,10,100)
dataset_y=2*np.square(dataset_X)+7 # 即label是feature的平方*2,偏置是7
dataset_y /=np.linalg.norm(dataset_y) # 归一化处理
dataset_X=dataset_X[:,np.newaxis]
Распределение данных этого набора данных:
1.2 Построить и обучить модель
Перейдите непосредственно к коду:
# 构建并训练模型
import neurolab as nl
x_min, x_max = dataset_X[:,0].min(), dataset_X[:,0].max()
multilayer_net = nl.net.newff([[x_min, x_max]], [10, 10, 1])
# 模型结构:隐含层有两层,每层有10个神经元,输出层一层。
multilayer_net.trainf = nl.train.train_gd # 设置训练算法为梯度下降
dataset_y=dataset_y[:,np.newaxis]
error = multilayer_net.train(dataset_X, dataset_y, epochs=800, show=100, goal=0.01)
------------------------------------- потерять-- ------------------------------
Epoch: 100; Error: 2.933891201182385; Epoch: 200; Error: 0.032819979078409965; Epoch: 300; Error: 0.040183833367277225; The goal of learning is reached
--------------------------------------------Заканчивать----- --------------------------------
Кажется, что хотя мы установили 800 циклов, когда цель 0,01 будет достигнута, она автоматически завершится. Вы можете нарисовать картинку, чтобы увидеть тенденцию ошибки
1.3 Используйте обученную модель для прогнозирования новых данных
Здесь у нас нет новых данных Предполагая, что исходный набор данных_X является новыми данными, результаты этих новых данных могут быть предсказаны, и можно сравнить разницу между фактическим значением и прогнозируемым значением, а эффект прогнозирования модели может быть видно интуитивно.
# 用训练好的模型来预测
predict_y=multilayer_net.sim(dataset_X)
plt.scatter(dataset_X,dataset_y,label='dataset')
plt.scatter(dataset_X,predict_y,label='predicted')
plt.legend()
plt.title('Comparison of Truth and Predicted')
Видно, что прогнозируемое значение модели примерно совпадает с истинным значением, что, по крайней мере, показывает, что модель лучше работает на обучающем наборе.
Для получения более подробной информации о глубоких нейронных сетях вы можете обратиться к сообщению в блоге.Краткое введение в нейронные сети: от нейронов к глубокому обучению.
На самом деле для решения сложных задач не обязательно увеличивать глубину модели (то есть увеличивать количество скрытых слоев, но количество нейронов в каждом слое относительно невелико, то есть структура модели глубокий и тонкий), но и увеличить глубину модели.Ширина (то есть один или несколько скрытых слоев, но увеличивая количество нейронов в скрытом слое, то есть структура модели неглубокая и толстая), тогда какой лучше?
в статьеГалантерея | Одна из самых игнорируемых основ нейронных сетейОн упоминается в: Хотя некоторые исследования показали, что неглубокая и толстая сетевая структура также может выполнять любую функцию, она должна быть очень «толстой», а для скрытого слоя могут потребоваться тысячи нейронов, что приведет к модели. количество параметров значительно увеличилось. Сравните график ниже:
Как видно из приведенного выше рисунка: при одинаковой точности количество параметров отличается в несколько раз. Это также показывает, что мы обычно используем глубокие нейронные сети вместо мелких «толстых» сетей.
########################резюме########################## ######
1. Построение и обучение глубоких нейронных сетей реализовано с помощью более зрелых фреймворков, таких как Keras, Tensorflow, PyTorch и т. д. Это используется только для объяснения внутренней структуры и выполнения простого обучения моделированию.
2. Для решения более сложных задач мы обычно выбираем глубокую и тонкую структуру модели вместо мелкой и толстой модели, потому что количество параметров этой модели очень велико, а время обучения велико.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.