AttributeError:“zip”对象没有属性“ndim”

2024-03-29 13:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用keras文档为ImageDataGenerator提供的代码 我一直在犯这个错误

文件“C:\Users\abirf\AppData\Local\Continuum\anaconda3\envs\deep\u learning\lib\site packages\keras\engine\training\u utils.py”,第34行,标准化单数组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])

有人能给我解释一下怎么了吗


Tags: pathimageimgdatasizemodeargsrange
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,它将在开始训练之前生成所有样本,这将破坏你的记忆

在以下行中:

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函数

相关问题 更多 >