使用keras时input_shape的维度表示问题说明


Posted in Python onJune 29, 2020

Keras提供了两套后端,Theano和Tensorflow,不同的后端使用时维度顺序dim_ordering会有冲突。

对于一张224*224的彩色图片表示问题,theano使用的是th格式,维度顺序是(3,224,224),即通道维度在前,Caffe采取的也是这种方式。而Tensorflow使用的是tf格式,维度顺序是(224,224,3),即通道维度在后。

Keras默认使用的是Tensorflow。我们在导入模块的时候可以进行查看,也可以切换后端。

使用keras时input_shape的维度表示问题说明

为了代码可以在两种后端兼容,可以通过data_format参数进行维度顺序的设定,data_format='channels_first',对应“th”,data_format='channels_last',对应“tf”。

补充知识:Tensorflow Keras 中input_shape引发的维度顺序冲突问题(NCHW与NHWC)

以tf.keras.Sequential构建卷积层为例:

tf.keras.layers.Conv2D(10, 3, input_shape=(2, 9, 9),padding='same',activation=tf.nn.relu,kernel_initializer='glorot_normal', bias_initializer='glorot_normal'),

这是一个简单的卷积层的定义,主要看input_shape参数:

这是用来指定卷积层输入形状的参数,由于Keras提供了两套后端,Theano和Tensorflow,不同的后端使用时对该参数所指代的维度顺序dim_ordering会有冲突。

Theano(th):

NCHW:顺序是 [batch, in_channels, in_height, in_width]

Tensorflow(tf):keras默认使用这种方式

NHWC:顺序是 [batch, in_height, in_width, in_channels]

即对于上述input_shape=(2, 9, 9)来说:我们先忽略batch,2会被解析为通道数,矩阵大小为9*9,符合我们预期。而tf会将矩阵大小解析为2 * 9 ,且最后一位9代表通道数,与预期不符。

解决

法一:

在卷积层定义中加入参数来让keras在两种后端之间切换:

data_format='channels_first':代表th

data_format='channels_last':代表tf

但是该法在某些时候不成功会报错:

或许是cpu电脑导致的,只支持NHWC即tf模式。

只能修改相应文件的配置来使其支持NCHW,参考这里

法二:(推荐)

使用tf.transpose函数进行高维数据的转置(维度大于2,轴的转换)

如将上述(2,9,9)转为(9,9,2)并且是以2为通道数,即矩阵为9*9,而不是像reshape函数简单的调整维度,若使用reshape函数来转换,只会得到通道数为9,矩阵为9 * 2的数据。

tf.transpose(待转矩阵,(1,2,0))

解释:

​ 其中0,1,2…是原矩阵维度从左到右轴的标号,即(2,9,9)中三个维度分别对应标号0,1,2。而调整过后将标号顺序变为1,2,0 即是把表通道数的轴置于最后,这样转置后的矩阵就满足了keras的默认tf后端。即可正常训练。

以上这篇使用keras时input_shape的维度表示问题说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Python实现Const详解
Jan 27 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
python 换位密码算法的实例详解
Jul 19 Python
Python使用sorted排序的方法小结
Jul 28 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
python实现猜数字游戏
Mar 25 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
Python编程编写完善的命令行工具
Sep 15 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 #Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 #Python
Python建造者模式案例运行原理解析
Jun 29 #Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 #Python
Python根据指定文件生成XML的方法
Jun 29 #Python
keras在构建LSTM模型时对变长序列的处理操作
Jun 29 #Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 #Python
You might like
php操作memcache缓存方法分享
2015/06/03 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
node.js实现端口转发
2016/04/14 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
node.js环境搭建图文详解
2018/09/19 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python json模块使用实例
2015/04/11 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
老生常谈python中的重载
2018/11/11 Python
python实现简易数码时钟
2021/02/19 Python
3分钟学会一个Python小技巧
2018/11/23 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Python多线程thread及模块使用实例
2020/04/28 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
伦敦一卡通:The London Pass
2018/11/30 全球购物
高二美术教学反思
2014/01/14 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
教师素质教育心得体会
2016/01/19 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang