我正在做一個細粒度的分類,對汽車模型進行分類。所以我使用了轉移學習ResNet50。據我所知,它在訓練時表現良好。但是當我嘗試新的影像時,它總是預測一個單一的類別。以下是我的代碼。
用于訓練:
from tensorflow.keras.layer 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'3], weights='imagenet', include_top = False)
for layer in resnet.layer:
layer.trainable = False[/span] 。
folders = glob('Datasets/train/*') #training folders
x = Flatten()(resnet.output)
預測 = Dense(len(folders), activation='softmax'/span>) (x)
model = Model(inputs = resnet.input, outputs = prediction)
model.compile(
loss = 'categorical_crossentropy'/span>,
優化器 = 'adam'。
度量 = ['準確性']
)
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.pred(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
uj5u.com熱心網友回復:
我認為你的問題是,你正在重新調整影像的比例兩次。你有代碼
x=x/255。
然后你擴大了尺寸,這很好。然而,你的代碼是
img_data = preprocess_input(x)
preprocess_input函式我相信是用代碼在-1和 1之間重新調整像素值的大小
x=x/127.5-1.
所以現在你的像素值已經被縮小了兩次。所以只要洗掉代碼即可
x=x/255。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310707.html
標籤:
