当使用keras.utils.Sequence时,keras预言生成器正在改组其输出
问题内容:
我正在使用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)
输出洗牌可以看出这里。
我的问题与#5048和
#6745相似
,应该由#6891 API解决
,但我使用的是keras版本2.1.6,即使使用,它仍在拖延我的预测workers=1
。
这也与此类似,但是我没有找到任何可以重置生成器的东西,如果我定义一个新生成器并尝试运行生成器,这个问题仍然存在predict_generator
。
我还发现有些事情可能与批处理数量没有完全除以样品数量有关,但是如果使用 n_batch=1
附带说明一下,因为输入数据在values
和images_paths
上已经被改组了,否则predict_generator可能不会对数据进行改组,而仅以索引偏移量返回它。
问题答案:
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]