I have fine tuned the Keras VGG16 model, but I'm unsure about the preprocessing during the training phase.
I create a train generator as follow:
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_folder,target_size=(IMAGE_SIZE, IMAGE_SIZE),batch_size=train_batchsize,class_mode="categorical")
Is the rescale enough or I have to apply others preprocessing functions?
When I use the network to classify an image I use this code:
from keras.models import load_model
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as npimg = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)
I think this is the correct preprocess and I should apply it before training.
Thanks for your help.
ImageDataGenerator has a preprocessing_function
argument which allows you to pass the same preprocess_input
function that you are using during inference. This function will do the rescaling for you, so can omit the scaling:
from keras.applications.vgg16 import preprocess_input
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
Most of the pretrained models in keras_applications use the same preprocessing function. You can inspect the docstring to see what it does:
def preprocess_input(x, data_format=None, mode='caffe', **kwargs):"""Preprocesses a tensor or Numpy array encoding a batch of images.# Argumentsx: Input Numpy or symbolic tensor, 3D or 4D.The preprocessed data is written over the input dataif the data types are compatible. To avoid thisbehaviour, `numpy.copy(x)` can be used.data_format: Data format of the image tensor/array.mode: One of "caffe", "tf" or "torch".- caffe: will convert the images from RGB to BGR,then will zero-center each color channel withrespect to the ImageNet dataset,without scaling.- tf: will scale pixels between -1 and 1,sample-wise.- torch: will scale pixels between 0 and 1 and thenwill normalize each channel with respect to theImageNet dataset.# ReturnsPreprocessed tensor or Numpy array.