numpy Tensorflow keras库中ImageDataGenerator生成的数组的dtype存在问题

crcmnpdw  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(124)

我目前正在使用Keras机器学习库来训练图像分类任务的模型。我把我的数据存储在一个pandas DataFrame中,特征是JPEG图像的文件路径,标签是numpy float 32数组,形状为(4,)。
在训练我的模型时,我遇到了这个错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

我已将此错误追溯到ImageDataGenerator。当使用flow_from_dataframe方法生成数据时,生成的特征具有dtype float32,但生成的标签具有dtype object。当尝试将标签数组转换为float32时,我得到了ValueError: setting an array element with a sequence
下面是我的生成器的示例代码:

datagen = ImageDataGenerator(
    rescale = 1./255
)

train_df, val_df = train_test_split(df, test_size = 0.1, random_state = 42)

train_gen = datagen.flow_from_dataframe(
    dataframe = train_df,
    x_col = "photo",
    y_col = 'label',
    target_size = (32, 32),
    class_mode = 'raw',
    batch_size = b_size
)

generated = train_gen.next()

features = generated[0]
labels = generated[1]

print(features.dtype) #prints float32
print(labels.dtype) #prints object
print(labels) #prints [array([1., 1., 0., 0.], dtype=float32)
              #        array([1., 0., 0., 0.], dtype=float32)
              #        array([1., 0., 0., 0.], dtype=float32)]

labels.astype(np.float32) #ValueError: setting an array element with a sequence

我已经检查了关于ValueError: setting an array element with a sequencethis post,但没有一个给定的原因适用于我的情况。
我真的很困惑为什么会出现这个错误。
我能有一些建议吗?

6ioyuze2

6ioyuze21#

标签变量具有非均匀结构(即它是一个numpy数组列表,或者每行都是单独数组的数组)。因此,您的代码不会将标签视为具有shape(N,4),dtype float的numpy数组,而是具有shape(N,),dtype object。
所有这一切的原因是pandas在dtype对象中给出了具有数组单元的列。一个技巧是将该列单元格的内容读取为格式化列表的字符串,然后对其调用eval(),然后从结果列表中构造一个numpy数组。

相关问题