使用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抓取网页图片并放到指定文件夹
Apr 24 Python
python使用点操作符访问字典(dict)数据的方法
Mar 16 Python
python中正则的使用指南
Dec 04 Python
Python实现k-means算法
Feb 23 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Python代码块及缓存机制原理详解
Dec 13 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
python 用struct模块解决黏包问题
Nov 07 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安全配置方法
2007/06/16 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
python入门教程之识别验证码
2017/03/04 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
实习单位鉴定评语
2014/04/26 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
python 提取html文本的方法
2021/05/20 Python
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
MongoDB支持的索引类型
2022/04/11 MongoDB