如何在测试集上达到优于80%的效果

时间:2017-06-09 11:54:54

标签: tensorflow deep-learning mnist

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

  • 灰度数据
  • 随机数字旋转
  • 随机数字模糊
  • 43种不同的字体
  • 随机嘈杂模糊背景

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

我调整了mnist专家模型来训练数据集,几乎100%在火车和验证集上。

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

9 predicted as 5

似乎我的模型有一些麻烦要区分

  • 1和7

  • 8和3

  • 9和6

  • 5和9

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

现在我的问题:

对于testset生成器:

  • 应用数字轮换有多大用处?当我旋转7然后我得到1为一些字体。当我旋转9时,我得到6(旋转> 90°)

  • 卷积滤镜是否已经处理了图像旋转?

  • 180'000图像样本是否足以训练模型?

对于模型:

  • 当我将模糊滤镜应用到数据集时,是否应该将图像尺寸从28x28增加到56x56?

  • 我应该使用哪种过滤器尺寸?

  • 我是否必须增加隐藏图层的数量?

非常感谢任何指南。

2 个答案:

答案 0 :(得分:0)

如果您遇到不同的图像背景,我建议您尝试图像过滤,这会将您的图像转换为相同的前景背景,假设您的图像具有良好的品质。

试试这个(scikit-image library):

将numpy导入为np

从skimage导入过滤器作为flt

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

然后,您可以将过滤后的图像用于训练和预测。

答案 1 :(得分:0)

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

这是一个有效但不那么高效的实现,它允许我们定义形状和步幅:

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,其中image是一个numpy数组

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