Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras ImageDataGenerator:为什么我的CNN的输出是反向的?_Python_Pandas_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python Keras ImageDataGenerator:为什么我的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']=

我正在给CNN编一个区分猫和狗的代码。 我已经设置了我的标签,比如狗:0和猫:1,所以我希望我的CNN输出一个0,如果它是狗,如果它是猫。然而,它却做了相反的事情(猫给0,狗给1)。请检查我的代码,看看哪里出错了。谢谢

我目前使用的是Python3.6.8,使用的是jupyter笔记本(里面的所有代码都是我从jupyter笔记本复制粘贴代码的不同部分)

CNN给出了与正确答案相反的结果,当反转输出时,我得到了预期的结果(正确的识别和准确性)。
我知道只要将行
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}  # !