我怎样才能在测试集上达到 80% 以上

How can I achieve better than 80% on the test set

我的目标是检测随机背景中 0 到 9 的数字。我编写了一个具有以下功能的数据集生成器:

这是我的数据集的 1024 个样本: 1024 testset samples

我采用了 mnist 专家模型来训练数据集,并在训练集和验证集上获得了几乎 100% 的准确率。

在测试集上,我得到大约 80% 的正确率。 这是一个示例。绿色数字是预测的数字:

9 predicted as 5

看来我的模型区分起来有些麻烦

我需要检测任何背景上的数字,因为测试图像并不总是二进制图像。

现在我的问题:

对于测试集生成器:

对于模型:

非常感谢您的指导。

如果您受困于不同的图像背景,我建议您尝试图像过滤,假设您的图像质量良好,这会将您的图像变成与前景相同的背景。

试试这个(scikit 图像库):

将 numpy 导入为 np

从 skimage 导入过滤器作为 flt

filtered_image = np.array(original_image > flt.threshold_li(original_image))

然后您可以使用过滤后的图像进行训练和预测。

我最终从现有图像中提取了数据集补丁,而不是使用带有随机数字的随机背景。这使我们在测试集上的方差更小,准确性更高。

这是一个有效但性能不佳的实现,它允许我们定义形状和步幅大小:

def patchify(self, arr, shape, stride):
    patches = []
    arr_shape = arr.shape
    (shape_h, shape_w) = shape
    (stride_h, stride_w) = stride
    num_patches = np.floor(np.array(arr_shape)/np.array(stride))
    (num_patches_row, num_patches_col) = (int(num_patches[0]), int(num_patches[1]))

    for row in range(num_patches_row):
        row_from = row*stride_h
        row_to = row_from+shape_h

        for col in range(num_patches_col):
            col_from = col * stride_w
            col_to = col_from + shape_w

            origin_information = (row_from,row_to, col_from,col_to)
            roi = arr[row_from:row_to, col_from:col_to]
            patches.append((roi, origin_information))
    return patches

或者我们也可以使用 scklearn,其中图像是一个 numpy 数组

patches = image.extract_patches_2d(image, (patch_height, patch_width))