数据文件夹应该如何在 cnn 模型中将输入作为 (x-train, y-train), (x-test, y-test)

How should the data folder be to take input as (x-train, y-train), (x-test, y-test) in a cnn model

我是机器学习和深度学习的新手。我尝试过使用 CNN 算法的多 class class 化模型。我首先尝试使用 keras 提供的 CIFAR-10 数据集。 在那里,我们给出如下输入来加载数据集,

(x-train, y-train), (x-test, y-test) = tf.keras.datasets.cifar10.load_data()

这对我有用。但是,我现在正在尝试使用我的手动数据集而不是内置数据集。不知道数据集文件夹应该怎样,更不知道怎么访问。

目前,我的数据集文件夹安排如下,

Dataset=> Training_set => 10 different classes folders with corresponding images within
          Test_set => 10 different classes folders with corresponding images within

调用 load_data 时,我不知道如何在代码中使用它。如果我以正常方式使用它,例如 flow_from_directory('../Dataset/Training_set'),我会收到以下错误 - Too many values to unpack(expected 2)。请帮助解决这个问题。对学习有很大的帮助。

您可以尝试使用 tf.keras.utils.image_dataset_from_directory

创建虚拟数据:

import os
import numpy
from PIL import Image

os.mkdir('Training_set')
for i in range(10):
  os.mkdir('Training_set/class{}'.format(i))

for i in range(10):
  for j in range(2):
    imarray = numpy.random.rand(100,100,3) * 255
    im = Image.fromarray(imarray.astype('uint8')).convert('RGB')
    im.save('Training_set/class{}/result_image{}.png'.format(i, j))

文件夹结构:

- Training_set/
    - class9/
        - result_image1.png
        - result_image0.png
    - class8/
        - result_image1.png
        - result_image0.png
    - class7/
        - result_image1.png
        - result_image0.png
    - class0/
        - result_image1.png
        - result_image0.png
    - class2/
        - result_image1.png
        - result_image0.png
    - class5/
        - result_image1.png
        - result_image0.png
    - class4/
        - result_image1.png
        - result_image0.png
    - class3/
        - result_image1.png
        - result_image0.png
    - class1/
        - result_image1.png
        - result_image0.png
    - class6/
        - result_image1.png
        - result_image0.png

使用 validation_split=0.2 加载数据(80% 训练数据,20% 验证数据):

import tensorflow as tf

train_ds = tf.keras.utils.image_dataset_from_directory(
  'Training_set',
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(100, 100),
  batch_size=2)

val_ds = tf.keras.utils.image_dataset_from_directory(
  'Training_set',
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(100, 100),
  batch_size=2)

for x, y in train_ds.take(1):
  print(x.shape, y.shape)
Found 20 files belonging to 10 classes.
Using 16 files for training.
Found 20 files belonging to 10 classes.
Using 4 files for validation.
(2, 100, 100, 3) (2,)

您还可以选择是希望标签是稀疏的还是分类的。有关详细信息,请参阅 docs

这些数据集可以像这样直接输入到您的模型中:

epochs=10
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs)

如果您确实需要,您可以将 tensorflow 数据集转换为 numpy 数组:

x_train, y_train = np.concatenate(list(train_ds.map(lambda x, y: x))), np.concatenate(list(train_ds.map(lambda x, y: y)))
x_test, y_test = np.concatenate(list(val_ds.map(lambda x, y: x))), np.concatenate(list(val_ds.map(lambda x, y: y)))