title: How to fine-tune ResNet50 in Keras?
body: <p>Im trying to finetune the existing models in Keras to classify my own dataset. Till now I have tried the following code (taken from Keras docs: <a href="https://keras.io/applications/" rel="nofollow noreferrer">https://keras.io/applications/</a>) in which Inception V3 is fine-tuned on a new set of classes.</p>
  
  <pre><code>from keras.applications.inception_v3 import InceptionV3
  from keras.preprocessing import image
  from keras.models import Model
  from keras.layers import Dense, GlobalAveragePooling2D
  from keras import backend as K
  
  # create the base pre-trained model
  base_model = InceptionV3(weights='imagenet', include_top=False)
  
  # add a global spatial average pooling layer
  x = base_model.output
  x = GlobalAveragePooling2D()(x)
  # let's add a fully-connected layer
  x = Dense(1024, activation='relu')(x)
  # and a logistic layer -- let's say we have 200 classes
  predictions = Dense(200, activation='softmax')(x)
  
  # this is the model we will train
  model = Model(inputs=base_model.input, outputs=predictions)
  
  # first: train only the top layers (which were randomly initialized)
  # i.e. freeze all convolutional InceptionV3 layers
  for layer in base_model.layers:
      layer.trainable = False
  
  # compile the model (should be done *after* setting layers to non-trainable)
  model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
  
  # train the model on the new data for a few epochs
  model.fit_generator(...)
  
  # at this point, the top layers are well trained and we can start fine-tuning
  # convolutional layers from inception V3. We will freeze the bottom N layers
  # and train the remaining top layers.
  
  # let's visualize layer names and layer indices to see how many layers
  # we should freeze:
  for i, layer in enumerate(base_model.layers):
     print(i, layer.name)
  
  # we chose to train the top 2 inception blocks, i.e. we will freeze
  # the first 172 layers and unfreeze the rest:
  for layer in model.layers[:172]:
     layer.trainable = False
  for layer in model.layers[172:]:
     layer.trainable = True
  
  # we need to recompile the model for these modifications to take effect
  # we use SGD with a low learning rate
  from keras.optimizers import SGD
  model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy')
  
  # we train our model again (this time fine-tuning the top 2 inception blocks
  # alongside the top Dense layers
  model.fit_generator(...)
  </code></pre>
  
  <p>Can anyone plz guide me what changes should I do in the above code so as to fine-tune ResNet50 model present in Keras.</p>
  
  <p>Thanks in advance.</p>