【发布时间】:2019-12-04 23:38:02
【问题描述】:
在下面的一些问题和教程中:
- Why is an iterable object not an iterator?
- Generator "TypeError: 'generator' object is not an iterator"
建议 keras 的数据生成器应该是一个包含 __iter__ 和 __next__ 方法的类。
而其他一些教程如:
- https://keunwoochoi.wordpress.com/2017/08/24/tip-fit_generator-in-keras-how-to-parallelise-correctly/
- https://www.altumintelligence.com/articles/a/Time-Series-Prediction-Using-LSTM-Deep-Neural-Networks
使用带有 yield 语句的普通 python 函数来提供数据。虽然我按照上面的第二个教程在 LSTM 网络中成功使用了 yield,但我无法在卷积网络中使用正常的 yield 函数并在 fit_generator 中得到以下错误:
'method'对象不是迭代器
我没有尝试使用 __next__ 方法,但建议遇到上述错误的人使用 __next__ 方法(编辑:在 Daniel Möller 建议的修复后工作)。有人可以帮我澄清一下何时使用哪种技术,以及“yields”下一个示例的函数与具有 __iter__ 和 __next__ 的类之间有什么区别?
我使用 yield 的工作代码: https://github.com/KashyapCKotak/Multidimensional-Stock-Price-Prediction/blob/master/StockTF1_4Sequential.ipynb
我当前使用 yield 的数据生成器函数(编辑:在 Daniel Möller 建议的修复后工作):
def train_images_generator(self):
for epoch in range(0, self.epochs):
print("Current Epoch:",epoch)
cnt = 0
if epoch > 2000:
learning_rate = 1e-5
for ind in np.random.permutation(len(self.train_ids)):
print("provided image with id:",ind)
#get the input image and target/ground truth image based on ind
raw = rawpy.imread(in_path)
input_images = np.expand_dims(pack_raw(raw), axis=0) * ratio # pack the bayer image in 4 channels of RGBG
gt_raw = rawpy.imread(gt_path)
im = gt_raw.postprocess(use_camera_wb=True,
half_size=False,
no_auto_bright=True, output_bps=16)
gt_images = np.expand_dims(np.float32(im / 65535.0),axis=0) # divide by 65535 to normalise (scale between 0 and 1)
# crop
H = input_images.shape[1] # get the image height (number of rows)
W = input_images.shape[2] # get the image width (number of columns)
xx = np.random.randint(0, W - ps) # get a random number in W-ps (W-512)
yy = np.random.randint(0, H - ps) # get a random number in H-ps (H-512)
input_patch = input_images[:, yy:yy + ps, xx:xx + ps, :]
gt_patch = gt_images[:, yy * 2:yy * 2 + ps * 2, xx * 2:xx * 2 + ps * 2, :]
if np.random.randint(2) == 1: # random flip for rows
input_patch = np.flip(input_patch, axis=1)
gt_patch = np.flip(gt_patch, axis=1)
if np.random.randint(2) == 1: # random flip for columns
input_patch = np.flip(input_patch, axis=2)
gt_patch = np.flip(gt_patch, axis=2)
if np.random.randint(2) == 1: # random transpose
input_patch = np.transpose(input_patch, (0, 2, 1, 3))
gt_patch = np.transpose(gt_patch, (0, 2, 1, 3))\
input_patch = np.minimum(input_patch, 1.0)
yield (input_patch,gt_patch)
我如何使用它:
model.fit_generator(
generator=data.train_images_generator(),
steps_per_epoch=steps_per_epoch,
epochs=epochs,
callbacks=callbacks,
max_queue_size=50
#workers=0
)
【问题讨论】:
-
奇怪的是,随着架构的变化,您无法生成数据。这几乎是两个不同的东西。您能否通过提供一些代码来说明您的具体操作方式来澄清您的观点?
-
实际上,我并没有提供我的做法,而是提供了一些讨论的链接以及代码示例。我正在做的方式与链接中的示例相同。 (我已经参考了这些链接来制作生成器)
-
将在尝试“next”方法后更新代码。但是只是好奇地问为什么当某些给定的示例与产量一起使用时,为什么甚至首先需要它。
-
@today 已添加代码。请你看看。