解决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实现CET查分的方法
Mar 10 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
Feb 23 Python
python解压zip包中文乱码解决方法
Nov 27 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Django自带的用户验证系统实现
Dec 18 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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/09/06 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
js 判断上传文件大小及格式代码
2013/11/13 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python数组定义方法
2016/04/13 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
python读写文件write和flush的实现方式
2020/02/21 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
购房意向书
2014/04/01 职场文书
安全演讲稿开场白
2014/08/25 职场文书
交通事故和解协议书
2014/09/25 职场文书
出纳岗位职责
2015/01/31 职场文书
课外活动总结
2015/02/04 职场文书
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
Python中npy和mat文件的保存与读取
2022/04/24 Python