【问题标题】:CNN Model Predicting Only First ClassCNN 模型仅预测第一类
【发布时间】:2021-11-08 19:10:51
【问题描述】:

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

培训:

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

【问题讨论】:

    标签: tensorflow deep-learning conv-neural-network transfer-learning image-classification


    【解决方案1】:

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

    x=x/255
    

    然后您可以扩展尺寸。但是你有代码

    img_data = preprocess_input(x)
    

    我相信 preprocess_input 函数会使用代码重新调整 -1 和 +1 之间的像素值

    x=x/127.5-1. 
    

    所以现在您的像素值已按比例缩小了两次。所以只需删除代码

    x=x/255
    

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2018-06-04
      • 2018-12-13
      • 2019-03-28
      • 1970-01-01
      • 2018-03-02
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多