Python Keras:如果我的列车数据在子文件夹中,我的验证数据也需要在子文件夹中?

Python Keras:如果我的列车数据在子文件夹中,我的验证数据也需要在子文件夹中?,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我正在使用目录中的image\u dataset\u来获取我的列车数据,这工作正常(我的列车数据在子文件夹中)。现在我想加载我的测试数据(不在子文件夹中),但我无法加载,我尝试使用flow\u from\u directory,出现以下错误: ValueError:形状(无,41)和(无,1)不兼容 这就是我加载图像的方式: ds_train = image_dataset_from_directory( 'final_database', labels='inferred',

我正在使用目录中的
image\u dataset\u来获取我的列车数据,这工作正常(我的列车数据在子文件夹中)。现在我想加载我的测试数据(不在子文件夹中),但我无法加载,我尝试使用
flow\u from\u directory
,出现以下错误:

ValueError:形状(无,41)和(无,1)不兼容

这就是我加载图像的方式:

ds_train = image_dataset_from_directory(
    'final_database',
    labels='inferred',
    label_mode='categorical',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    shuffle=True)

validation_datagen = ImageDataGenerator()
validation_generator = validation_datagen.flow_from_directory(
    'Spectograms/audio_test',
    target_size=(128, 128),
    batch_size=64,
)
我的完整代码:

from keras_preprocessing.image import ImageDataGenerator
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory

ds_train = image_dataset_from_directory(
    'final_database',
    labels='inferred',
    label_mode='categorical',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    shuffle=True)

validation_datagen = ImageDataGenerator()
validation_generator = validation_datagen.flow_from_directory(
    'Spectograms/audio_test',
    target_size=(128, 128),
    batch_size=64,
)

model = keras.Sequential([
    layers.Conv2D(filters=32, kernel_size=5, activation="relu", padding='same',
                  input_shape=[128, 128, 3]),
    layers.MaxPool2D(),

    layers.Conv2D(filters=64, kernel_size=3, activation="relu", padding='same'),
    layers.MaxPool2D(),

    layers.Conv2D(filters=128, kernel_size=3, activation="relu", padding='same'),
    layers.MaxPool2D(),

    layers.Flatten(),
    layers.Dense(units=6, activation="relu"),
    layers.Dense(units=1, activation="sigmoid"),
])
model.summary()
model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

model.fit(
    ds_train,
    validation_data=validation_generator,
    epochs=40,
    verbose=0
)

如果您使用ImageDataGenerator,则验证图像的\u目录中的\u流必须与培训图像一样,将它们分离到类目录中。现在,您可以使用以下代码将培训数据划分为培训st和验证集:

v_split=.2 # set percentage of data to use for validation
ds_train = image_dataset_from_directory(
    'final_database',
    labels='inferred',
    label_mode='categorical',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    validation_split=v_split,
    subset='training,
    shuffle=True)
ds_valid=image_dataset_from_directory(
    'final_database',
    labels='inferred',
    label_mode='categorical',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,
    validation_split=v_split,
    subset='validation',
    shuffle=True)
现在,如果您以与列车目录相同的方式组织测试目录,那么您可以按如下方式创建测试集(假设您的测试目录称为final\u database\u test)


flow_from_directory方法要求每个类有一个子目录。您可以尝试在“audio_test”内创建一个文件夹,并将图像放在该文件夹中,或者您可以将目录路径设置为“SpectGram”,因为您在文件夹audio_test内有图像。我以前尝试过,但不起作用:(看起来错误可能来自你代码的另一部分。你是否使用损失作为“分类交叉熵”?是的。我应该使用另一个吗?我将用我的完整代码编辑问题最后一个密集层中的单元数取决于分类问题的类型。我假设你的是一个多类分类问题(超过2个类)在这种情况下,单元数应等于您尝试预测的类数,并且需要使用的激活函数为“softmax”。1个单元和激活函数“sigmoid”用于二进制分类问题的最后一个密集层(预测2个类中的一个).因此,列车和测试必须具有相同的目录“架构”?是否有其他功能可供使用,以便仅列车数据保留在子文件夹中?
test_ds=image_dataset_from_directory(
    'final_database_test',
    labels='inferred',
    label_mode='categorical',
    image_size=[128, 128],
    interpolation='nearest',
    batch_size=64,    
    shuffle=False)