Home > Enterprise >  False prediction from efficientnet transfer learning
False prediction from efficientnet transfer learning

Time:09-22

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.

CodePudding user response:

To help really need to see the code for how you provide your data to model.predict. However as a guess, remember efficientnet needs to have the pixels in the range from0 to 255 so do not scale your images. Make sure your test images are rgb an of the same size as the image size used in training. Also need to see code for how you process the predictions

CodePudding user response:

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.

  • Related