使用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实现文件路径和url相互转换的方法
Jul 06 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
对python多线程与global变量详解
Nov 09 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
Python面向对象原理与基础语法详解
Jan 02 Python
Python定义一个函数的方法
Jun 15 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
理解javascript对象继承
2016/04/17 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python实现的RSS阅读器实例
2015/07/25 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
python基于SMTP协议发送邮件
2019/05/31 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
详解rem 适配布局
2018/10/31 HTML / CSS
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
毕业生个人投资创业计划书
2014/01/04 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
交通安全教育主题班会
2015/08/12 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
python实现简单聊天功能
2021/07/07 Python
MySQL8.0的WITH查询详情
2021/08/30 MySQL
MySQL之select、distinct、limit的使用
2021/11/11 MySQL