使用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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
python中二维阵列的变换实例
Oct 09 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
总结Python中逻辑运算符的使用
May 13 Python
python3序列化与反序列化用法实例
May 26 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
Python创建xml文件示例
Mar 22 Python
Python元组常见操作示例
Feb 19 Python
详解python的四种内置数据结构
Mar 19 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
python 字典和列表嵌套用法详解
Jun 29 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/05 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
js评分组件使用详解
2017/06/06 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
python实现ID3决策树算法
2017/12/20 Python
python表格存取的方法
2018/03/07 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
python绘制封闭多边形教程
2020/02/18 Python
python3 使用traceback定位异常实例
2020/03/09 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
工程采购员岗位职责
2014/03/09 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
婚礼父母答谢词
2015/01/04 职场文书
社区义诊通知
2015/04/24 职场文书
基层组织建设年活动总结
2015/05/09 职场文书