在keras中merge([x1, x2], mode=’concat’, concat_axis=channel_axis)时报了如下一个错
Traceback (most recent call last):
File "F:/visual/SSsearch/ineptionV4.py", line 215, in
model = create_model(5)
File "F:/visual/SSsearch/ineptionV4.py", line 140, in create_model
x = stem(input)
File "F:/visual/SSsearch/ineptionV4.py", line 28, in stem
x = merge([x1, x2], mode='concat', concat_axis=channel_axis)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\legacy\layers.py", line 458, in merge
name=name)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\legacy\layers.py", line 110, in __init__
node_indices, tensor_indices)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\legacy\layers.py", line 190, in _arguments_validation
'Layer shapes: %s' % (input_shapes))
ValueError: "concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 73, 73, 64), (None, 73, 73, 96)]
在这个问题主要是3维输入数组结构造成的,知乎专栏有一篇也是讲这个,地址是https://zhuanlan.zhihu.com/p/29673286,但事实上他的解决方法是比较表面的,下面就分析一下原因。
首先keras以tensorflow为后端时channel_axis要赋值为-1,以theano为后端时要赋值为1。这两个后端处理时数组的顺序是不一样的,tensorflow里就是正常逻辑299*299*3,相当于3通道,尺寸是299*299的图像数据,而在theano里则是3*299*299。
配置文件里的属于后端顺序,如果后端为tensorflow,前端输入成3*299*299,又强行把后端改成first,这样虽然也能跑通,但是只是为了看结果,没分析到本质。事实上也不用在json文件里修改,调用keras.backend.image_data_format()即可。
造成这个问题的根本原因其实是在输入3维数据时,必须输入特定形式的数据结构。
比如现在要求的输入矩阵是299*299*3的,那numpy array的形状应该是这样的一个二维数组[[x1,x2,x3],[x4,x5,6]…….],我只写出一行,相当于一共299行,每一行的长度是299。
而当传入这样的数据时就会报错[[(299*299)], [299*299], [299*299]],(299*299)代表里面是长宽都是299的矩阵。