paddle 深度学习cv七日训练营day2手势数字识别

终于到第二天了,我怀着一个兴奋的心情,然后看到题目我人傻了,我去,昨天还在画个图,今天直接叫我训练自己的模型,弄自己的网络了?我人裂开,今天老师教的是一个叫DNN的网络,然后和我说什么CNN,我又傻了,啥是DNN,啥是CNN呢,没关系我们可以去百度
其实我搜了一下DNN的概念并不陌生,叫深度神经网络(Deep Neural Networks),其实就是有很多层的网络,具体概念就不详细介绍了,因为我也是个半桶水乱晃,但是在这里老师介绍的感觉是一个全连接神经网络,至于这俩个有啥区别真的有点搞不清,在我理解中好像俩者是等价的,希望有明白的人能教一下小灰。

由于第一次,看到代码,因为之前一直对数据读取不熟练,对于paddle的API算是完全不知道,所以我对于整个老师给的其他部分代码都仔细看了,对于每个代码都认真去看了,虽然很多地方看不太懂,但是一个大致的流程感觉都会清楚很多,对此我的看法是虽然有些时候,就比如这次课程老师会给baseline,也就是基础代码,我们可以只改一下网络就可以让自己的跑的通了,但是这是万万不可的,因为到以后自己开发的时候,谁会给我们baseline?所以基础方面的东西得打牢固,下面给出我dnn的一个网络

class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN, self).__init__()
        self.hidden1 = Linear(100, 200,act='relu')
        self.hidden2 = Linear(200, 400,act='relu')
        self.hidden3 = Linear(400, 100, act='relu')
        self.hidden5 = Linear(3*100*100,10,act='softmax')

    def forward(self, input):
        x=self.hidden1(input)
        drop_1 = layers.dropout(x, dropout_prob=0.1)
        x = self.hidden2(drop_1)
        #x = fluid.layers.reshape(x, shape=[-1, 1000])
        drop_2 = layers.dropout(x, dropout_prob=0.2)
        x = self.hidden3(drop_2)

        x = fluid.layers.reshape(x,shape=[-1,3*100*100])
        y = self.hidden5(x)
        return y

我选择的是一个四层的一个网络,分享一些我的经验吧
首先,这个网络的大小不能太大,比如说1000+,效果其实并不好,直到今日我也学到,就是说包括我这个200 400的网络都并不是特别好,合适的网络大小才是关键
其次你会看到我加入了一些dropout来防止过拟合,防止过拟合是很有必要的
最后你的训练轮数也就是epoch不能太多,太多也会过拟合,太少就会训练不到位,可能有点像二次函数那样的一个凹形,我们得找到一个最优解,这也就是为什么调参玄学,如同炼丹哈哈哈。但是这个模型我无论如何怎么训练都上不了90%的正确率,虽然有大佬做到了hhh,于是我换了一个卷积神经网络的模型Lenet模型,但是实际实现起来,发现效果一般,和我这个low的一批的DNN差不多,后来我查阅资料,我的图片是100x100的,lenet是在对手写字也就是minst那个数据集效果很好,而他那个数据集的图片的大小是28x28,所以我猜测可能是我图片的大小不一致,于是我就换成了最近几年大火的Alexnet,他的输入图像是224x224,我认为可能会好一些

class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN, self).__init__()
        self.hidden1_1 = Conv2D(3, 56, 10, 3,act='relu')
        self.hidden1_2 = Pool2D(pool_size=3, pool_type='max', pool_stride=2)
        self.hidden2_1 = Conv2D(56, 128, 3, 1,act='relu')
        self.hidden2_2 = Pool2D(pool_size=2, pool_type='max', pool_stride=1)
        self.hidden3_1 = Conv2D(128, 256, 3, 1,act='relu')
        self.hidden3_2 = Conv2D(256, 512, 3, 1,act='relu')
        self.hidden3_3 = Conv2D(512, 512, 2, 2,act='relu')
        self.hidden3_4 = Pool2D(pool_size=2, pool_type='max', pool_stride=1)
        self.hidden5 = Linear(4608, 1152, act='relu')
        self.hidden6 = Linear(1152, 10, 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)
        d = self.hidden3_2(d)
        d = self.hidden3_3(d)
        d = self.hidden3_4(d)
        d = fluid.layers.reshape(d, shape=[-1, 4608])
        x = layers.dropout(x, dropout_prob=0.2)
        d = self.hidden5(d)
        d = layers.dropout(d, dropout_prob=0.1)
        y = self.hidden6(d)

        return y

最终我在测试集上的成功率达到了100
在这里插入图片描述
其实一开始的效果并不好,我认为是在图像大小和卷积核大小上不合适,于是我改变了卷积核的大小和标准的不太一样,这样的效果达到了100,我当时兴奋的叫了出来hhh,也许这就是炼丹的魅力吧。
说一点我在这次的收获,我在图片的大小和label的矩阵大小上面,调整了好久,我感觉还是得去认真查看人家的api文档,学习,一味的去猜测去测试会浪费很多时间

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值