使用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引用模块和查找模块路径
Mar 17 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
浅谈flask源码之请求过程
Jul 26 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
Python 分享10个PyCharm技巧
Jul 13 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
python同步windows和linux文件
Aug 29 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
python实现连连看游戏
Feb 14 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Python Process创建进程的2种方法详解
Jan 25 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 获取百度的热词数据的代码
2012/02/18 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
2020/05/11 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
行政部主管岗位职责
2013/12/28 职场文书
在校学生职业规划范文
2014/01/08 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
环保志愿者活动总结
2014/06/27 职场文书
可怜妈妈观后感
2015/06/09 职场文书
旅行社计调工作总结
2015/08/12 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
如何写好开幕词?
2019/06/24 职场文书
mysql函数全面总结
2021/11/11 MySQL