使用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 re模块介绍
Nov 30 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
提升Python程序性能的7个习惯
Apr 14 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
python列表返回重复数据的下标
Feb 10 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
python对XML文件的操作实现代码
Mar 27 Python
django 实现简单的插入视频
Apr 07 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
ASP.NET Core中的配置详解
Feb 05 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
php的文件上传入门教程(实例讲解)
2014/04/10 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
python解析xml模块封装代码
2014/02/07 Python
Python压缩和解压缩zip文件
2015/02/14 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
新手初学Java网络编程
2021/07/07 Java/Android
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS