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