使用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中urllib2模块的8个使用细节分享
Jan 01 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
Django开发中的日志输出的方法
Jul 02 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python如何删除文件中重复的字段
Jul 16 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 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变量可用字符
2014/05/28 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
解析javascript 实用函数的使用详解
2013/05/10 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
英国工具中心:UK Tool Centre
2017/07/10 全球购物
《傅雷家书》教学反思
2014/04/20 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle