На этом шаге мы рассмотрим необходимость и реализацию нормализации.
На 26 шаге, в примере классификации рукописных цифр из набора MNIST, исходные черно-белые изображения цифр были представлены массивами целых чисел в диапазоне 0-255. Прежде чем передать эти данные в сеть, нам понадобилось привести числа к типу float32 и разделить каждое на 255, в результате чего у нас получились массивы чисел с плавающей точкой в диапазоне 0-1. Аналогично в примере с предсказыванием цен на дома у нас имелись наборы признаков со значениями в разных диапазонах: некоторые признаки были выражены значениями с плавающей точкой, другие - целочисленными значениями. Перед отправкой данных в сеть нам понадобилось нормализовать каждый признак в отдельности, чтобы все они имели среднее значение, равное 0, и стандартное отклонение, равное 1.
Вообще, небезопасно передавать в нейронную сеть данные, принимающие очень большие значения (например, целые числа с большим количеством значимых разрядов, которые намного больше начальных значений, принимаемых весами сети), или разнородные данные (например, такие, в которых один признак определяется значениями в диапазоне 0-1, а другой - в диапазоне 100-200). Это может привести к значительным изменениям градиента, которые будут препятствовать сходимости сети. Чтобы упростить обучение сети, данные должны:
Кроме того, может оказаться полезной (хотя и не всегда необходимой - так, мы не использовали ее в примере классификации цифр) следующая практика нормализации:
Это легко реализуется с применением массивов NumPy:
# Предполагается, что x - это двумерная матрица # данных с формой (образцы, свойства) x -= x.mean(axis=0) х /= x.std(axis=0)
На следующем шаге мы рассмотрим обработку недостающих значений.