В этой статье я покажу, как строить нейронную сеть с нуля. Пример прост и коротко, чтобы облегчить понять, но я не взял никаких ярлыков для скрытия деталей.
Ищете питорскую версию этого же урожая? Иди сюда.
import tensorflow as tf import matplotlib.pyplot as plt
Сначала мы создаем случайные данные. X – только 1-D тензор, и модель предсказует одно значение y.
x = tf.Variable([[1.,2.]]) x.shape CONSOLE: TensorShape([1, 2]) y = 5.
Параметры инициализируются с использованием нормального распределения, где среднее значение равно 0 и дисперсия 1.
def initalize_parameters(size, variance=1.0): return tf.Variable((tf.random.normal(size) * variance)) first_layer_output_size = 3 weights_1 = initalize_parameters((x.shape[1], first_layer_output_size)) weights_1 CONSOLE:bias_1 = initalize_parameters([1]) bias_1 CONSOLE: weights_2 = initalize_parameters((first_layer_output_size,1)) weights_2 CONSOLE: bias_2 = initalize_parameters([1]) bias_2 CONSOLE:
Нейронная сеть содержит две линейные функции и одна нелинейная функция между ними.
def simple_neural_network(xb): # linear (1,2 @ 2,3 = 1,3) l1 = xb @ weights_1 + bias_1 # non-linear l2 = tf.math.maximum(l1, tf.Variable([0.])) # linear (1,3 @ 3,1 = 1,1) l3 = l2 @ weights_2 + bias_2 return l3
Функция потери измеряет, насколько близки прогнозы к реальным значениям.
def loss_func(preds, yb): # Mean Squared Error (MSE) return tf.math.reduce_mean((preds-yb)**2)
Ставка обучения снижает градиент, убедившись, что параметры не изменяются слишком сильно на каждом шаге.
lr = tf.constant([10E-4])
Обучение содержит три простых шага:
- Предсказывать
- Рассчитайте, насколько хороша прогноз сравнивается с реальным значением (при расчете потери он автоматически рассчитывает градиент, поэтому нам не нужно думать об этом)
- Обновление параметров, вычитая курс обучения градиента
Код продолжает принимать шаги до тех пор, пока потеря не будет меньше или равно 0,1. Наконец это графики потери изменения.
losses = [] while(len(losses) == 0 or losses[-1] > 0.1): with tf.GradientTape() as tape: # 1. predict preds = simple_neural_network(x) # 2. loss loss = loss_func(preds, y) dW1, db1, dW2, db2 = tape.gradient(loss, [weights_1, bias_1, weights_2, bias_2]) # 3. update parameters weights_1.assign_sub(dW1 * lr) bias_1.assign_sub(db1 * lr) weights_2.assign_sub(dW2 * lr) bias_2.assign_sub(db2 * lr) losses.append(loss) plt.plot(list(range(len(losses))), losses) plt.ylabel('loss (MSE)') plt.xlabel('steps') plt.show()
Он много меняется, сколько шагов нужно, чтобы добраться до потери до 0,1.
Исходный код на Github
Оригинал: “https://dev.to/lankinen/neural-network-from-scratch-using-tensorflow-1kc8”