preprocess_input в керасе резко увеличивает размер поезда
Перед тренировкой с моделью resnet50 я предварительно обработал свой ввод, используя:
img = image.load_img(os.path.join(TRAIN, img), target_size=[224, 224])
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)
img = preprocess_input(img)
и сохранить массив изображений. Я узнал, что без preprocess_input
размер массива равен 1,5 ГБ, а preprocess_input - 7 ГБ. Это нормальное поведение? Или я что-то упустил? Почему Zero-center by mean pixel
резко увеличить размер ввода?
Вот как zero center by mean pixel
определяется в керасе
x = x[..., ::-1]
x[..., 0] -= 103.939
x[..., 1] -= 116.779
x[..., 2] -= 123.68
3 ответа
Это потому, что значения пикселей имели тип "uint8", а теперь они имеют тип "float". Итак, теперь у вас есть изображение, которое представляет собой массив 'float', который больше, чем массив 'uint8'.
Чтение из кераса preprocess_input
Изображения нормализуются путем вычитания среднего значения изображения набора данных, которое, по-видимому, является константой, полученной из imagenet. Вот код
def _preprocess_numpy_input(x, data_format, mode):
if mode == 'tf':
x /= 127.5
x -= 1.
return x
if data_format == 'channels_first':
if x.ndim == 3:
# 'RGB'->'BGR'
x = x[::-1, ...]
# Zero-center by mean pixel
x[0, :, :] -= 103.939
x[1, :, :] -= 116.779
x[2, :, :] -= 123.68
else:
x = x[:, ::-1, ...]
x[:, 0, :, :] -= 103.939
x[:, 1, :, :] -= 116.779
x[:, 2, :, :] -= 123.68
else:
# 'RGB'->'BGR'
x = x[..., ::-1]
# Zero-center by mean pixel
x[..., 0] -= 103.939
x[..., 1] -= 116.779
x[..., 2] -= 123.68
return x
Я не понимаю, почему использование этого фрагмента кода увеличило размер моего набора данных.
В соответствии с аргументом документации TensorFlow: numpy.array с плавающей запятой или tf.Tensor, 3D или 4D с 3 цветовыми каналами, со значениями в диапазоне [0, 255]. и функция возвращает Возвращает: предварительно обработанный numpy.array или tf.Tensor с типом float32.
У меня такое ощущение, что целые числа используют разный объем памяти.