Search code examples
tensorflowtransfer-learningtensorflow-hubfalse-positiveefficientnet

False prediction from efficientnet transfer learning


I'm new to transfer learning in TensorFlow and I choose tfhub to simplify finding a dataset, but now I'm confused because my model gives me a wrong prediction when I try to use an image from the internet. I used the efficientnet_v2_imagenet1k_b0 feature vector without fine-tuning to train a rock-paper-scissors dataset from https://www.kaggle.com/drgfreeman/rockpaperscissors. I used image data generator and flow from directory for data processing.

This is my model here

This is my train result here

This is my test result here

It's the second time I get something like this when using transfer learning with tfhub. I want to know why this happened and how to fix it, so this problem doesn't happen again. Thanks a lot for your help and sorry for my bad English.


Solution

  • I downloaded your code to my local machine and the dataset as well. Had to make a few adjustments to make it run locally. I believe the model efficientnet_v2_imagenet1k_b0 is different from the newer efficient net models in that this version DOES require pixel levels to be scaled between 0 and 1. I ran the model with and without rescaling and it works well only if the pixlels are rescaled. Below is the code I used to test if the model correctly predicts an image downloaded from the internet. It worked as expected.

    import cv2
    class_dict=train_generator.class_indices
    print (class_dict)
    rev_dict={}
    for key, value in class_dict.items():
        rev_dict[value]=key
    print (rev_dict)
    fpath=r'C:\Temp\rps\1.jpg' # an image downloaded from internet that should be paper class
    img=plt.imread(fpath)
    print (img.shape)
    img=cv2.resize(img, (224,224)) # resize to 224 X 224 to be same size as model was trained on
    print (img.shape)
    plt.imshow(img)
    img=img/255.0 # rescale as was done with training images
    img=np.expand_dims(img,axis=0)
    print(img.shape)
    p=model.predict(img)
    print (p)
    index=np.argmax(p)
    print (index)
    klass=rev_dict[index]
    prob=p[0][index]* 100
    print (f'image is of class {klass}, with probability of {prob:6.2f}')
    
    

    the results were

    {'paper': 0, 'rock': 1, 'scissors': 2}
    {0: 'paper', 1: 'rock', 2: 'scissors'}
    (300, 300, 3)
    (224, 224, 3)
    (1, 224, 224, 3)
    [[9.9902594e-01 5.5121275e-04 4.2284720e-04]]
    0
    image is of class paper, with probability of  99.90
    

    You had this in your code

    uploaded = files.upload()
    
    len_file = len(uploaded.keys())
    

    This did not run because files was not defined so could not find what causes your misclassification problem. Remember in flow_from_directory, if you do not specify the color mode it defaults to rgb. So even though training images are 4 channel PNG the actual model is trained on 3 channels. So make sure the images you want to predict are 3 channels.