Keras:功能性 API -- 图层数据类型错误

Keras: Functional API -- Layer Datatype Error

我正在尝试使用 for 循环分离 keras Conv2D 层的每个输出,然后通过 Functional API 向其添加另一个层,但我出现类型错误。代码是:

import keras
from keras.models import Sequential, Model
from keras.layers import Flatten, Dense, Dropout, Input, Activation
from keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2D
from keras.layers.merge import Add
from keras.optimizers import SGD
import cv2, numpy as np
import glob
import csv

def conv_layer:
    input = Input(shape=(3,224,224))
    k = 64
    x = np.empty(k, dtype=object)
    y = np.empty(k, dtype=object)
    z = np.empty(k, dtype=object)
    for i in range(0,k):
        x[i] = Conv2D(1, (3,3), data_format='channels_first', padding='same')(input)
        y[i] = Conv2D(1, (3,3), data_format='channels_first', padding='same')(x[i])
        z[i] = keras.layers.add([x[i], y[i]])
    out = Activation('relu')(z)
    model = Model(inputs, out, name='split-layer-model')

    return model

但是,它抛出以下错误:

Traceback (most recent call last):
  File "vgg16-local-connections.py", line 352, in <module>
    model = VGG_16_local_connections()
  File "vgg16-local-connections.py", line 40, in VGG_16_local_connections
    out = Activation('relu')(z)
  File "/Users/klab/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 519, in __call__
    input_shapes.append(K.int_shape(x_elem))
  File "/Users/klab/anaconda2/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 409, in int_shape
    shape = x.get_shape()
AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'

因此,z 的数据类型与 Functional API 的数据类型不匹配。我怎样才能解决这个问题?任何帮助将不胜感激!

我想你的意思是:

out = Activation('relu')(z[k - 1])

您的代码将所有层的整个向量 z 设置为 Activation 的输入,Keras 不知道如何处理。

因为我已经将 z[i]-s 定义为单独的层,所以我认为 z 实际上是那些 z[i]-s 的堆栈。但是,它们基本上必须连接起来才能形成我想要的堆栈,

z = keras.layers.concatenate([z[i] for i in range (0,k)], axis=1)
out = Activation('relu')(z)

因为我使用的是 data_format='channels_first',所以连接是用 axis=1 完成的,但是对于更常见的 data_format='channels_last',连接必须用 axis=3 完成.