Keras image_gen.flow_from_directory() 中的 class_mode 参数表示啥?
Posted
技术标签:
【中文标题】Keras image_gen.flow_from_directory() 中的 class_mode 参数表示啥?【英文标题】:what does class_mode parameter in Keras image_gen.flow_from_directory() signify?Keras image_gen.flow_from_directory() 中的 class_mode 参数表示什么? 【发布时间】:2020-04-13 18:52:41 【问题描述】:train_image_gen = image_gen.flow_from_directory('/Users/harshpanwar/Desktop/Folder/train',
target_size=image_shape[:2],
batch_size=batch_size,
class_mode='binary')
在上面的代码 sn-p 中 class_mode='binary' 表示什么。我认为这是图像类别的数量。我正在使用此代码在 Keras 中训练图像识别分类器,以在狗和猫等 2 个不同类别之间进行分类。那么如果 class_mode='binary' 是为了表示两个类别,我们如何使它成为三个或更多?
【问题讨论】:
这个可以在文档中找到,关于ti的问题就不用问了:keras.io/preprocessing/image/#flow_from_directory @MatiasValdenegro 好吧,我之前试过但没能得到它。感谢您重定向到正确的链接。我也找到了更好的解释@medium.com/@vijayabhaskar96/… 【参考方案1】:class_mode
:“分类”、“二进制”、“稀疏”、“输入”或无之一。默认值:“分类”。确定返回的标签数组的类型:-“categorical”将是 2D one-hot 编码标签,-“binary”将是 1D 二进制标签,“sparse”将是 1D 整数标签,-“input”将是相同的图像输入图像(主要用于自动编码器)。 - 如果为 None,则不返回任何标签(生成器只会产生批量图像数据,这对于与 model.predict_generator() 一起使用很有用)。请注意,在 class_mode None 的情况下,数据仍然需要驻留在 directory 的子目录中才能正常工作。
【讨论】:
您好,您在引用的时候,也请提供出处。 > keras.io/api/preprocessing/image【参考方案2】:假设您的数据集中有 N 个类。如果你有 4 个标签,狗(索引 0)、猫(1)、驴(2)和人(3),N 就是 4。
课堂模式:
"categorical"
:2D 输出(又名长度为 N 的数字列表),[0, 0, 1, 0],它是代表驴的单热编码(只有一个数字是 1/“热”)。这是针对互斥标签的。狗不可能是猫,人也不是狗。
"binary"
:一维输出(又名。1 个数字),即 0、1、2、3 ... N。之所以这样称呼它是因为它是二进制的如果只有两个类(恕我直言,这是一个不好的理由),source。我建议仅将“二进制”用于单标签分类,因为它在代码中记录了您的意图。
"sparse"
:在挖掘代码后,这与“二进制”相同。逻辑用elif self.class_mode in 'binary', 'sparse':
完成,之后就不用class_mode了。我建议使用“稀疏”进行多标签分类,同样因为它在代码中记录了您的意图。
"input"
:标签实际上又是图像。所以狗图像的标签是同一个狗图片数组。如果我对自动编码器有更多了解,我可能能够进一步解释。
None
:没有标签,因此对训练没有用处,但对推理/预测有用。
TensorFlow 文档是 here,但我认为它应该更深入地介绍 class_mode
:
“分类”、“二进制”、“稀疏”、“输入”或无之一。默认值:“分类”。确定返回的标签数组的类型:-“categorical”将是 2D one-hot 编码标签,-“binary”将是 1D 二进制标签,“sparse”将是 1D 整数标签,-“input”将是相同的图像输入图像(主要用于自动编码器)。 - 如果为 None,则不返回任何标签(生成器只会产生批量图像数据,这对于与 model.predict() 一起使用很有用)。请注意,在 class_mode None 的情况下,数据仍然需要驻留在 directory 的子目录中才能正常工作。
稀疏和二进制一样吗?:
正如您在我的搜索结果中看到的那样,sparse 只检查了两次(搜索结果中的第 2 行和第 4 行)。我相信“稀疏”的意图是用于多标签分类,而“二进制”是为单标签分类(Hot-dog vs. No hotdog)设计的,但目前没有区别,因为行为是相同的:
【讨论】:
我更喜欢您的答案作为公认的答案,但两个答案都无法解释标签的来源。是来自文件名还是文件夹结构等。 标签必须与数据集一起提供,或者如果模型是预训练的,它会附带模型文档。例如,标签可以在文本文件中。另一个例子是 MLKit 的内置标签模型,标签为here。我不得不抓取该网站以获取索引的 json 来标记文本。它们也可以从目录结构中生成(例如,猫的 1 个文件夹,狗的 1 个文件夹) 在tensorflow lite image classifications的情况下,你可以在这个页面上找到它:For a full list of classes, see the labels file in the model zip.
storage.googleapis.com/download.tensorflow.org/models/tflite/…
我承认,在某些情况下很难找到这些标签,但每次我看够长的时间后,我都会找到它们。
标签也可以从文件夹结构/input_dir/label_a
等中推断出来以上是关于Keras image_gen.flow_from_directory() 中的 class_mode 参数表示啥?的主要内容,如果未能解决你的问题,请参考以下文章
keras与tensorflow.python.keras - 使用哪一个?
keras 与 tensorflow.python.keras - 使用哪一个?