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爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
解决python opencv无法显示图片的问题
Oct 28 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
python读取文件指定行内容实例讲解
Mar 02 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
Python离线安装各种库及pip的方法
Nov 28 Python
python 写一个文件分发小程序
Dec 05 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 cookie使用方法学习笔记分享
2013/11/07 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
学习ExtJS Window常用方法
2009/10/07 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
介绍一下sql server的安全性
2014/08/10 面试题
大学生年度个人总结
2015/02/15 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript