使用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包的五个简单准则简介
Jun 15 Python
python if not in 多条件判断代码
Sep 21 Python
python编写Logistic逻辑回归
Dec 30 Python
python实现图片筛选程序
Oct 24 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
python 对字典按照value进行排序的方法
May 09 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
Python的bit_length函数来二进制的位数方法
Aug 27 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Django DRF APIView源码运行流程详解
Aug 17 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中list方法用法示例
2016/12/01 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
QQ登录简单实现代码
2021/03/09 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Numpy掩码式数组详解
2018/04/17 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
Python类中self参数用法详解
2020/02/13 Python
Python线程threading模块用法详解
2020/02/26 Python
django从后台返回html代码的实例
2020/03/11 Python
基于python实现坦克大战游戏
2020/10/27 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
社区党员志愿服务活动方案
2014/08/18 职场文书
2015年党员承诺书
2015/01/21 职场文书
部门2015年度工作总结
2015/04/29 职场文书
2015年工程部工作总结
2015/04/30 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
Python实现为PDF去除水印的示例代码
2022/04/03 Python