Суббота, 21 Октября 2023
Изучил оверфитинг и андерфитинг в применении к нейронным сетям. В принципе тут тоже самое что и с классическим машинным обучением. Есть сигнал - нужные нам шаблоны, есть шум - не нужные нам шаблоны, те которые есть только в обучающей выборке, но не в валидационной.
Задача - максимальный сигнал с минимальным шумом.
Нейронные сети бывают широкие(много нейронов в одном слое) и бывают глубокие(много слоев)
model = keras.Sequential([
layers.Dense(16, activation='relu'),
layers.Dense(1),
])
wider = keras.Sequential([
layers.Dense(32, activation='relu'),
layers.Dense(1),
])
deeper = keras.Sequential([
layers.Dense(16, activation='relu'),
layers.Dense(16, activation='relu'),
layers.Dense(1),
])
</pre>
<p>Чтобы сеть не переобучалась, можно применить раннюю остановку. Если будет расти потеря на валидационной выборке, обучение остановиться</p>
<pre>
from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(
min_delta=0.001, # minimium amount of change to count as an improvement
patience=20, # how many epochs to wait before stopping
restore_best_weights=True,
)
history = model.fit(
X_train, y_train,
validation_data=(X_valid, y_valid),
batch_size=256,
epochs=500,
callbacks=[early_stopping], # put your callbacks in a list
verbose=0, # turn off training log
)
Изучил Dropout and Batch Normalization
Дропаут - это когда мы отключаем одни из нейронов в слое, чтобы сеть не запоминала слишком сложные шаблоны и пыталась как можно больше обобщить данные. В таком случае может лучше работать сеть при валидации и предсказании, но не на всех данных, как повезет.
keras.Sequential([
# ...
layers.Dropout(rate=0.3), # apply 30% dropout to the next layer
layers.Dense(16),
# ...
])
Batch Normalization - когда значения из произвольной цифры конвертируются в значение от нуля до единицы. Можно применять к входным иксам, номжно применять между слоями к выходу нейрона
# пример с дропаутом и нормализацией
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(1024, activation='relu', input_shape=[11]),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1024, activation='relu'),
layers.Dropout(0.3),
layers.BatchNormalization(),
layers.Dense(1),
])
Начал изучать задачу бинарной классификации