【问题标题】:AttributeError: 'zip' object has no attribute 'ndim'AttributeError:“zip”对象没有属性“ndim”
【发布时间】:2021-02-19 00:16:12
【问题描述】:

我使用了 keras 文档为 ImageDataGenerator 提供的代码 我不断收到此错误

文件“C:\Users\abif\AppData\Local\Continuum\anaconda3\envs\deep_learning\lib\site-packages\keras\engine\training_utils.py”,第 34 行,在standardize_single_array elif x.ndim == 1:

AttributeError: 'zip' 对象没有属性 'ndim'

X_path= os.path.join('......./train_data/', 'images') # input image
Y_path = os.path.join('......../train_data/', 'masks') # ground-truth label

# we create two instances with the same arguments
data_gen_args = dict(#featurewise_center=True,
                     #featurewise_std_normalization=True,
                     rotation_range=45.,
                     #width_shift_range=0.1,
                     #height_shift_range=0.1,
                     zoom_range=[0.2])
seed = 1 
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)

image_generator = image_datagen.flow_from_directory(X_path , class_mode=None, seed=seed,batch_size = 1, 
                                                    target_size=(img_col,img_row),color_mode='grayscale')
mask_generator = mask_datagen.flow_from_directory( Y_path, class_mode=None, seed=seed,batch_size = 1 ,target_size=(img_col, img_row),color_mode='grayscale')

num_train = len(image_generator)
train_generator = zip(image_generator, mask_generator)

model = model.fit(train_generator, steps_per_epoch=num_train, shuffle=True, validation_split=0.1 , batch_size=16, epochs=50,callbacks=[earlystopper, checkpointer])

谁能给我解释一下怎么回事?

【问题讨论】:

  • 嗨。欢迎来到 SO!您能否发布完整的错误跟踪?
  • 请将其作为问题的一部分发布。
  • 你使用的是 keras 而不是 tf.keras,只有 tf.keras 是接受 fit 生成器的,所以你应该使用 fit_generator

标签: python image-processing keras deep-learning conv-neural-network


【解决方案1】:

在下面一行:

model = model.fit(train_generator, steps_per_epoch=num_train, shuffle=True, validation_split=0.1 , batch_size=16, epochs=50,callbacks=[earlystopper, checkpointer])

第一个参数是 zip 函数返回的 zip 对象。根据 Keras 文档,model.fit() 可以采用多种格式,其中第一种是 numpy 数组,这是它所期望的类,因为它具有 ndim(维数)属性,因此会出现错误消息.

https://keras.io/api/models/model_training_apis/

无论您想作为第一个参数发送什么,您都可能希望将 zip 对象转换为一个列表。为此,请使用 list(train_generator),如果你想要一个 numpy 数组,你可以使用 np.array(trainGeneratorList)trainGeneratorList 是你得到的,这要归功于 list 函数。

【讨论】:

  • 我按照你的建议做了并使用了list(train_generator),程序运行了差不多一个小时,然后出现与内存相关的错误信息 MemoryError: Unable to allocate 64.0 KiB for an array with shape (1 , 128, 128) 和数据类型 float32。请给我一个建议,我应该在代码中更改什么? @OctaveL
  • @abby 听起来您的内存不足。如果您向其提供了足够的数据,以至于在您的 PC 上分配列表太难(这是相当多的),那么您最好寻找替代解决方案。提供一个生成器而不是一个列表本身可能就足够了,我对库的了解还不够,无法判断 - 你最好用示例代码和所有内容打开另一个线程。
【解决方案2】:

使用这样的数据生成器:

from keras.preprocessing.image import ImageDataGenerator
import keras
import tensorflow as tf
import numpy as np

class JoinedGen(tf.keras.utils.Sequence):
    def __init__(self, input_gen, target_gen):
        self.input_gen = input_gen
        self.target_gen = target_gen

        assert len(input_gen) == len(target_gen)

    def __len__(self):
        return len(self.input_gen)

    def __getitem__(self, i):
        x = self.input_gen[i]
        y = self.target_gen[i]

        return x, y

    def on_epoch_end(self):
        self.input_gen.on_epoch_end()
        self.target_gen.on_epoch_end()
        self.input_gen.index_array = self.target_gen.index_array

train_generator = JoinedGen(image_generator, mask_generator)

model.fit(train_generator, epochs=500, verbose=1, callbacks=[mc, neptune_cbk])

如果你使用list它会在开始训练之前生成所有样本,它会炸毁你的记忆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2021-07-31
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多