- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个验证精度非常高(> 99%)的模型,当针对原始训练或验证集中不存在的图像(即用我的智能手机拍摄的照片)运行时,该模型会失败。
我一直觉得学习任何新技术都必须经历磨难。为此(在阅读和观看大量机器学习教程之后),我创建并标记了大约 25,000 张图像,并将它们输入到我的 CNN 中(大部分抄袭自 CIFAR-10 示例)。
这些图像(我纽约街区的建筑物)是从 GoPro 和我的 Android 手机拍摄的视频中获取的。每个帧都被转换为全尺寸(原始分辨率)jpeg 文件。
图像被标记并组织成目录结构,其中每个子目录对应于图像的地址(标签)(100MainSt、102MainSt 等)。这是为了允许与 Keras 的“flow_from_directory”功能无缝集成。请注意,给定的目录/标签包含 Android 和 GoPro 图像。
然后使用 sklearn
train_test_split
函数将数据划分 (80/20) 为训练数据和验证数据。
我使用 Adam 优化器运行模型,损失函数为 categorical_crossentropy,学习率为 1e-6,每个图像缩小到 300x300(由于我的 GPU 内存限制)。经过 70 多个 epoch 后,我的验证准确率为 99.2%,损失为 0.0383。还不错(至少我是这么认为的)。
现在是我的问题:当我用手机拍照(静态照片,而不是上面视频中的帧)并通过我的模型输入它们时,性能很糟糕,12 张图像中有 7 张不正确分类。当我通过模型运行(由我自己)随机选择的训练或验证图像(从上面)时,它效果很好,这正是我所期望的。这向我表明,我对输入图像所做的转换(缩小、转置、转换为 numpy 数组等)在所有情况下都是相同且正确的。
我可以看到用于训练和验证的视频采集图像与静态图像(又称快照)之间唯一显着的区别是分辨率。快照的分辨率明显更高,但我认为这并不重要,因为所有图像都缩小到 300x300。
任何见解或想法将不胜感激(并且可能对 future 的旅行者有帮助),因为我完全困惑为什么这不起作用。
我的代码的核心:
model = Sequential()
filters = 32
model.add(Conv2D(filters, (3, 3), padding='same', input_shape=(image_width, image_height, 3)))
model.add(Activation('relu'))
model.add(Conv2D(filters, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters*2, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(filters*2, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(filters*16))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(len(classes)))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=opts[opt],
metrics=['accuracy'])
拟合、标准化和预测:
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
training_dir,
target_size=(image_width, image_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True
)
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(image_width, image_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True
)
hist = model.fit_generator(
train_generator,
steps_per_epoch=train_generator.samples//batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_generator.samples//batch_size,
use_multiprocessing=True,
workers=8,
callbacks=[early_stopping, time_callback]
)
pred = model.predict_generator(validation_generator, workers=8, use_multiprocessing=True, verbose=1)
以及我用来测试单个(快照)图像的代码:
#... Use with snapshots (may need to be rotated)
# image = Image.open(image_file).convert("RGB").rotate(-90).resize((width, height))
#... Use with images scraped from video (either GoPro or Android)
image = Image.open(image_file).convert("RGB").resize((width, height))
img = np.array(image)
r = img[:,:,0]
g = img[:,:,1]
b = img[:,:,2]
npimages = np.array([[r] + [g] + [b]], np.uint8)
npimages = npimages.transpose(0,2,3,1)
classes = model.predict_classes(npimages)
prediction = model.predict(npimages, verbose=2)
print(prediction)
print(classes)
print(label_map[classes[0]])
plt.imshow(img)
最佳答案
恐怕视频数据往往具有很强的相关性。也就是说,虽然 1 分钟的视频转换为 60 秒的 30 fps (1800) 图像,但它们大多数都非常相似。这是相同的场景,“相同”的照明条件,相同的汽车或路过的人。
如果您的验证图像数据与测试数据来自相同的视频序列,您将获得很高的准确性(接近 100%!),但这与训练数据的测试类似。它是过度拟合的,并且验证集与测试集足够相似,因此准确性很高。退出可能会有所帮助,但如果您的数据集强相关,则没有帮助。
从好的方面来说,您的编码可能是有效的!
修复?更多数据可能是您的最佳途径。即使它是在不同日期(不同的汽车、人物、天气等)拍摄的更多视频数据。抱歉 - 我知道给事物贴上标签需要做很多工作。或者,也许可以尝试根据您的数据微调预先训练的网络。
关于python-3.x - Keras/Tensorflow 模型适用于验证图像,但不适用于真实世界数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48652113/
在 unsafeDupablePerformIO 的定义( source 、 docs )中,我找到了对唯一的 realWorld# 的引用。所以我想知道所有这些以 # 结尾的函数或值是在哪里定义的?
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 5 年前。 Improve
在现代 v8 Javascript 中,String.prototype.slice 的算法复杂度是多少? 明确地说,我正在寻找真实世界的实用数据或经验法则。 快速测试 我试图通过在最新的 Chrom
我正在阅读文章 Double-checked locking and the Singleton pattern ,关于如何破坏双重检查锁定,以及 Stack Overflow 上的一些相关问题。 我
Goerzen 等人 present CSV 文件解析器的简单实现,用于向 Real World Haskell 的读者介绍 Parsec 解析组合器库。 这是他们的简洁程序的一个版本: import
ResultBox1->Text = (sin(TextBox1->Text)) * TextBox2->Text 这就是我想要的工作,但我正在处理字符串 我似乎无法转换字符串,进行触发,然后转换回字
我想验证给定的字符串是 URL。匹配文本中的 URL 也很好,但不是必需的。我已经搜索并进行了实验,但到目前为止,我还没有找到可以满足这些要求的东西: 不得接受在被视为链接时会带来安全风险的字符串。例
在第3章,有一个例子叫“MySecond.hs”,我真的不明白是这样的代码: safeSecond :: [a] -> Maybe a 它总是在文件的第一行,删除它不会造成任何麻烦。任何人都可以启发我
我正在尝试使用 HTML Canvas 表示 LED 矩阵的闪烁。对我来说重要的是,每个 LED 的尺寸和它们之间的距离代表它们在现实世界中的真实尺寸(例如,以毫米为单位)。 如果我为一台计算机找到一
根据another question ,现实世界 Haskell 的部分内容现已过时。我只学习了第 5 章,但在将一个简单示例编译为可执行二进制文件时遇到问题。 给出了两个模块: module Sim
我正在尝试通过 mentioned chapter 。在阅读和思考练习时,我遇到了一些困难。 首先,fill 和 nest 函数的签名不应该是 :: Int -> Doc -> String 吗?我认
第 3 章定义了以下递归类型来表示二叉树: data Tree a = Node a (Tree a) (Tree a) | Empty deriv
这个问题不是重复的 A question with the same title already exists ,但 answer在我看来,只部分解决了它,我也对它没有解决的问题感兴趣。 前言 真实世
我是一名优秀的程序员,十分优秀!