我一直在用紧密裁剪的印刷数字训练我的卷积神经网络,其风格类似于Mnist数据集。它运行良好,训练和测试数据接近100%。
起初我用四通道二进制图像训练它,其中白色是<255;&#39; 255&#39;并且黑色是&#39; 0&#39;。它有10个输出,每个数字一个,然后我用softmax来获得每个类别的概率。
但是,我想使用滑动窗口技术来分析一页数字。这是不可能的,因为对于一个完全白色的输入,它几乎可以回归100%它是一个4,而其他一切几乎没有。
我认为可能是神经网络在图像中的白色空间而不是黑色空间上进行训练,因为黑色像素的值为0,因此我将图像反转并再次训练网络。再次,它只会在完全白色的图像上恢复非常接近100%的信心。
对于两者,当图像完全变黑时,它会返回每个类的低百分比,尽管它仍然是最高的
我不理解这背后的直觉,所以任何帮助都会很棒,即使你可以说它不是通常的行为。这是预期的吗?我应该为那些没有数字的东西创建另一个类并对其进行训练吗?
继承我的神经网络: 它是完全卷积的,所以我可以用它实现快速滑动窗口,但最后的卷积相当于完全连接的层
class fully_convolutional_1channel(nn.Module):
def __init__(self):
super(fully_convolutional_1channel, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fconv1 = nn.Conv2d(16, 120, (4,2))
self.fconv2 = nn.Conv2d(120, 84, 1)
self.fconv3 = nn.Conv2d(84, 10, 1)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
#relu does not change size
x = self.pool(x)
x = self.pool(F.relu(self.conv2(x)))
#x = x.view(-1, 16 * 4 * 2)
x = F.relu(self.fconv1(x))
x = F.relu(self.fconv2(x))
x = self.fconv3(x)
#print(list(x.size))
return x
答案 0 :(得分:1)
我应该为那些不是数字的东西创建另一个类并在其上进行训练吗?
是。您的网络已经过培训,可以识别数字,而不是空格。您可以使用此策略重新训练网络,也可以预处理数字页面,以避免为网络提供空格。