0
$\begingroup$

I am practicing with Resnet50 fine tuning for binary classification task, here is my code snippet.

base_model = ResNet50(weights='imagenet', include_top=False)
x = base_model.output
x = keras.layers.GlobalAveragePooling2D(name='avg_pool')(x)
x = Dropout(0.8)(x)
model_prediction = keras.layers.Dense(1, activation='sigmoid', name='predictions')(x)
model = keras.models.Model(inputs=base_model.input, outputs=model_prediction)
opt = SGD(lr = 0.01, momentum = 0.9, nesterov = False)

model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])  #

train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=False)

test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
        './project_01/train',
        target_size=(input_size, input_size),  
        batch_size=batch_size,
        class_mode='binary')    

validation_generator = test_datagen.flow_from_directory(
        './project_01/val',
        target_size=(input_size, input_size),
        batch_size=batch_size,
        class_mode='binary')

hist = model.fit_generator(
        train_generator,
        steps_per_epoch= 1523 // batch_size, # 759 + 764 NON = 1523
        epochs=epochs,
        validation_data=validation_generator,
        validation_steps= 269 // batch_size)  # 134 + 135NON = 269

I plotted a figure of the model after training for 50 epochs:

You may have noticed that train_acc and val_acc are highly fluctuated and train_acc merely reaches 52% which means that network isn't learning let alone over-fitting the data.

As for the losses I haven't got any insights.

Before training starts, network outputs:

Found 1523 images belonging to 2 classes.
Found 269 images belonging to 2 classes.

Is fine-tuned model learning anything at all?

I'd appreciate if someone can guide me to solve this issue. Thanks

$\endgroup$
  • $\begingroup$ Are you basing this code on some existing script? How did you decide to use a dropout rate of 0.8, and a learning rate of 0.01? (Dropout rate is very high, learning rate probably too high). What is your batch size? $\endgroup$ – Mathias Müller Jan 29 at 10:06
0
$\begingroup$

It's difficult to say without knowing what your data looks like but from the numbers it seems too less and the images might be too similar to one another or very different. In any case, I'd have checked using other networks like Inception and decreasing learning rate even further (say 0.0001) to not mess with the Imagenet weights if your data is not very different from Imagenet classes.

$\endgroup$
  • $\begingroup$ many thanks, my images are similar to one another, just like these signal images. Can you give any more updates? $\endgroup$ – bit_scientist Dec 28 '19 at 10:48
  • $\begingroup$ In this case the number of images is highly inadequate imo. I'd try to make a custom network first with very few layers and see if there's any improvement. Huge architectures like Resnet, etc. don't generally work with small data. $\endgroup$ – deadcode Dec 30 '19 at 11:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.