def image_generator(df, batch_size, img_size): num_samples = len(df) while True: for offset in range(0, num_samples, batch_size): batch_df = df[offset:offset+batch_size] images = [] for path in batch_df['path']: img = Image.open(path).resize(img_size) images.append(np.asarray(img)) X = np.array(images) yield X batch_size = 32 img_size = (600, 450) gen = image_generator(df, batch_size, img_size) # 读取生成器中的每个批次,并将所有图像数据存储在 df['image'] 列中 for i, batch_images in enumerate(gen): start_index = i * batch_size end_index = start_index + batch_images.shape[0] if batch_images.shape[0] != batch_size: df.loc[start_index:start_index+batch_images.shape[0]-1, 'image'] = batch_images else: df.loc[start_index:end_index, 'image'] = batch_images代码为何会出现ValueError: Must have equal len keys and value when setting with an iterable报错
时间: 2024-03-26 22:35:03 浏览: 70
这个错误是因为在代码中给 DataFrame 中的某一列赋值时,使用了长度不相等的可迭代对象,导致了赋值失败。具体来说,是在下面这行代码中:
```
df.loc[start_index:start_index+batch_images.shape[0]-1, 'image'] = batch_images
```
如果 `batch_images` 的长度不等于 `batch_size`,那么在赋值时就会出现长度不相等的情况,从而导致这个错误。为了解决这个问题,可以使用一个临时的数组来保存所有读取的图像数据,然后在完成所有批次的读取后再一次性地将这些数据赋值给 DataFrame 中的 `image` 列。具体来说,可以按照下面的方式修改代码:
```
def image_generator(df, batch_size, img_size):
num_samples = len(df)
all_images = np.zeros((num_samples, *img_size, 3)) # 创建一个临时数组,用于保存所有读取的图像数据
while True:
for offset in range(0, num_samples, batch_size):
batch_df = df[offset:offset+batch_size]
images = []
for path in batch_df['path']:
img = Image.open(path).resize(img_size)
images.append(np.asarray(img))
X = np.array(images)
all_images[offset:offset+batch_images.shape[0]] = X # 将本批次的图像数据保存到临时数组中
yield X
# 在完成所有批次的读取后,将临时数组中的数据赋值给 DataFrame 中的 'image' 列
df['image'] = all_images
```
这样就可以避免赋值时出现长度不相等的问题了。
阅读全文