1. Вычислим выход нейрона с функцией ReLU.

import numpy as np

 

x = np.array([1.0, 2.0, 3.0])

w = np.array([0.2, -0.5, 0.4])

 

def relu(z):

    return np.maximum(0, z)

 

for b in [0.1, -1.0]:

    z = np.dot(w, x) + b

    a = relu(z)

 

    print("Смещение:", b)

    print("Взвешенная сумма:", round(z, 3))

    print("Выход:", round(a, 3))

Результат:

При b = 0.1:

z = 0.5.

Выход = 0.5.

При b = -1.0:

z = -0.6.

Выход = 0.

Функция ReLU обнуляет отрицательные значения, сохраняя положительные.

2. Создадим многослойный перцептрон.

import tensorflow as tf

 

model = tf.keras.Sequential([

    tf.keras.Input(shape=(3,)),

    tf.keras.layers.Dense(

        6,

        activation="relu"

    ),

    tf.keras.layers.Dense(

        1,

        activation="sigmoid"

    )

])

 

model.summary()

 

print("Параметров:", model.count_params())

Расчёт параметров:

Первый слой:

3 × 6 + 6 = 24.

Второй слой:

6 × 1 + 1 = 7.

Общее количество:

24 + 7 = 31.

Результат: 31 обучаемый параметр.

3. Обучим нейронную сеть и сравним результаты с использованием Dropout.

import tensorflow as tf

from sklearn.datasets import make_classification

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

 

tf.keras.utils.set_random_seed(42)

 

X, y = make_classification(

    n_samples=500,

    n_features=4,

    n_informative=3,

    n_redundant=0,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    stratify=y,

    random_state=42

)

 

scaler = StandardScaler()

 

X_train = scaler.fit_transform(X_train)

X_test = scaler.transform(X_test)

 

for use_dropout in [False, True]:

    tf.keras.utils.set_random_seed(42)

 

    layers = [

        tf.keras.Input(shape=(4,)),

        tf.keras.layers.Dense(

            8,

            activation="relu"

        )

    ]

 

    if use_dropout:

        layers.append(

            tf.keras.layers.Dropout(0.2)

        )

 

    layers.append(

        tf.keras.layers.Dense(

            1,

            activation="sigmoid"

        )

    )

 

    model = tf.keras.Sequential(layers)

 

    model.compile(

        optimizer="adam",

        loss="binary_crossentropy",

        metrics=["accuracy"]

    )

 

    history = model.fit(

        X_train,

        y_train,

        epochs=30,

        batch_size=16,

        validation_split=0.2,

        verbose=0

    )

 

    loss, accuracy = model.evaluate(

        X_test,

        y_test,

        verbose=0

    )

 

    print("Dropout:", use_dropout)

    print("Точность:", round(accuracy, 3))

    print(

        "Train loss:",

        round(history.history["loss"][-1], 3)

    )

    print(

        "Validation loss:",

        round(history.history["val_loss"][-1], 3)

    )

    print()

Dropout используется как способ регуляризации нейронной сети.

Сравнение результатов с Dropout и без него позволяет исследовать влияние регуляризации на процесс обучения.

При этом применение Dropout не гарантирует повышения точности в каждом эксперименте.

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