Рубрики
Без рубрики

Нейронная сеть с нуля с помощью Tensorflow

В этой статье я покажу, как строить нейронную сеть с нуля. Пример простой и коротким … Теги от Tensorflow, MachineLearning, Neuralnetworks, Python.

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

Ищете питорскую версию этого же урожая? Иди сюда.

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])

Обучение содержит три простых шага:

  1. Предсказывать
  2. Рассчитайте, насколько хороша прогноз сравнивается с реальным значением (при расчете потери он автоматически рассчитывает градиент, поэтому нам не нужно думать об этом)
  3. Обновление параметров, вычитая курс обучения градиента

Код продолжает принимать шаги до тех пор, пока потеря не будет меньше или равно 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”