经过了第二天的手势识别,用的是DNN 的网络,我在一开始还不知道使用CNN,于是我在第三天意识到,DNN在图像方面并不是很适合,我们需要应用CNN,也就是卷积神经网络,我观察图像,我发现其实图像其实很小,很像minst的那个数据集,于是我便采用了lenet,尝试在lenet下这个网络的效果如何,令我惊讶的是,我在一开始的正确率就能达到96%+的样子,这就让我很满意了,于是接下来我遇见的问题就是如何去优化这个网络
1.我一直在改变epoch的大小使其变得更加合适,我同时在调整epoch的时候观察loss的大小,这里我发现如果你利用loss画一幅折线图你就会看到很明显的一个loss变化,从而选择一个比较好的epoch
2.同时我在网络里加上了一些dropout,也就是随机丢掉一些了连接,使我们的网络防止过拟合。
3.炼丹大法好!!!
class MyLeNet(fluid.dygraph.Layer):
def __init__(self):
super(MyLeNet,self).__init__()
self.hidden1_1 = Conv2D(1,6,5,1,act="relu")
self.hidden1_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden2_1 = Conv2D(6,40,5,1,act="relu")
self.hidden2_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden3_1 = Conv2D(40,100,5,1,act="relu")
self.hidden4 = Linear(3600,360,act='relu')
self.hidden5 = Linear(360,65,act='softmax')
def forward(self,input):
x = self.hidden1_1(input)
a = self.hidden1_2(x)
b = self.hidden2_1(a)
c = self.hidden2_2(b)
d = self.hidden3_1(c)
x = fluid.layers.reshape(d, shape=[-1,360*10])
#x = layers.dropout(x, dropout_prob=0.1)
d = self.hidden4(x)
d = layers.dropout(d, dropout_prob=0.2)
#f = fluid.layers.reshape(d, shape=[-1,10*10*10])
y = self.hidden5(d)
return y