报错:‘Concatenate’layer requires inputs with matching shapes expect for the concat axis. 解决思路

换了个数据集图片训练,结果报错:
‘Concatenate’layer requires inputs with matching shapes expect for the concat axis.Got inputs shapes:[(None,54,25,128),(None,54,24,256)]
在这里插入图片描述

其实就是concatenate运算出错,concatenate表示连接运算,将两个张量连接起来。
可以看到报错信息,两个张量的维度分别为:(None,54,25,128)(None,54,24,256),第一个是batch_size,最后一维卷积不同是没问题的,出问题的是第三维,后面一个张量的第三维比前一个小1,那就要看一下这个1跑到哪去了。

新的数据集图片尺寸和原来的数据集不同,图片尺寸是873*404。通过查看代码,发现是第7个卷积层的下的concatenate出的错。
用来连接的第一个张量前面有4个池化层,用来连接的第二个张量前面有5个池化层和一个上采样。

(1)看一下(None,54,25,128)是怎么来的:
由于经过一个池化层尺寸减半,且维数不能是小数,所以有:

第二维:
873/2 -> 436         池化层1
436/2 -> 218         池化层2
218/2 ->109          池化层3
109/2 -> 54          池化层4

第三维:
404/2 ->202          池化层1
202/2->101           池化层2
101/2->50            池化层3
50/2->25             池化层4

(2)同样的看一下(None,54,24,256)是怎么来的:
由上采样会将图片尺寸和特征扩张一倍,所以有:

第二维:
873/2 -> 436         池化层1
436/2 -> 218         池化层2
218/2 ->109          池化层3
109/2 -> 54          池化层4
54/2 -> 27           池化层5
27*2 -> 54           上采样

第三维:
404/2 -> 202          池化层1
202/2 -> 101          池化层2
101/2 -> 50           池化层3
50/2 -> 25            池化层4
25/2 -> 12            池化层5
12*2 -> 24            上采样

由此就很明了的看到问题的产生了,池化过程过滤了小数,上采样的过程也同样忽略了小数,因此导致连接的两个张量的第三维维数差了1,因此,想要形成链接,那么就要保持维度相同就行了。

我这里的问题,只要在上采样的上方的池化层就不产生小数就行了。

想了几个方法:
1、前面一个张量将多余的维度丢掉。
2、去掉或前移concatenate函数。
3、修改网络结构吧,毕竟原来的网络可能是按照原来输入的数据集设计的。
4、修改(reshape)数据集图片尺寸,使得池化层不产生小数。
尺寸具体设多少:(1)将新数据集reshape和原数据集一样大小。(2)数一下用来连接的两个张量前面的上采样前面有几个池化,那就取宽高都取2的池化层个数的指数倍,这样池化层尺寸除以2的时候就不会出现小数了。或者直接参照自己数据集的图片尺寸,找一个临近的2的指数就行,如果还是不够除,那就在这基础上再乘2,或者还是把连接函数前移或者去掉吧,图片太大不知道显卡吃不吃得消。

可能我描述的有些乱,只要自己按照每一层张量的变化拿个笔自己算一下就能找到原因了,像我的问题,只要reshape长宽为1024*512那么经历池化层的时候就不会被小数干扰了,但如果没有连接操作,就不需要考虑小数影响了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值