На этом шаге мы рассмотрим, как можно повлиять на процесс обучения.
Иногда обучение не начинается или замирает слишком рано. Уровень потерь стоит на месте. Это всегда можно преодолеть: помните, что модель можно подстроить даже под случайные данные. Даже если все в вашей задаче лишено всякого смысла, вы все равно сможете чему-то обучить модель, пусть даже за счет запоминания обучающих данных.
Когда подобное происходит, корень проблемы почти всегда кроется в настройке процесса градиентного спуска: в выборе оптимизатора, начальных значений весов модели, скорости обучения или размера пакета. Все эти параметры взаимозависимы, поэтому часто достаточно настроить скорость обучения и размер пакета, оставив остальные параметры неизменными.
Давайте рассмотрим конкретный пример: обучим модель MNIST из 26 шага с чрезмерно большой скоростью обучения, равной 1.
from tensorflow.keras.datasets import mnist from tensorflow import keras from tensorflow.keras import layers (train_images, train_labels), _ = mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype("float32") / 255 model = keras.Sequential([ layers.Dense(512, activation="relu"), layers.Dense(10, activation="softmax") ]) model.compile(optimizer=keras.optimizers.RMSprop(1.), loss="sparse_categorical_crossentropy", metrics=["accuracy"]) model.fit(train_images, train_labels, epochs=10, batch_size=128, validation_split=0.2)
Модель быстро достигает точности обучения на проверочных данных в диапазоне 30-40%, но не может превзойти этот уровень. Попробуем уменьшить скорость обучения до более разумного значения 1e-2.
from tensorflow.keras.datasets import mnist from tensorflow import keras from tensorflow.keras import layers (train_images, train_labels), _ = mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype("float32") / 255 model = keras.Sequential([ layers.Dense(512, activation="relu"), layers.Dense(10, activation="softmax") ]) model.compile(optimizer=keras.optimizers.RMSprop(1e-2), loss="sparse_categorical_crossentropy", metrics=["accuracy"]) model.fit(train_images, train_labels, epochs=10, batch_size=128, validation_split=0.2)
Теперь обучение сдвинулось с мертвой точки. Если вы оказались в подобной ситуации, попробуйте:
В конце концов вы найдете конфигурацию, с которой начнется обучение.
На следующем шаге мы рассмотрим использование более удачной архитектуры.