使用保存的模型进行预测时,测试数据的预测结果是随机的

我正在使用Keras和TensorFlow对分割成256×256像素的航空影像进行分类。模型将训练数据(即构成研究区域的256×256像素影像瓦片)分为70%的训练数据和30%的验证数据。使用的是一个顺序模型,并接着使用图像数据生成器。最后,使用一个拟合生成器来使模型适应数据。然后将模型保存为h5格式,以便用于在不同研究区域的其他影像上进行类别预测。

当我使用70%/30%的训练/验证数据分割运行模型时,对验证图像的预测效果很好,准确率逐步提高,每个周期的损失稳步下降。此外,当我通过将概率数组与代表瓦片边界的矢量多边形连接起来以可视化预测结果(即概率数组)时,分类结果看起来非常好。

我的问题是,当我使用保存的h5模型对新影像进行预测时,结果毫无意义,并且每个瓦片的预测结果似乎是随机的。就像概率数组被随机打乱一样,当我将结果与矢量图像边界瓦片连接时,结果看起来完全是随机的。我该如何解决这个问题?

以下是用于训练模型的代码的相关部分:

base_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, img_channel))add_model = Sequential()add_model.add(Flatten(input_shape=base_model.output_shape[1:]))add_model.add(Dense(256, activation='relu'))add_model.add(Dense(n_classes, activation='sigmoid')) # n classesmodel = Model(inputs=base_model.input, outputs=add_model(base_model.output))model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),              metrics=['accuracy'])######################batch_size = 32epochs = 50print('Running the image data generator...')train_datagen = ImageDataGenerator(        rotation_range=30,         width_shift_range=0.1,        height_shift_range=0.1,         horizontal_flip=True)train_datagen.fit(x_train)print('Fitting the model...')history = model.fit_generator(    train_datagen.flow(x_train, y_train, batch_size=batch_size),    steps_per_epoch=x_train.shape[0] // batch_size,    epochs=epochs,    #validation_data=(x_valid, y_valid),    #callbacks=[ModelCheckpoint(model_checkpoint, monitor='val_acc', save_best_only=True)])######################## Predict#print('Predicting...')#p_valid = model.predict(x_valid, batch_size=128)## Write predictions to csv#print('Saving predictions to CSV...')#df = pd.DataFrame(p_valid)#df['image'] = split + 1 + df.index #df.to_csv(out_csv, index=False, header=False)""" Save model, including these details:-the architecture of the model, allowing to re-create the model-the weights of the model-the training configuration (loss, optimizer)-the state of the optimizer, allowing to resume training exactly where you left off."""print("Saving model")model.save("/vgg16-model-50epochs.h5")print('Processing complete.')

以下脚本使用上述保存的模型对来自不同研究区域的测试影像进行预测。请注意,在上面的最终训练运行中没有70/30的训练/验证数据分割——我只是使用100%的瓦片来训练模型,然后保存并在以下脚本中重用:

import glob, os, timeimport cv2import numpy as npimport pandas as pdfrom keras.models import load_model#from keras.models import model_from_json# Path to the input tiles which will be used to predict classesinws = '/image-directory-for-another-study-area'tiles = glob.glob(os.path.join(inws, '*.tif'))# h5 file from trained modelin_h5 = "/vgg16-model-50epochs.h5"# Output model predictions in csv formatout_csv = '/new-predictions.csv'# Read images and convert to numpy arrayx_test = np.array([cv2.imread(tile) for tile in tiles], np.float16) / 255.print('Loading existing model...')loaded_model = load_model(in_h5)print("Predicting on image tiles...")predictions = loaded_model.predict(x_test, batch_size=128)# Save to csvdf = pd.DataFrame(predictions)df['image'] = df.index + 1df.to_csv(out_csv, index=False, header=False)print("Predictions saved to disk: {0}".format(out_csv))

回答:

在第二个脚本中,glob的使用会创建一个未排序的tiff文件列表。为了使这种方法有效,您需要一个有序的tiff文件列表(例如[00001.tif, 00002.tif, ... 1234.tif]),以便与有序的预测结果相关联。可以使用sorted()函数来进行排序。

tiles = sorted(glob.glob(os.path.join(inws, '*.tif')))

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注