Python 从生成器广播标记数据时出现问题

Python 从生成器广播标记数据时出现问题,python,tensorflow,machine-learning,image-processing,keras,Python,Tensorflow,Machine Learning,Image Processing,Keras,我正在使用CK+数据集进行面部表情识别,我正在通过一个datagen.flow\u从\u目录传递面部图像和标签,以提取面部特征并映射到标签 标签作为分类值传递,范围从0到7。这似乎是作为一个热编码形式传递的。我的问题是,我可以广播标签值作为一个热编码值 我得到以下错误: ValueError:无法将输入数组从形状(32,8)广播到形状(32) 代码如下: import scipy import os, shutil from tensorflow.keras.preprocessing.imag

我正在使用CK+数据集进行面部表情识别,我正在通过一个
datagen.flow\u从\u目录
传递面部图像和标签,以提取面部特征并映射到标签

标签作为分类值传递,范围从0到7。这似乎是作为一个热编码形式传递的。我的问题是,我可以广播标签值作为一个热编码值

我得到以下错误:
ValueError:无法将输入数组从形状(32,8)广播到形状(32)

代码如下:

import scipy
import os, shutil
from tensorflow.keras.preprocessing.image import ImageDataGenerator

img_width, img_height = 224, 224

datagen = ImageDataGenerator(rescale=1./255)
batch_size = 32

def extract_features(directory, sample_count):
    features = np.zeros(shape=(sample_count, 7, 7, 512))  # Must be equal to the output of the convolutional base
    labels = np.zeros(shape=(sample_count))
    print(sample_count, 7, 7, 512)
    # Preprocess data - flow_from_directory allows us to extract 
    #... features and labels directly from a directory
    generator = datagen.flow_from_directory(directory,
                                            target_size=(img_width,img_height),
                                            batch_size = batch_size,
                                            class_mode='categorical')

    i = 0
    for inputs_batch, labels_batch in generator:
        features_batch = conv_base.predict(inputs_batch)
        features[i * batch_size: (i + 1) * batch_size] = features_batch
        labels[i * batch_size: (i + 1) * batch_size] = labels_batch
        i += 1
        if i * batch_size >= sample_count:
            break
    return features, labels
我得到以下形状:

Found 209 images belonging to 8 classes.
Input batch shape:  (32, 224, 224, 3)
Features batch shape:  (32, 7, 7, 512)
Features shape:  (209, 7, 7, 512)
Labels batch shape:  (32, 8)
因此,我不明白为什么
功能\u batch
可以广播,而
标签\u batch
不能

我尝试过几件事,其中包括:

1) 展平标签数组-这没有意义,只是为了查看和获取跨行和列的完整元素计数32*8=259(如预期)

2) 我尝试只使用
labels[I]=labels\u batch
,以及只返回最后几个标签的
labels=labels\u batch
(17,从209-(6*32)=17遗留下来)

3) 我还尝试从中插入另一个解决方案。 通过这样做:

for c in range(0,7):
            labels[i * batch_size: (i + 1) * batch_size, [c]] = labels_batch
但会出现以下错误:

ValueError: Error when checking input: expected input_3 to have 4 dimensions, but got array with shape (32, 8)
我觉得我缺少的很简单,但我似乎无法理解。有人有什么想法吗


谢谢

您的标签应该是
labels=np.zero(shape=(sample\u count,num\u classes))
而不是
labels=np.zero(shape=(sample\u count))
并且生成器中标签的分配应为
标签[i*批次大小:(i+1)*批次大小,:]=标签批次

谢谢!我知道这是一个简单的事情,我是如何宣布这些。你是否有关于列表和字典的备忘单或复习内容的链接?我不确定,但这似乎与numpy索引和维度有关,我相信100 numpy练习肯定会让你耳目一新