【问题标题】:Data cardinality is ambiguous: Make sure all arrays contain the same number of samples Tensorflow数据基数不明确:确保所有数组包含相同数量的样本 Tensorflow
【发布时间】:2021-09-16 18:57:16
【问题描述】:

所以我一直在研究年龄估计模型。

我有 2 个轴,x_trainy_train

x_train 有图片,y_train 有标签(年龄为整数)

x_train上,单个图像数组的形状为(200, 200, 3),而整个x_train的形状为(10000, 200, 200, 3)

y_train的形状是(10000,)

================================================ ==

目前y_train 看起来像这样: [24 47 35 ... 75 3 33]

x_train 这样(当我用x_train[0] 打印第一张图像时:

[[[0.40392157 0.29411766 0.2784314 ]
  [0.4117647  0.3019608  0.28627452]
  [0.41568628 0.30588236 0.29411766]
  ...
  [0.8745098  0.5882353  0.6156863 ]
  [0.88235295 0.59607846 0.62352943]
  [0.8862745  0.6        0.627451  ]]

 [[0.41568628 0.30588236 0.2901961 ]
  [0.41960785 0.30980393 0.29411766]
  [0.41960785 0.30980393 0.29803923]
  ...
  [0.88235295 0.59607846 0.62352943]
  [0.8862745  0.6        0.627451  ]
  [0.8901961  0.6039216  0.6313726 ]]

 [[0.42745098 0.31764707 0.3019608 ]
  [0.42352942 0.3137255  0.3019608 ]
  [0.41568628 0.30588236 0.29411766]
  ...
  [0.8862745  0.6        0.627451  ]
  [0.8901961  0.6039216  0.6313726 ]
  [0.89411765 0.60784316 0.63529414]]

 ...

 [[0.92941177 0.80784315 0.7254902 ]
  [0.92941177 0.80784315 0.7254902 ]
  [0.9254902  0.8039216  0.72156864]
  ...
  [0.9098039  0.7058824  0.72156864]
  [0.9098039  0.7058824  0.72156864]
  [0.9098039  0.7058824  0.72156864]]

 [[0.93333334 0.8117647  0.7294118 ]
  [0.93333334 0.8117647  0.7294118 ]
  [0.92941177 0.80784315 0.7254902 ]
  ...
  [0.90588236 0.70980394 0.72156864]
  [0.90588236 0.70980394 0.72156864]
  [0.90588236 0.70980394 0.72156864]]]

这是我生成 x_train 和 y_train 的实际代码:

head = '/content/crop_part1/' #data dir
l = os.listdir(head)

x_train = [] # images
y_train = [] # age


for i in l[:10000]:
    img= np.array(Image.open(f'{head}{i}'))
    img= np.resize(img,(img_height, img_width,3))
    img = img.astype('float32')
    img /= 255  
    x_train.append(img)

    y_train.append(int(i.split('_')[0]))

当我拟合我的模型时,我收到此错误:

Data cardinality is ambiguous:
  x sizes: 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,  200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 2...
  y sizes: 10000
Make sure all arrays contain the same number of samples.

我假设y_train 的形状应该类似于x_train。以前我使用的是很好的 tensorflow 现成的输入管道特性,比如填充。但是我该怎么做呢?

我们是否必须用零填充y_train,例如:

[16, 0, 0]
[4, 0, 0]
[12, 0, 0]

还是我们必须重塑它?如果是那怎么办?

【问题讨论】:

    标签: python numpy tensorflow deep-learning


    【解决方案1】:

    是的,我按照您所遵循的相同教程进行操作,现在您只需进行一项更改。

    x_train = np.arrays(x_train)
    y_train = np.arrays(y_train)
    
    x_val = np.arrays(x_val)
    y_val = np.arrays(y_val)
    

    【讨论】:

      【解决方案2】:

      model.fit 根据接收到的数据类型做出不同的假设:

      • 如果接收到的数据是包含 python 类型的列表,例如 floatint,则数据将提升为张量。
      • 如果数据是张量列表(或 numpy 的数组),那么fit 假设每个张量和模型的每个输入之间存在 1 对 1 的映射。尝试训练具有多个输入的模型时,它会让生活变得更轻松。

      在您的情况下,x 是 numpy 数组的列表,而 y 是整数列表。 fit 很困惑,因为 x 似乎映射到具有 10000 不同输入的模型,其中每个输入预期有 200 个样本,而 y 映射到预期有 10000 个样本的模型的输出,因此模棱两可基数。

      一种可能的解决方法是将您的 numpy 3D 数组列表转换为一个 4D 数组。您可以为此使用np.stack

      x_train = np.stack(x_train, axis=0)  
      

      那么,你输入输出的第一个维度就等于10000,基数就没有歧义了。

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 2022-11-11
        • 2023-03-23
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2021-07-09
        • 1970-01-01
        相关资源
        最近更新 更多