Python 为什么使用keras和tensorflow进行培训会成功并预测失败?

Python 为什么使用keras和tensorflow进行培训会成功并预测失败?,python,tensorflow,keras,Python,Tensorflow,Keras,我训练CNN检测图像上是否存在危险ID() 我在训练中获得99%的准确率。然后,我尝试从训练集中预测图片,但没有给出正确的估计 你能告诉我这是怎么可能的吗 代码取自Google的猫和狗示例(): 对于数据集,我将狗复制到猫的身上(这样两个图像集都是相同的),然后在每个以前的猫图片上放置一个危险id: 所以我在狗目录中有“没有危险标识的狗”,在猫目录中有“有危险标识的狗” 输出: Epoch 15/15 - 14s - loss: 0.0398 - acc: 0.9910 - val_loss:

我训练CNN检测图像上是否存在危险ID()

我在训练中获得99%的准确率。然后,我尝试从训练集中预测图片,但没有给出正确的估计

你能告诉我这是怎么可能的吗

代码取自Google的猫和狗示例():

对于数据集,我将狗复制到猫的身上(这样两个图像集都是相同的),然后在每个以前的猫图片上放置一个危险id:

所以我在狗目录中有“没有危险标识的狗”,在猫目录中有“有危险标识的狗”

输出:

Epoch 15/15
 - 14s - loss: 0.0398 - acc: 0.9910 - val_loss: 0.1332 - val_acc: 0.9760
Dog: [0.9991505] Cat: [0.9996587]
Dog: [0.9996618] Cat: [0.9988152]
Dog: [0.99470115] Cat: [0.99987006]
所以我不知道是否有危险标志:狗的意思是“没有危险标志”,猫的意思是“危险标志”


相同的代码适用于原始的猫和狗数据。

因此,如果我正确理解这一点,您的标签“猫”和“狗”实际上应该表示“哈扎德标志存在”和“危险标志不存在”,对吗

我看不到您在任何地方指定标签

你能提供你提到的例子的链接吗

(我通常会将此作为评论发表,但我没有足够的代表。)

编辑:在我看来,你的标签有问题。
我要做的第一件事是验证您的培训数据是否正确标记。它似乎只是简单地将不同文件夹中的文件视为不同的标签。

因此,如果我正确理解这一点,您的标签“猫”和“狗”实际上应该表示“哈扎德标志存在”和“危险标志不存在”,对吗

我看不到您在任何地方指定标签

你能提供你提到的例子的链接吗

(我通常会将此作为评论发表,但我没有足够的代表。)

编辑:在我看来,你的标签有问题。
我要做的第一件事是验证您的培训数据是否正确标记。它似乎只是将不同文件夹中的文件视为不同的标签。

代码似乎是正确的。这可能不是代码的问题,而是数据的问题。验证集的分布可能不同于训练集


为了验证,您应该用训练集的一部分替换who验证集,并运行代码以查看算法是否运行良好。如果这个“假”验证的准确性低,那就是代码的问题。否则,您应该考虑一种更好的分割数据的方法。代码似乎是正确的。这可能不是代码的问题,而是数据的问题。验证集的分布可能不同于训练集


为了验证,您应该用训练集的一部分替换who验证集,并运行代码以查看算法是否运行良好。如果这个“假”验证的准确性低,那就是代码的问题。否则,您应该考虑一种更好的分割数据的方法。问题在于cv2.imread()的字节顺序是蓝-绿-红,而ImageDataGenerator使用红-绿-蓝

解决方案:

def prepare_frame(frame):
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # <- correct byte order!!!
    frame = cv2.resize(frame, (150, 150))
    frame = np.expand_dims(frame, axis=0)
    frame = np.asarray(frame, dtype='int32')
    frame = frame / 255
    return frame
def prepare_帧(帧):

frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)#问题在于cv2.imread()的字节顺序是蓝绿色-红色,而ImageDataGenerator使用红绿色-蓝色

解决方案:

def prepare_frame(frame):
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # <- correct byte order!!!
    frame = cv2.resize(frame, (150, 150))
    frame = np.expand_dims(frame, axis=0)
    frame = np.asarray(frame, dtype='int32')
    frame = frame / 255
    return frame
def prepare_帧(帧):

frame=cv2.cvt颜色(frame,cv2.COLOR_BGR2RGB)#是的,你是对的。我已经添加了到原始问题的链接:“[ImageDataGenerator]():”…类列表将根据目录下的子目录名称/结构自动推断,其中每个子目录将被视为不同的类(映射到标签索引的类的顺序将是字母数字)。“是的,你是对的。我添加了原始问题的链接:标签应该由[ImageDataGenerator]处理():“…类列表将根据目录下的子目录名称/结构自动推断,其中每个子目录将被视为不同的类(类的顺序将映射到标签索引,将是字母数字顺序)。“我提供了一个答案,但我删除了它,在重新阅读问题后,我了解你做了什么,所以答案没有更新。我提供了一个答案,但我删除了它,在重新阅读问题后,我了解你做了什么,所以答案没有更新。谢谢你的评论。我使用了每个类别(猫、狗)随机选择的300张训练图像作为新的验证数据。这使得700张图像(每个类别)用于培训,300张用于验证。不幸的是,结果仍然是一样的:培训期间的准确率非常高,没有任何预测(培训)数据集。在这种情况下,我认为您的代码一定有问题,特别是在评估性能时。我目前认为这与训练20个图像的批处理和预测单个图像有关。这让我想知道为什么它与原始数据集一起工作-我正在调查。感谢您的评论。我使用了300个每个类别(猫、狗)随机选择的训练图像作为新的验证数据。这使得700个图像(每个类别)用于训练,300个用于验证。不幸的是,结果仍然相同:训练期间的准确率非常高,在同一个(训练)上没有任何预测数据集。在这种情况下,我认为您的代码一定有问题,特别是在评估性能时。我目前认为这与训练20幅图像的批处理和预测单个图像有关。这让我想知道为什么它与原始数据集一起工作-我正在调查。