使用K.function()调试keras操作


Posted in Python onJune 17, 2020

Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都需要提前定义好网络的结构,也就是常说的“计算图”。

在运行前需要对计算图编译,然后才能输出结果。那这里面主要有两个问题,第一是这个图结构在运行中不能任意更改,比如说计算图中有一个隐含层,神经元的数量是100,你想动态的修改这个隐含层神经元的数量那是不可以的;第二是调试困难,keras没有内置的调试工具,所以计算图的中间结果是很难看到的,一旦最终输出跟预想不一致,很难找到问题所在。

这里谈一谈本人调试keras的一些经验:

分阶段构建你的神经网络

不要一口气把整个网络全部写完,这样很难保证中间结果的正确性。加如一个CNN文本分类模型是这样的(如下代码),应该在加了Embedding层后,停止,打印一下中间结果,看看跟embedding向量能不能对上,输出的shape对不对。对上了再进行下一步操作。

有的人觉得这样很浪费时间,但是除非你能一遍写对,否则你将花上5倍的时间发现错误。

# model parameters:
 embedding_dims = 50
 cnn_filters = 100
 cnn_kernel_size = 5
 dense_hidden_dims = 200
 model = Sequential()
 model.add(Embedding(nb_words,embedding_dims,input_length=maxlen))
 model.add(Dropout(0.5))
 model.add(Conv1D(cnn_filters, cnn_kernel_size,padding='valid', activation='relu'))
 model.add(GlobalMaxPooling1D())
 model.add(Dense(dense_hidden_dims))
 model.add(Dropout(0.5))
 model.add(Activation('relu'))
 model.add(Dense(1))
 model.add(Activation('sigmoid'))
 return model

使用K.function()函数打印中间结果

function函数可以接收传入数据,并返回一个numpy数组。使用这个函数我们可以方便地看到中间结果,尤其对于变长输入的Input。

下面是官方关于function的文档。

function

keras.backend.function(inputs, outputs, updates=None)

实例化 Keras 函数。

参数

inputs: 占位符张量列表。

outputs: 输出张量列表。

updates: 更新操作列表。

**kwargs: 需要传递给 tf.Session.run 的参数。

返回

输出值为 Numpy 数组。

异常

ValueError: 如果无效的 kwargs 被传入。

example

下面这个例子是打印一个LSTM层的中间结果,值得注意的是这个LSTM的sequence是变长的,可以看到输出的结果sequence长度分别是64和128

import keras.backend as K
 from keras.layers import LSTM, Input
 import numpy as np
 
 I = Input(shape=(None, 200)) 
 lstm = LSTM(20, return_sequences=True)
 f = K.function(inputs=[I], outputs=[lstm(I)])
 
 data1 = np.random.random(size=(2, 64, 200)) 
 print(f([data1])[0].shape)
 
 data2 = np.random.random(size=(2, 128, 200)) 
 print(f([data2])[0].shape)
 
 K.clear_session()
 
 # (2, 64, 20)
 # (2, 128, 20)

其他的调试技巧

有频繁张量变换操作的,如dot, mat, reshape等等,记得加一行形状变化的注释,如(100, 128)--> (100, 64)

可以使用tensorboard查看网络的参数情况

确保你的数据没有问题,很多时候输出不对不是神经网络有问题,而是数据有问题

以上这篇使用K.function()调试keras操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的中国剩余定理算法示例
Aug 05 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
python文件拆分与重组实例
Dec 10 Python
QML使用Python的函数过程解析
Sep 26 Python
pytorch实现线性拟合方式
Jan 15 Python
Pytest mark使用实例及原理解析
Feb 22 Python
python批量修改xml属性的实现方式
Mar 05 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
vscode调试django项目的方法
Aug 06 Python
python 实现超级玛丽游戏
Nov 25 Python
哪些是python中web开发框架
Jun 17 #Python
python如何处理程序无法打开
Jun 16 #Python
python模块如何查看
Jun 16 #Python
python实现PDF中表格转化为Excel的方法
Jun 16 #Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 #Python
结束运行python的方法
Jun 16 #Python
深入理解Python 多线程
Jun 16 #Python
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
DISCUZ 分页代码
2007/01/02 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
用js重建星际争霸
2006/12/22 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python模块之re正则表达式详解
2017/02/03 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Flask之请求钩子的实现
2018/12/23 Python
pandas中的series数据类型详解
2019/07/06 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
采购部主管岗位职责
2014/01/01 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
伊琍体标语
2014/06/25 职场文书
新兵入伍心得体会
2014/09/04 职场文书
2014年路政工作总结
2014/12/10 职场文书
2014年底个人工作总结
2015/03/10 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
离婚代理词范文
2015/05/23 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js