gpt4 book ai didi

python - keras predict_generator 在使用 keras.utils.Sequence 时正在改组其输出

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:11 25 4
gpt4 key购买 nike

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

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

我的生成器是这样定义的

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='')

获得了正确的结果(如 this image 所示,其中 x 是期望值,y 是预测值)

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

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

输出被打乱,可以看出here .

我的问题类似于 #5048#6745 ,应该通过以下方式解决 #6891 API,但我使用的是 keras 版本 2.1.6,即使使用 workers=1,它仍在改组我的预测。

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

我还发现一些东西表明它可能与批处理数不完全除以样本数有关,但是如果我使用 n_batch=1

这个问题仍然存在>

作为旁注,predict_generator 可能不会改组数据,而只是返回带有索引偏移量的数据,因为 valuesimages_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]

关于python - keras predict_generator 在使用 keras.utils.Sequence 时正在改组其输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com