我正在训练CNN将28x28 rgb图像分类为200个类别。 分类器在火车上达到〜95%的准确性。 通过截取屏幕快照,将roi裁剪并调整为28x28大小来获得测试图像。 此图像处理会导致训练图像和测试图像略有不同(附加示例)。 即使人眼几乎察觉不到这种差异,它也会对我的分类器造成极大的准确性下降。 我的分类器在火车上的准确率高达95%,但在测试组上只有约10%。 我开始将随机扰动应用于训练图像(模糊,像素化,噪声,平移,缩放),并开始模糊测试图像,但是测试精度仅得到了一点改善。
如何使我的分类器更健壮,以便将其归纳为轻微的像素差异?
这是我的网络
network = input_data(shape=[None, img_size[0], img_size[1], 3], name='input')
conv1 = relu(batch_normalization(
conv_2d(network, 16, 3, bias=False, activation=None, regularizer="L2"), trainable=is_training))
conv2 = relu(batch_normalization(
conv_2d(conv1, 32, 3, bias=False, activation=None, regularizer="L2"), trainable=is_training))
conv3 = relu(batch_normalization(
conv_2d(conv2, 64, 3, bias=False, activation=None, regularizer="L2"), trainable=is_training))
net = fully_connected(conv3, 128, activation='relu', regularizer="L2")
net = fully_connected(net, num_elements, activation='softmax')
return regression(net, optimizer='adam', learning_rate=learning_rate,
loss='categorical_crossentropy', name='target')
答案 0 :(得分:0)
200个类别很多。您确定某些内容没有在其他类别中占据主导地位吗?该模型不是一直在猜测“背景”,而是因为95%的图像都是“背景”,所以95%的时间都正确吗?
Pooling(从第335页起),例如通过最大池化,是将不变性引入小变换的一种方法。您应该尝试一下。 限制过拟合的其他方法是通过调整您已经在使用的L2正则化,向完全连接的层中添加压降以及不使minibatch大小过大。如果您认为合适的话,也可以将小轮换添加到正在执行的扩充列表中。如果您希望这种情况在现实世界中发生,也许也是随机的思考?我不认为这与增强有关。
最后我个人最喜欢的是人为错误。通常,当我看到这种奇怪的东西时,这只是我自己的错。您应该不止一次地遍历代码和中间变量。