Python 对CNN使用不同的目标向量

Python 对CNN使用不同的目标向量,python,keras,deep-learning,conv-neural-network,Python,Keras,Deep Learning,Conv Neural Network,我希望使用不同的目标向量(不是标准的热编码)来训练我的CNN。我的图像数据位于10个不同的文件夹中(10个不同的类别)。如何使用所需的目标向量?flow\u from\u directory()输出一个热编码的标签数组。我将标签向量存储在字典中。此外,如果有帮助的话,文件夹的名称就是标签。正如您可能知道的那样,Keras中的是python生成器(如果您不熟悉python生成器,可以阅读更多关于它们的信息)。由于您希望使用自定义的目标向量(而不是从中生成的目标向量),因此可以通过将图像生成器包装到

我希望使用不同的目标向量(不是标准的热编码)来训练我的CNN。我的图像数据位于10个不同的文件夹中(10个不同的类别)。如何使用所需的目标向量?
flow\u from\u directory()
输出一个热编码的标签数组。我将标签向量存储在字典中。此外,如果有帮助的话,文件夹的名称就是标签。

正如您可能知道的那样,Keras中的是python生成器(如果您不熟悉python生成器,可以阅读更多关于它们的信息)。由于您希望使用自定义的目标向量(而不是从中生成的目标向量),因此可以通过将图像生成器包装到另一个函数中来操纵其行为。以下是如何:

首先,我们需要将自定义目标存储为numpy阵列:

#包含每个类的自定义目标的numpy数组
#自定义_目标[0]是类#1图像的目标向量
#自定义#u目标[1]是类#2图像的目标向量
#等等。
自定义\u目标=您的\u自定义\u目标
其次,我们像往常一样创建一个图像生成器,并使用
flow\u from\u目录
从磁盘读取图像。您需要将
class\u mode
参数设置为
'sparse'
,以获取每个图像的类索引。此外,您可以将
classes
参数设置为包含类名称(即目录)的列表。如果不设置此参数,将映射到标签索引的类的顺序将是字母数字的(即字母顺序最高的类的
0
,依此类推):

train\u datagen=ImageDataGenerator(重缩放=1./255)
train_generator=来自目录的train_datagen.flow_(
“数据/列车”,
目标_大小=(150150),
批次大小=32,
class_mode='sparse')#注意:将class_mode设置为sparse可生成整数索引
注意:如果未设置
classes
参数,请确保
custom\u target[i]
按字母顺序对应于
i
-th类。)

现在,我们可以将生成器封装在另一个函数中,生成一批图像及其相应的数字标签,用于生成我们自己的标签:

def自定义_生成器(生成器):
对于数据,生成器中的标签:
#获取每个类对应的自定义标签
自定义\u标签=自定义\u目标[标签]
产量数据、自定义标签
就这样!现在我们有了一个自定义生成器,我们可以将其传递给
fit\u generator
(或
predict\u generator
evaluate\u generator
以获得推断时间),就像任何其他生成器一样:

model.fit_生成器(自定义_生成器(系列生成器))#其余参数)

您可以提供一些您尝试过的代码吗?您可以轻松地将
ImageDataGenerator
封装在另一个函数中,并操作生成的目标向量。如果你不知道怎么做,请告诉我。请注意,只有当您的自定义目标向量可以从图像类别或图像内容推断出来时,这种方法才有效。@今天我无法编写该自定义函数。非常感谢您的帮助@Xers01你读过我的最新评论了吗?让我进一步解释一下:如果类别1中的所有图像都有一个目标向量,比如说
[2,9.8,19,78]
,或者通过分析图像的内容,您可以生成其目标向量,那么这种方法是有效的。是吗?@今天是的,确实如此,某个类/文件夹中的所有图像都具有相同的目标向量。