Привет, читатели, надеюсь, у вас все хорошо, в целости и сохранности. Надеюсь, вы уже прочитали предыдущий блог и познакомились с нейронными сетями в алгоритмах глубокого обучения. В предыдущем блоге я написал код для всех вас и сделал его очень простым и понятным, если вы его не читали, то можете пройти по этой ссылке. В этом блоге я буду реализовывать пример нейронной сети с прямой связью, используя расширенный код.
Итак, мы начнем с импорта библиотек.
import tensorflow as tf import numpy as np
Импортируем необходимые библиотеки, TensorFlow и NumPy.
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]])
Мы определяем входные данные (X) и ожидаемые выходные данные (y) для функции XOR.
n_input = 2 n_hidden = 4 n_output = 1
Определим количество нейронов в каждом слое нейронной сети.
X_ph = tf.placeholder(tf.float32, [None, n_input]) y_ph = tf.placeholder(tf.float32, [None, n_output])
Мы определяем заполнители ввода и вывода для нейронной сети. Заполнитель ввода представляет собой двумерный тензор с None в качестве первого измерения (чтобы учесть переменные размеры пакетов) и n_input в качестве второго измерения. Выходной заполнитель также представляет собой двумерный тензор с None в качестве первого измерения (для учета переменных размеров пакетов) и n_output в качестве второго измерения.
W1 = tf.Variable(tf.random_normal([n_input, n_hidden], stddev=0.1)) b1 = tf.Variable(tf.constant(0.1, shape=[n_hidden])) W2 = tf.Variable(tf.random_normal([n_hidden, n_output], stddev=0.1)) b2 = tf.Variable(tf.constant(0.1, shape=[n_output]))
Мы определяем веса и смещения для нейронной сети. W1 — матрица весов между входным и скрытым слоями, b1 — вектор смещения для скрытого слоя, W2 — матрица весов между скрытым слоем и выходным слоем, а b2 — вектор смещения для выходного слоя. Мы инициализируем веса нормальным распределением со стандартным отклонением 0,1 и смещениями с постоянным значением 0,1.
hidden_output = tf.nn.relu(tf.matmul(X_ph, W1) + b1)
Мы определяем операцию для скрытого слоя, которая вычисляет выходные данные скрытого слоя, беря скалярное произведение входных данных (X_ph) и весовой матрицы (W1), добавляя вектор смещения (b1) и применяя выпрямленную линейную единицу. (ReLU) функция активации.
output = tf.matmul(hidden_output, W2) + b2
Мы определяем функцию потерь, которая измеряет разницу между прогнозируемым выходом (output) и ожидаемым выходом (y_ph) с использованием среднеквадратичной ошибки.
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)
Мы определяем оптимизатор как оптимизатор Адама со скоростью обучения 0,01. Минимизируем функцию потерь с помощью оптимизатора.
sess = tf.Session() sess.run(tf.global_variables_initializer())
Мы создаем сеанс TensorFlow и инициализируем переменные (веса и смещения).
for i in range(1000): _, l = sess.run([optimizer, loss], feed_dict={X_ph: X, y_ph: y}) if i % 100 == 0: print('Step', i, 'Loss:', l)
Этот блок кода является обучающим циклом для нейронной сети с прямой связью. Он выполняется 1000 итераций, и на каждой итерации выполняется операция оптимизатора и вычисляется значение потерь.
Вот пошаговое объяснение блока кода:
- Цикл for повторяется 1000 раз, при этом переменная цикла
i
принимает значения от 0 до 999. - Метод
sess.run()
вызывается с двумя операциями TensorFlow в качестве аргументов:optimizer
иloss
. Это запускает операцию оптимизатора для обновления весов и смещений нейронной сети на основе текущих входных данных и ожидаемого результата, а также вычисляет значение потерь. - Параметр
feed_dict
функцииsess.run()
используется для подачи входных данных и ожидаемого вывода в нейронную сеть.X_ph
иy_ph
— это заполнители для входных и выходных данных соответственно, аX
иy
— это массивы NumPy, содержащие фактические входные и выходные данные. - Результатом
sess.run()
является кортеж, содержащий два значения: первое значение игнорируется (представлено символом подчеркивания_
), а второе значение присваивается переменнойl
, которая представляет текущее значение убытка. - Оператор
if
проверяет, кратно лиi
100 (т. е. кратно ли текущая итерация 100). Если это так, текущий номер итерации и значение потерь выводятся на консоль с помощью функцииprint()
.
Таким образом, по мере выполнения цикла значение потерь периодически печатается, чтобы отслеживать ход обучения нейронной сети.
Таким образом, код определяет нейронную сеть с прямой связью с одним скрытым слоем и обучает ее функции XOR с использованием TensorFlow. Входные и выходные данные определяются как массивы NumPy, а нейронная сеть определяется с использованием переменных TensorFlow, заполнителей и операций. Веса и смещения инициализируются случайным образом с использованием нормального распределения, а функция активации ReLU используется в скрытом слое. Оптимизатор Адама используется для минимизации функции потери среднеквадратичной ошибки. Наконец, нейронная сеть обучается на 1000 итераций, и потери печатаются каждые 100 итераций.
На этом пока все… Надеюсь, вам понравился мой блог, и вы узнали, как реализовать сеть прямой связи в расширенной версии. Между начальным и продвинутым уровнями нет большой разницы, поскольку она полностью зависит от сложности и лучшего знания Python, которым вы обладаете.
В следующем блоге я буду обсуждать этапы обратного распространения, до сих пор мы двигались в прямом направлении, поэтому теперь мы поговорим о том, в какой момент времени модель должна выполнить обратное распространение, чтобы обучить себя.
А пока следите за обновлениями для следующего блога…..
***Следующий блог***