博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于深度学习中优化问题的一些感受
阅读量:7180 次
发布时间:2019-06-29

本文共 2054 字,大约阅读时间需要 6 分钟。

hot3.png

    本人刚开始接触深度学习,可以写一些简单的CNN网络,目前使用到的语言是python基础,搭配Pytorch框架,在一段时间内感到对深度学习的困惑,不知道进一步学习的方向。

在学习深度学习之前,无数的人告诉我,数学是学习深度学习的基础,不会就很麻烦,需要补。对于我个人来说,数学要是能学会,我又何必学习深度学习?于是各种尝试如何在数学基础一般的情况下,熟悉深度学习。

Don't BB ,show me the code!

就不!你咬我啊?

从CNN开始,不理解数学,硬写!写了一遍又一遍,把网络模型每一行都熟悉,抠除掉无关代码和核心框架,发现了网络模型的套路:

1、读取数据集,并进行数据预处理;

2、构建合适的网络模型,训练数据;

3、调用优化器(感知器),进行参数优化;

4、反向传播,更新参数,进行新一轮数据测试;

5、评估网络模型的准确率。

就在此时,看到了大神写的CNN,居然发现了其中可以优化的地方(PS:别问我为什么要优化,还不是因为设计的模型准确率不高、适应性不强):

首先可以优化的地方是参数:学习率、批数(btch_size),结果效果不怎么明显;

其次优化的是网络模型,涉及到的主要是网络模型的层数和激活函数,卷积层中可以设置的又主要是卷积核数、步长值、填充,激活函数主要是函数的选择上;

到此,一般的深度学习的科普工作就完成了,已经可以自己动手设计自己的网络模型了,有没有很兴奋?

那么,如果你目前没有深度学习的项目时,你就会迷茫,不知道下一步的工作在哪里。

经过一段时间的沉默,也是因为大神的指导,要想进一步优化,需要更改网络模型中常见函数的设置,即函数的优化。

在这,你有没有想明白为什么一开始说学习深度学习,要学习数学呢?

在这里,深度学习涉及到的数学知识就开始体现了,线代、概率、矩阵论、离散、运筹等等,各种预苦无泪啊,数学不好。

也许是运气太好了,我又遇见深度学习上的另一位大神,神说,对于计算机来说,数学是工具、是基础,那么对于数学来说,计算机也是工具、是基础。理解代码,就能理解数学。

在这样的指导下,再次回头去看自己写的代码,从中找到目前可以做的工作,对比激活函数的区别,进行网络模型优化:

SGD(随机梯度下降):

Momentum(在SGD的基础上,加载梯度下降的动量):

RMSprop:

Adam:

然而,真正地,准确率更高的这些个网络模型的核心就是这里的区别,自己设计的激活函数和感知器。剩下的先不说了,给放个代码感受下最简单的感知器的设计:

# -*-coding:utf-8-*-# 自定义SGN感知器import numpy as npa = 0.3x = np.array([[1, 1, 3], [1, 2, 5], [1, 1, 8], [1, 2, 15], [1, 3, 7], [1, 4, 29]])d = np.array([1, 1, -1, -1, 1, -1])w = np.array([1, 0, 0])def sgn(v):    if v >= 0:        return 1    else:        return -1def comy(myw, myx):    return sgn(np.dot(myw.T, myx))def neww(oldw, myd, myx, a):    pred = comy(oldw, myx)    print(oldw + a * (myd - pred) * myx)    return oldw + a * (myd - pred) * myxfor i in range(len(x)):    w = neww(w, d[i], x[i], a)    print("%d or %d" % (x[i][1], x[i][2]), comy(w, x[i]))test1 = np.array([1, 9, 19])print(comy(w, test1))test = [1, 9, 64]print(comy(w, test))test=[1,5,11]print(comy(w,test))

这其实就是一个机器学习的小例子,但是如你所愿,在没有学习太多数学的前提下,你已经完成了一小部分深度学习及其优化的问题。

分析上面的小例子,可以看出在每一步骤都可以找到一组优化后的参数组W,也了解了深度学习以矩阵为载体所进行的优化,那么我们接下来把自己做的以手写体和caifa10等数据集为数据源的卷积神经网络,我们尝试在过程中使用numpy包把多维数据变成一维数据进行计算,可以看到参数究竟是怎么优化的,所以当你自己再去设计网络模型的时候,就可以从底层设计感知器和激活函数了。

好吧,编不下去了,因为我的理解也就先到这了,如果对你有用,记得点个赞。

转载于:https://my.oschina.net/aisi746467512/blog/1837576

你可能感兴趣的文章
[每日一题] 11gOCP 1z0-052 :2013-09-7 The usage of the SQL*LOAD utility.............................
查看>>
我的友情链接
查看>>
async & await 的前世今生(Updated)
查看>>
揭开云“误”山的面纱
查看>>
Lua5.0 词法分析
查看>>
Solutions Log (2014-08)
查看>>
Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解...
查看>>
ElasticSearch(七)之elasticsearch集群搭建及参数详解
查看>>
Rails best practices
查看>>
Solaris 测试bonding的网卡是否可以 failover
查看>>
Ubuntu16.04 PPTP Server Setting
查看>>
你应该知道的16个Linux服务器监控命令
查看>>
Cisco Voip实验
查看>>
SonarQube集成到Eclipse中
查看>>
centos7 iptables 外网地址轮训
查看>>
dstat 好用的监控工具
查看>>
linux 输入错误命令 删除键显示^H 解决办法
查看>>
可编程继电器模块应用程序之定时催款
查看>>
grep与egrep用法详解,与正则表达式的使用
查看>>
数据流手法隐藏文件
查看>>