CNN 模型仅首先预测 Class

CNN Model Predicting Only First Class

我正在研究细粒度 class化 class化汽车模型。所以我使用了迁移学习 ResNet50。据我所知,它在训练时表现良好。但是当我尝试新图像时,它总是预测单个 class。下面是我的代码。

训练:

from tensorflow.keras.layers import Input, Lambda, Dense, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.applications.resnet50 import ResNet50
from keras.applications.vgg16 import VGG16
from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow.keras.preprocessing import image
from tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img
from tensorflow.keras.models import Sequential
import matplotlib.pyplot as plt
import numpy as np
from glob import glob


IMAGE_SIZE = [224, 224]

train_path = 'Datasets/train'
valid_path = 'Datasets/test'

resnet = ResNet50(input_shape = IMAGE_SIZE + [3], weights='imagenet', include_top = False)


for layer in resnet.layers:
    layer.trainable = False

folders = glob('Datasets/train/*') #training folders

x = Flatten()(resnet.output)

prediction = Dense(len(folders), activation='softmax') (x) 

model = Model(inputs = resnet.input, outputs = prediction)

model.compile(
    loss = 'categorical_crossentropy',
    optimizer = 'adam',
    metrics = ['accuracy']
)

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

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('Datasets/train',
                                                target_size = (224, 224),
                                                batch_size = 32,
                                                class_mode = 'categorical')


test_set = test_datagen.flow_from_directory('Datasets/test',
                                            target_size = (224, 224),
                                            batch_size = 32,
                                            class_mode = 'categorical')


r = model.fit_generator(
training_set,
validation_data=test_set,
epochs=200,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)


from tensorflow.keras.models import load_model

model.save('model_updateV1.h5')

y_pred = model.predict(test_set)


import numpy as np
y_pred = np.argmax(y_pred, axis=1)

尝试新图像:

from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
import numpy as np
from tensorflow.keras.applications.resnet50 import preprocess_input

model = load_model('model_updateV1.h5')

img = image.load_img('Datasets/test/mercedes/45.jpg', target_size=(224,224))

x = image.img_to_array(img)

x = x/255.

x = np.expand_dims(x, axis = 0)
img_data = preprocess_input(x)
img_data.shape

model.predict(img_data)

a = np.argmax(model.predict(img_data), axis=1)
a

我认为您的问题是您将图像重新缩放了两次。您有代码

x=x/255

然后你扩大尺寸就好了。但是你有代码

img_data = preprocess_input(x)

我相信 preprocess_input 函数会使用代码

重新缩放 -1 和 +1 之间的像素值
x=x/127.5-1. 

所以现在你的像素值已经缩小了两倍。所以只需删除代码

x=x/255