使用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  __getattr__与__setattr__使用方法
Sep 06 Python
下载给定网页上图片的方法
Feb 18 Python
Python 时间操作例子和时间格式化参数小结
Apr 24 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
理解Python中的With语句
Feb 02 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
基于python实现计算两组数据P值
Jul 10 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
设定php简写功能的方法
2019/11/28 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python制作小说爬虫实录
2017/08/14 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
违反课堂纪律检讨书
2014/01/19 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
教师一帮一活动总结
2014/07/08 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
导游词之西递宏村
2019/12/10 职场文书