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/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
浅析python标准库中的glob
Mar 13 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
pandas数据拼接的实现示例
Apr 16 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
python3跳出一个循环的实例操作
Aug 18 Python
python如何设置静态变量
Sep 07 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 Python
python statsmodel的使用
Dec 21 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实现文件编码批量转换
2014/03/10 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
JS判断不能为空实例代码
2013/11/26 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
Python 条件判断的缩写方法
2008/09/06 Python
python调用java的Webservice示例
2014/03/10 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
实例解析Python中的__new__特殊方法
2016/06/02 Python
Python实现的矩阵类实例
2017/08/22 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
请说出以下代码输出什么
2013/08/30 面试题
本科生学习总结的自我评价
2013/10/02 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers