3 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
因此,首先應(yīng)將測試圖像放置在測試文件夾內(nèi)的單獨文件夾中。所以就我而言,我在文件夾內(nèi)創(chuàng)建了另一個文件test夾并將其命名為all_classes. 然后運行以下代碼:
test_generator = test_datagen.flow_from_directory(
directory=pred_dir,
target_size=(28, 28),
color_mode="rgb",
batch_size=32,
class_mode=None,
shuffle=False
)
上面的代碼給了我一個輸出:
找到屬于 1 個類別的 306 個圖像
最重要的是,您必須編寫以下代碼:
test_generator.reset()
否則會出現(xiàn)奇怪的輸出。然后使用.predict_generator()函數(shù):
pred=cnn.predict_generator(test_generator,verbose=1,steps=306/batch_size)
運行上面的代碼將給出概率輸出,所以首先我需要將它們轉(zhuǎn)換為類號。就我而言,它是 4 個班級,因此班級編號為 0、1、2 和 3。
編寫的代碼:
predicted_class_indices=np.argmax(pred,axis=1)
下一步是我想要類的名稱:
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
where by class numbers 將替換為 class 名稱。如果要將其保存到 csv 文件,最后一步是將其排列在數(shù)據(jù)框中,并在圖像名稱后附加預(yù)測的類。
filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
"Predictions":predictions})
顯示您的數(shù)據(jù)框?,F(xiàn)在一切都完成了。您將獲得圖像的所有預(yù)測類別。

TA貢獻1780條經(jīng)驗 獲得超1個贊
我遇到了一些麻煩predict_generator()
。這里的一些帖子幫助很大。我也在這里發(fā)布我的解決方案,希望它能幫助其他人。我做的事情:
使用對新圖像進行預(yù)測
predict_generator()
獲取每個預(yù)測的文件名
將結(jié)果存儲在數(shù)據(jù)框中
我根據(jù)此處記錄的“貓和狗”進行二元預(yù)測。但是,該邏輯可以推廣到多類情況。在這種情況下,預(yù)測結(jié)果每類有一列。
首先,我加載我存儲的模型并設(shè)置數(shù)據(jù)生成器:
import numpy as np
import pandas as pd
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
# Load model
model = load_model('my_model_01.hdf5')
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
"C:/kerasimages/pred/",
target_size=(150, 150),
batch_size=20,
class_mode='binary',
shuffle=False)
注意:重要的是要指定shuffle=False以保留文件名和預(yù)測的順序。
圖像存儲在C:/kerasimages/pred/images/. 數(shù)據(jù)生成器將只在(如 中指定的)的子文件夾中查找圖像。尊重數(shù)據(jù)生成器的邏輯很重要,所以需要子文件夾。中的每個子文件夾都 被生成器解釋為一個類。在這里,生成器將報告(因為只有一個子文件夾)。如果我們進行預(yù)測,類(由生成器檢測到的)是不相關(guān)的。C:/kerasimages/pred/test_generator/images/C:/kerasimages/pred/Found x images belonging to 1 classes
現(xiàn)在,我可以使用生成器進行預(yù)測:
# Predict from generator (returns probabilities)
pred=model.predict_generator(test_generator, steps=len(test_generator), verbose=1)
在這種情況下不需要重置生成器,但如果之前已經(jīng)設(shè)置過生成器,則可能需要使用test_generator.reset().
接下來,我舍入概率以獲取類并檢索文件名:
# Get classes by np.round
cl = np.round(pred)
# Get filenames (set shuffle=false in generator is important)
filenames=test_generator.filenames
最后,結(jié)果可以存儲在數(shù)據(jù)框中:
# Data frame
results=pd.DataFrame({"file":filenames,"pr":pred[:,0], "class":cl[:,0]})

TA貢獻2080條經(jīng)驗 獲得超4個贊
您最有可能在使用flow_from_directory. 閱讀文檔:
flow_from_directory(目錄,...)
在哪里:
directory:目標目錄的路徑。每個類應(yīng)該包含一個子目錄。每個子目錄目錄樹中的任何 PNG、JPG、BMP、PPM 或 TIF 圖像都將包含在生成器中。
這意味著在傳遞給此函數(shù)的目錄中,您必須創(chuàng)建子目錄并將圖像放置在該子目錄中。否則,當圖像在您傳遞的目錄(不是子目錄)中時,確實有 0 個圖像和 0 個類。
編輯
好的,如果您要執(zhí)行預(yù)測,我相信您希望使用以下predict功能:(請注意,您必須以與學(xué)習(xí)過程中相同的格式向網(wǎng)絡(luò)提供數(shù)據(jù))
image = img_to_array(load_img(f"{directory}/{foldername}/{filename}"))
# here you prepare the input data, for example here we take the gray image
# gray scale is the 1st channel in the Lab color space
color_me = rgb2lab((1.0 / 255) * color_me)[:, :, 0]
color_me = color_me.reshape(color_me.shape + (1,))
# here data is in the format which is accepted by, in this case, my model
# for your model you have to do the preparation just the same as in the case of learning process
output = model.predict(np.array([color_me]))
# and here you have your predicted output
添加回答
舉報