【问题标题】:I am not able to append labels to my training data我无法将标签附加到我的训练数据中
【发布时间】:2021-01-05 21:50:24
【问题描述】:

当我附加标签时,我最终得到 y 长度的 20580,而我希望最终得到 120,即类别数。如何将类别附加到我的标签?

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
import random as rand
import time

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Activation, Dropout, Flatten, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.optimizers import Adam

config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions(allow_growth=True))
sess = tf.compat.v1.Session(config=config)

DATADIR = "C:/Users/samue/Documents/Datasets/DogBreeds/images/Images"
CATEGORIES = os.listdir("C:/Users/samue/Documents/Datasets/DogBreeds/images/Images")

IMG_SIZE = 100

training_data = []



def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass
create_training_data()

rand.shuffle(training_data)

X = []
y = []

for features, label in training_data:
    X.append(features)
    y.append(label)

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
y = np.array(y).reshape(-1,)

print(len(CATEGORIES))
print(len(X))
print(len(y))

我最后得到的输出是: 120 20580 20580

【问题讨论】:

  • 看起来你有 20,580 个数据点,X(输入数组)和y(目标大批)。为什么您期望 y 只有 120 个元素?
  • 好的,我会解释我认为应该发生的事情,也许我对功能和标签有完全的误解。我正在尝试建立一个机器学习模型。据我了解,在这种情况下,特征 (X) 是您的数据点或照片,标签 (y) 是您要将数据点放入的不同组。因此,如果我的数据集有 120 个类别,我将需要 120 个标签来对应。是这样的吗?

标签: python numpy tensorflow keras


【解决方案1】:

我认为您应该从实现细节甚至这个特定问题退后一步,以尝试了解正在发生的事情。在图像分类中,目标是分类输入,一个 2D 或 - 3D 张量,如果它是多通道图像 - 通过将其分配给一个标签。标签的数量是有限的,你只能分类到一定数量的类中。

举个例子,让我们以MNIST 数据库为例。它是一个众所周知的 dummy 数据集,用于图像分类任务。在训练集中,有 60,000 张1x28x28-代表手写数字的图像。一般来说,该数据集的目标是将每张图像正确分类为总共 10 个标签。标签对应于数字"0""1""2"、...等直到" 9"。所以在这种特殊情况下的问题是给定图像 X,我的模型需要为这个图像预测一个类别:"0", "1", ...,或“9”,只有10种可能性。在监督学习中,我们使用标签来训练模型。对于任何给定的输入,我们需要知道 ground-truth,即该输入所属的真实类。因此,您最终会得到与标签一样多的输入:因为每个输入都被分配了自己的标签,而与可能的唯一标签的数量无关。

在您的用例中,您似乎正在使用总共 120 个类和 20,580 个图像。那是20,580 唯一的数据输入。请记住,对于这些图像中的每一个,我们需要有一个对应的 ground-truth:该图像所属的真实类。所以很自然地,你最终也会得到总共 20,580 个标签。

这可能是您困惑的根源:用我自己的话来说,labelclass 不同。类集是一组唯一的实体(动物、数字等),而标签指的是类集中的特定类。

【讨论】:

    【解决方案2】:

    我觉得你有点困惑。您应该有一个由 120 个类组成的数据集。 对于这些类中的每一个,您都需要具有该类的图像特征。例如,假设您正在构建一个分类器来区分狗的图像和猫的图像。所以你有2个班级。您可以按如下方式构建目录

    source_dir
    ----------cats_dir
    ------------------cats first image
    ------------------cats second images
    
    ------------------cats nth image
    
    ----------dogs_dir
    ------------------dogs first image
    ------------------dogs second image
    
    ------------------dogs m th image
    

    对于您的情况,source_dir 下将有 120 个子目录(类目录),每个子目录都应包含与类关联的图像。在您的情况下,您似乎总共有 20580 张图像。如果它们均匀分布,则每个类大约有 171 张图像。现在您想使用这些图像来训练 CNN。您可以按照您的方式进行操作,但我建议您不要这样做,因为您最终会将所有 20580 100 X 100 图像一次全部放入内存中。这将占用非常大的内存,并且您可能会收到 OOM(内存不足)错误。您解决该问题的方法是将数据分批提供给您的模型。例如一次 32 张图像。现在 Keras 有一些有用的功能可以帮助你做到这一点。如果您具有如上所示的目录结构,则可以使用 ImageDataGenerator.flow_from_directory 将图像批量提供给模型。文档是here. 此功能还使您能够使用图像增强来帮助扩展数据集的多样性。下面是我为上面提到的狗/猫分类示例推荐的代码。

    source_dir-r'c:\temp\cats_and_dogs'
    v_split=.2 # set this to determine the percentage of data to allocate to the validation set
    data_gen=ImageDataGenerator(rescale=1/255,validation_split=v_split)
    train_gen=data_gen.flow_from_directory(source_dir, target_size=(100,100),
                                           class_mode='categorical', batch_size=32,
                                           subset='training', color_mode='grayscale)
    valid_gen=data_gen.flow_from_directory(source_dir, target_size=(100,100),
                                           class_mode='categorical', batch_size=32,
                                           subset='validation', color_mode='grayscale, shuffle=False)
    

    当您编译模型时,设置 loss='categorical_crossentropy'。 您可以使用上面的两个生成器作为 model.fit 的输入

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 2013-09-15
      • 2021-02-16
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多