Python Keras ImageDataGenerator:为什么我的CNN的输出是反向的?
我正在给CNN编一个区分猫和狗的代码。 我已经设置了我的标签,比如狗:0和猫:1,所以我希望我的CNN输出一个0,如果它是狗,如果它是猫。然而,它却做了相反的事情(猫给0,狗给1)。请检查我的代码,看看哪里出错了。谢谢 我目前使用的是Python3.6.8,使用的是jupyter笔记本(里面的所有代码都是我从jupyter笔记本复制粘贴代码的不同部分) CNN给出了与正确答案相反的结果,当反转输出时,我得到了预期的结果(正确的识别和准确性)。Python Keras ImageDataGenerator:为什么我的CNN的输出是反向的?,python,pandas,machine-learning,keras,deep-learning,Python,Pandas,Machine Learning,Keras,Deep Learning,我正在给CNN编一个区分猫和狗的代码。 我已经设置了我的标签,比如狗:0和猫:1,所以我希望我的CNN输出一个0,如果它是狗,如果它是猫。然而,它却做了相反的事情(猫给0,狗给1)。请检查我的代码,看看哪里出错了。谢谢 我目前使用的是Python3.6.8,使用的是jupyter笔记本(里面的所有代码都是我从jupyter笔记本复制粘贴代码的不同部分) CNN给出了与正确答案相反的结果,当反转输出时,我得到了预期的结果(正确的识别和准确性)。 我知道只要将行df_output['label']=
我知道只要将行
df_output['label']=np.where(df_output['probability']>0.5,'cat','dog')
更改为df_output['label']=np.where(df_output['probability']<0.5,'cat','dog')
就解决了这个问题,但这并不能帮助我弄明白为什么CNN的输出是反向的。你的问题的原因很微妙。我将用一个玩具的例子来说明发生了什么。假设我们用以下代码实例化一个数据生成器:
# List of image paths, doesn't matter here
image_paths = ['./img_{}.png'.format(i) for i in range(5)]
labels = ... # List of labels
df = pd.DataFrame()
df['filename'] = image_paths
df['class'] = labels
generator = ImageDataGenerator().flow_from_dataframe(dataframe=df,
directory='./',
x_col='filename',
y_col='class')
ImageDataGenerator希望数据框中的类列包含与图像关联的字符串标签。在内部,它将这些标签映射到类整数。您可以通过调用class\u index
属性来检查此映射。使用以下标签列表实例化生成器后:
labels = ['cat', 'cat', 'cat', 'dog', 'dog']
class_索引
映射将如下所示:
generator.class_indices
> {'cat': 0, 'dog': 1}
让我们再次实例化生成器,但更改第一个图像的标签:
labels = ['dog', 'cat', 'cat', 'dog', 'dog']
# After re-instantiating the generator
generator.class_indices
> {'dog': 0, 'cat': 1}
类的整数编码被交换,这表明标签到类整数的内部映射取决于遇到不同类的顺序
您正在将cat
映射为1,将dog
映射为0,但ImageDataGenerator将这些字符串解释为标签字符串,并在内部将它们映射为整数
现在,如果目录中的第一个图像是一只猫,会发生什么情况?
labels = [1, 0, 1, 0, 0] # ['cat', 'dog', 'cat', 'dog', 'dog']
# After re-instantiating the generator
generator.class_indices
> {1: 0, 0: 1} # !
这就是你困惑的根源要避免这种情况,请执行以下操作之一:
- 在数据帧的标签列中使用“cat”和“dog”,并让ImageDataGenerator为您处理映射
- 将类列表传递给调用中的
classes
参数
flow\u from\u dataframe
以明确指定映射
您能在定义数据帧的地方包含代码吗df
?编辑上面的代码以包含它。这只是一个df=pd.DataFrame({'filename':filename,'class':categories})
@sdcbrIf我通过生成器传递了训练集,并说映射的类是{'dog':0,'cat':1}
,我将传入一个新的数据集,其中cat是第一个图像。cat会被映射到0还是1?好问题。我不知道这是否是故意的行为。我必须查看源代码,但我现在真的没有时间。自己明确指定映射可能是最安全的。在过去的两周里,keras_预处理的两个错误修复版本已经发布,这种行为已经改变。看见
labels = [1, 0, 1, 0, 0] # ['cat', 'dog', 'cat', 'dog', 'dog']
# After re-instantiating the generator
generator.class_indices
> {1: 0, 0: 1} # !