我怎样才能在测试集上达到 80% 以上
How can I achieve better than 80% on the test set
我的目标是检测随机背景中 0 到 9 的数字。我编写了一个具有以下功能的数据集生成器:
- 灰度数据
- 随机数字旋转
- 随机数字模糊
- 43 种不同的字体
- 随机噪声模糊背景
这是我的数据集的 1024 个样本:
1024 testset samples
我采用了 mnist 专家模型来训练数据集,并在训练集和验证集上获得了几乎 100% 的准确率。
在测试集上,我得到大约 80% 的正确率。
这是一个示例。绿色数字是预测的数字:
9 predicted as 5
看来我的模型区分起来有些麻烦
1 和 7
8 和 3
9 和 6
5 和 9
我需要检测任何背景上的数字,因为测试图像并不总是二进制图像。
现在我的问题:
对于测试集生成器:
应用数字旋转有多大用处?当我旋转 7 然后我得到一些字体的 1。当我旋转 9 时得到 6(旋转 > 90°)
卷积滤波器是否已经处理图像旋转?
180'000 个图像样本是否足以训练模型?
对于模型:
当我对数据集应用模糊滤镜时,是否应该将图像大小从 28x28 增加到 56x56?
我应该使用多大尺寸的过滤器?
我必须增加隐藏层的数量吗?
非常感谢您的指导。
如果您受困于不同的图像背景,我建议您尝试图像过滤,假设您的图像质量良好,这会将您的图像变成与前景相同的背景。
试试这个(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))
我的目标是检测随机背景中 0 到 9 的数字。我编写了一个具有以下功能的数据集生成器:
- 灰度数据
- 随机数字旋转
- 随机数字模糊
- 43 种不同的字体
- 随机噪声模糊背景
这是我的数据集的 1024 个样本: 1024 testset samples
我采用了 mnist 专家模型来训练数据集,并在训练集和验证集上获得了几乎 100% 的准确率。
在测试集上,我得到大约 80% 的正确率。 这是一个示例。绿色数字是预测的数字:
9 predicted as 5
看来我的模型区分起来有些麻烦
1 和 7
8 和 3
9 和 6
5 和 9
我需要检测任何背景上的数字,因为测试图像并不总是二进制图像。
现在我的问题:
对于测试集生成器:
应用数字旋转有多大用处?当我旋转 7 然后我得到一些字体的 1。当我旋转 9 时得到 6(旋转 > 90°)
卷积滤波器是否已经处理图像旋转?
180'000 个图像样本是否足以训练模型?
对于模型:
当我对数据集应用模糊滤镜时,是否应该将图像大小从 28x28 增加到 56x56?
我应该使用多大尺寸的过滤器?
我必须增加隐藏层的数量吗?
非常感谢您的指导。
如果您受困于不同的图像背景,我建议您尝试图像过滤,假设您的图像质量良好,这会将您的图像变成与前景相同的背景。
试试这个(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))