Я хочу лучше понять концепцию предварительной обработки изображений для ввода их в предварительно обученную нейронную сеть (и, в общем, в одну, созданную с нуля).Я думаю, что новые данные для предварительно обученного NN должны иметь тот же диапазон данных, что и исходный.В этом случае я готов использовать архитектуру ResNet18 , обученную на наборе данных ImageNet , которая, если я не ошибаюсь, принимала данные в диапазоне [-1,1] какinput.
Представьте, что я работаю над набором данных cifar10, для простоты
import keras
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
, который дает значения rgb в диапазоне [0,256].Чтобы достичь диапазона [-1,1], я использую следующий код:
# this makes data in [0,1] range
x_train = np.divide(x_train, 255.0)
x_test = np.divide(x_test, 255.0)
# this generates batches in [-1,1] range, if I'm correct
datagen = ImageDataGenerator(
featurewise_center = True,
featurewise_std_normalization = True
)
datagen.fit(x_train)
# always if I'm correct, this should apply the normalization configuration also to the test set,
# so that x_train and x_test have the same range [-1,1]
for i in range(len(x_test)):
x_test[i] = datagen.standardize(x_test[i])
# now I fit the generator
epochs = 20
batch_size = 32
model.fit_generator(datagen.flow(x_train, y_train,
batch_size = batch_size),
steps_per_epoch = x_train.shape[0] // batch_size,
epochs = epochs,
validation_data = (x_test, y_test))
У меня есть следующие вопросы:
- Процедура преобразования [0,256]] исходные данные в диапазоне [-1,1] приемлемы?Является ли
x_train = np.divide(x_train, 255.0)
значимой операцией или мы получили бы тот же результат только с помощью функции ImageDataGenerator
? - Я считаю, что тестовый набор должен иметь тот же диапазон данных, что и обучающий набор, то есть [-1, 1].
for i in range(len(x_test)): x_test[i] = datagen.standardize(x_test[i])
- правильная команда для использования?
У меня пока нет четких представлений о предварительной обработке изображений.Заранее спасибо за помощь!