使用 keras.utils.Sequence 时,keras Predict_generator 会打乱其输出

2023-12-01

我正在使用 keras 构建一个输入 720x1280 图像并输出值的模型。

我有问题keras.models.Sequential.predict_generator当使用keras.utils.Sequence类来获取与验证/训练集上的图像相对应的值。返回的值被打乱,所以我不知道哪个输出对应于哪个图像。

这就是我的生成器的定义方式

from skimage.io import ImageCollection, imread 
from keras.utils import Sequence

def load_images(f):
    return imread(f).astype(np.float64)

class DataSetImageKeras(Sequence):
    def __init__(self, image_collection, values, batch_size):
        self.images = image_collection
        self.hf = values
        self.batch_size = batch_size
        self.n = len(self.images)
        self.x_scale = 250
        self.y_scale = 1e4

    def __len__(self):
        return int(np.ceil(len(self.images) / float(self.batch_size)))

    def __getitem__(self, idx):
        # batch_x is a numpy.ndarray
        batch_x = (
                self.images[idx:min(idx + self.batch_size, self.n)]
                .concatenate()
                .reshape(self.batch_size, 720, 1280, 1)
                ) 
        batch_y = self.hf[idx:min(idx + self.batch_size, self.n)]


        return batch_x/self.x_scale, batch_y/self.y_scale

images_train = ImageCollection(images_paths_train, load_func=load_images)
images_val = ImageCollection(images_paths_test, load_func=load_images)

data_train = DataSetImageKeras(images_train, values_train, n_batch)
data_val = DataSetImageKeras(images_val, values_val, n_batch)


from keras.models import load_model
model = load_model('model001') #this model is already trained

如果我使用以下代码:

val_result = []
val_hf =[]
for (batch_x, batch_y) in data_val:
    val_result.append(model.predict_on_batch(batch_x))
    val_hf.append(batch_y)

val_result = np.concatenate(val_result)
val_hf = np.concatenate(val_hf)

plt.plot(val_hf, 
         val_result,
         marker='.',
         linestyle='')

得到了正确的结果(如上所示这个图片其中 x 是期望值,y 是预测值)

但是,如果我使用 Predict_generator 函数,如下所示:

val_result = model.predict_generator(data_val, verbose=1,
                                     workers=1,
                                     max_queue_size=50,
                                     use_multiprocessing=False)

可以看到输出已打乱here.

我的问题类似于#5048 and #6745, 应该通过以下方式解决#6891API,但我使用的是 keras 版本 2.1.6,即使使用时它仍然会打乱我的预测workers=1.

它也类似于this,但我没有找到任何可以重置生成器的东西,如果我定义一个新的生成器并尝试运行该生成器,这个问题仍然存在predict_generator.

我还发现一些内容表明它可能与批次数不完全除以样本数有关,但如果我使用,这个问题仍然存在n_batch=1

作为旁注,predict_generator 可能不会对数据进行混洗,而只是用索引偏移量返回它,因为输入数据values and images_paths已经被洗牌了。


predict_generator毕竟,我并没有改变我的预测。问题在于__getitem__方法。例如,使用n_batch=32,该方法将产生从 1 到 32、然后从 2 到 33 等的值,而不是从 1 到 32、33 到 64 等。

改成如下方法即可解决问题

 def __getitem__(self, idx):
    # batch_x is a numpy.ndarray
    idx_min = idx*self.batch_size
    idx_max = min(idx_min + self.batch_size, self.n)
    batch_x = (
            self.images[idx_min:idx_max]
            .concatenate()
            .reshape(self.batch_size, 720, 1280, 1)
            ) 
    batch_y = self.hf[idx_min:idx_max]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 keras.utils.Sequence 时,keras Predict_generator 会打乱其输出 的相关文章

随机推荐