tensorflow自定义激活函数实例


Posted in Python onFebruary 04, 2020

前言:因为研究工作的需要,要更改激活函数以适应自己的网络模型,但是单纯的函数替换会训练导致不能收敛。这里还有些不清楚为什么,希望有人可以给出解释。查了一些博客,发现了解决之道。下面将解决过程贴出来供大家指正。

1.背景

之前听某位老师提到说tensorflow可以在不给梯度函数的基础上做梯度下降,所以尝试了替换。我的例子时将ReLU改为平方。即原来的激活函数是 tensorflow自定义激活函数实例 现在换成 tensorflow自定义激活函数实例

单纯替换激活函数并不能较好的效果,在我的实验中,迭代到一定批次,准确率就会下降,最终降为10%左右保持稳定。而事实上,这中间最好的训练精度为92%。资源有限,问了对神经网络颇有研究的同学,说是激活函数的问题,然而某篇很厉害的论文中提到其精度在99%,着实有意思。之后开始研究自己些梯度函数以完成训练。

2.大概流程

首先要确定梯度函数,之后将其处理为tf能接受的类型。

2.1定义自己的激活函数

def square(x):
 return pow(x, 2)

2.2 定义该激活函数的一次梯度函数

def square_grad(x):
 return 2 * x

2.3 让numpy数组每一个元素都能应用该函数(全局)

square_np = np.vectorize(square)
square_grad_np = np.vectorize(square_grad)

2.4 转为tf可用的32位float型,numpy默认是64位(全局)

square_np_32 = lambda x: square_np(x).astype(np.float32)
square_grad_np_32 = lambda x: square_grad_np(x).astype(np.float32)

2.5 定义tf版的梯度函数

def square_grad_tf(x, name=None):
 with ops.name_scope(name, "square_grad_tf", [x]) as name:
 y = tf.py_func(square_grad_np_32, [x], [tf.float32], name=name, stateful=False)
 return y[0]

2.6 定义函数

def my_py_func(func, inp, Tout, stateful=False, name=None, my_grad_func=None):
 # need to generate a unique name to avoid duplicates:
 random_name = "PyFuncGrad" + str(np.random.randint(0, 1E+8))
 tf.RegisterGradient(random_name)(my_grad_func)
 g = tf.get_default_graph()
 with g.gradient_override_map({"PyFunc": random_name, "PyFuncStateless": random_name}):
 return tf.py_func(func, inp, Tout, stateful=stateful, name=name)

2.7 定义梯度,该函数依靠上一个函数my_py_func计算并传播

def _square_grad(op, pred_grad):
 x = op.inputs[0]
 cur_grad = square_grad(x)
 next_grad = pred_grad * cur_grad
 return next_grad

2.8 定义tf版的square函数

def square_tf(x, name=None):
 with ops.name_scope(name, "square_tf", [x]) as name:
 y = my_py_func(square_np_32,
   [x],
   [tf.float32],
   stateful=False,
   name=name,
   my_grad_func=_square_grad)
 return y[0]

3.使用

跟用其他激活函数一样,直接用就行了。input_data:输入数据。

h = square_tf(input_data)

over. 学艺不精,多多指教!

以上这篇tensorflow自定义激活函数实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python中while循环语句用法简单实例
May 07 Python
让python在hadoop上跑起来
Jan 27 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
python3实现磁盘空间监控
Jun 21 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
Python实现带下标索引的遍历操作示例
May 30 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 #Python
pytorch梯度剪裁方式
Feb 04 #Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 #Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 #Python
python求一个字符串的所有排列的实现方法
Feb 04 #Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 #Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 #Python
You might like
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
浅谈vue父子组件怎么传值
2018/07/21 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python基础之文件读取的讲解
2019/02/16 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
《从现在开始》教学反思
2014/04/15 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
领导参观欢迎词
2015/01/26 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL