换了个数据集图片训练,结果报错:
‘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
那么经历池化层的时候就不会被小数干扰了,但如果没有连接操作,就不需要考虑小数影响了。