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

Итак, мы начнем с импорта библиотек.

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 итераций, и на каждой итерации выполняется операция оптимизатора и вычисляется значение потерь.

Вот пошаговое объяснение блока кода:

  1. Цикл for повторяется 1000 раз, при этом переменная цикла i принимает значения от 0 до 999.
  2. Метод sess.run() вызывается с двумя операциями TensorFlow в качестве аргументов: optimizer и loss. Это запускает операцию оптимизатора для обновления весов и смещений нейронной сети на основе текущих входных данных и ожидаемого результата, а также вычисляет значение потерь.
  3. Параметр feed_dict функции sess.run() используется для подачи входных данных и ожидаемого вывода в нейронную сеть. X_ph и y_ph — это заполнители для входных и выходных данных соответственно, а X и y — это массивы NumPy, содержащие фактические входные и выходные данные.
  4. Результатом sess.run() является кортеж, содержащий два значения: первое значение игнорируется (представлено символом подчеркивания _), а второе значение присваивается переменной l, которая представляет текущее значение убытка.
  5. Оператор if проверяет, кратно ли i 100 (т. е. кратно ли текущая итерация 100). Если это так, текущий номер итерации и значение потерь выводятся на консоль с помощью функции print().

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

Таким образом, код определяет нейронную сеть с прямой связью с одним скрытым слоем и обучает ее функции XOR с использованием TensorFlow. Входные и выходные данные определяются как массивы NumPy, а нейронная сеть определяется с использованием переменных TensorFlow, заполнителей и операций. Веса и смещения инициализируются случайным образом с использованием нормального распределения, а функция активации ReLU используется в скрытом слое. Оптимизатор Адама используется для минимизации функции потери среднеквадратичной ошибки. Наконец, нейронная сеть обучается на 1000 итераций, и потери печатаются каждые 100 итераций.

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

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

А пока следите за обновлениями для следующего блога…..

***Следующий блог***