I'm confused by a Keras behavior I'm seeing. I'm finetuning the resnet50 model.
from keras import applications
from keras.models import Model
from keras.layers import Dense, Dropout, Flatten
from regressionGenerator import regressionGenerator
from keras.optimizers import SGD
from keras.callbacks import TensorBoard
from keras.regularizers import l2
batchSize = 32
numObservations = 948
iterationsPerEpoch = numObservations // batchSize
targetSize = (1024,1024) # Keep aspect ratio, approximately .12 of
original image size
preprocessFcn = applications.resnet50.preprocess_input
base_model = applications.ResNet50(weights='imagenet', include_top=False, input_shape=(targetSize[0],targetSize[1], 3),pooling='none')
x = base_model.output
x = Flatten()(x)
x = Dense(2048,activation='relu',kernel_regularizer=l2(0.0001))(x)
x = Dropout(0.5)(x)
predictions = Dense(5)(x)
# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
# compile the model (should be done *after* setting layers to non-trainable)
model.compile(optimizer=SGD(lr=0.00001, momentum=0.9), loss='mean_squared_error')
train_generator = regressionGenerator(batchSize,targetSize,preprocessFcn)
# Train for a few epochs to initialize top of network
model.fit_generator(
train_generator,
steps_per_epoch=iterationsPerEpoch,
epochs=15)
This model trains, and fits in memory. When I predict, also from a generator, I cannot train with the same batchSize of 32, or I receive OOM. I have to lower the batchSize to 8 to fit in memory on the same GPU.
import numpy as np
from keras.models import load_model
from predictionGenerator import predictionGenerator
from keras import applications
model = load_model('')
preprocessFcn = applications.resnet50.preprocess_input
batchSize = 8
targetSize = (1024,1024)
test_generator,idxList,numSteps = predictionGenerator(batchSize, targetSize, preprocessFcn)
Ypred = model.predict_generator(test_generator, numSteps)
Ypred = np.around(Ypred)
Ypred = np.clip(Ypred, 0, np.inf) # Clip negative counts
Ypred = Ypred[idxList, :] # Sort according to order of observations in generator
numObservations = len(idxList)
fileindices = np.reshape(np.arange(numObservations),(numObservations,1))
Ypred = np.hstack((fileindices,Ypred))
How is it possible that I can use a batchSize of 32 and train, but have to lower the batchSize by a factor of 4 during prediction?