解决Keras中CNN输入维度报错问题


Posted in Python onJune 29, 2020

想要写分类器对图片进行分类,用到了CNN。然而,在运行程序时,一直报错:

ValueError: Negative dimension size caused by subtracting 5 from 1 for ‘conv2d_1/convolution' (op: ‘Conv2D') with input shapes: [?,1,28,28], [5,5,28,30].

这部分提到的代码是这样的,这是我的分类器的输入层:

model.add(Conv2D(30,(5, 5), input_shape=(1, 28, 28), activation='relu',padding="valid"))

问题出在input_shape上,报错的大意就是我的输入的维度是错误的。

百思不得其解,在Stackoverflow上找到了答案:

Keras的图片处理文档中给出:

dim_ordering: One of {“th”, “tf”}. “tf” mode means that the images should have shape (samples, height, width, channels), “th” mode means that the images should have shape (samples, channels, height, width). It defaults to the image_dim_ordering value found in your Keras config file at ~/.keras/keras.json. If you never set it, then it will be “tf”.

翻译过来意思就是:关于图片的维度顺序有两种类型,分别是“th”和”tf“,它们的差别如下:

图片维序类型为 th 时(dim_ordering='th'): 输入数据格式为[samples][channels][rows][cols];

# 图片维序类型为 tf 时(dim_ordering='tf'): 输入数据格式为[samples][rows][cols][channels];

在Keras里默认的是“tf”顺序,如果想要改为“th”顺序,需要手动在前面加上如下代码:

from keras import backend as K

K.set_image_dim_ordering('th')

现在回头看我的输入维度顺序,显然是用了th的格式,

model.add(Conv2D(30,(5, 5), input_shape=(1, 28, 28), activation='relu',padding="valid"))

所以,程序一定会报错。

于是在建立模型前加入了前面提到的代码。

至此,该问题解决。

补充知识:Keras一维卷积维度报错

在使用Keras维度报错的时候很有可能是因为在池化层出错。卷积层里面的维度一般都是3维数据,但是在池化是如果设置是这样的,那么输出的就是二维数据:

model.add(Conv1D(filters=23, kernel_size=4, activation='relu'))

model.add(AveragePooling1D())

如果下面接的还是卷积层的话,这样的池化输出是会报错的,这个时候就需要让池化层的输出为3维,这样设置就可以了:

model.add(Conv1D(filters=23, kernel_size=4, activation='relu'))

model.add(AveragePooling1D(2, strides=2))

另外,在卷积层后跟着全连接层的话,中间一般是要加flatten层,使数据输出为全连接层能接受的2维,否则的话可能网络结果是错的。

以上这篇解决Keras中CNN输入维度报错问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python全局变量操作详解
Apr 14 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
python计算二维矩形IOU实例
Jan 18 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
django rest framework serializers序列化实例
May 13 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
python基础之//、/与%的区别详解
Jun 10 Python
Python字符串split及rsplit方法原理详解
Jun 29 #Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 #Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
Jun 29 #Python
使用keras时input_shape的维度表示问题说明
Jun 29 #Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 #Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 #Python
Python建造者模式案例运行原理解析
Jun 29 #Python
You might like
PHP编码转换
2012/11/05 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
yii2实现 "上一篇,下一篇" 功能的代码实例
2017/02/04 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
年度考核自我鉴定
2014/02/02 职场文书
部队万能检讨书
2014/02/20 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
少先队中队工作总结
2015/08/14 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript