Вы забыли нормализовать изображения. В настоящее время значения в x_train
находятся в диапазоне [0,255]
. Это вызывает большие обновления градиента и останавливает процесс обучения. Одна простая схема нормализации в этом случае будет:
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
Это приводит к тому, что значения попадают в диапазон [0,1]
. Тогда вы наверняка увидите, что тренировка прогрессирует.
Более сложная схема нормализации включает в себя функциональную (то есть пиксельную) нормализацию или центрирование. При таком подходе мы нормализуем все изображения таким образом, чтобы каждый пиксель на всех изображениях имел среднее значение, равное нулю, и стандартное отклонение, равное единице (то есть они в основном попадают в диапазон [-1,1]
):
# make sure values are float
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_mean = x_train.mean(axis=0)
x_train -= x_mean
x_std = x_train.std(axis=0)
x_train /= x_std + 1e-8 # add a small constant to prevent division by zero
# normalize test data using the mean and std of training data
x_test -= x_mean
x_test /= x_std + 1e-8
Обратите внимание на последнюю часть: НИКОГДА НИКОГДА нормализовать тестовые данные по своим собственным средним и стандартным значениям. Вместо этого используйте обучающее среднее и стандартное.