2017-05-24 46 views
1

我试图用for循环分隔kerasConv2D图层的每个输出,然后通过Functional API向它添加另一图层,但出现类型错误。该代码是:Keras:功能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之一。我怎样才能解决这个问题?任何帮助将深表感谢!

回答

0

由于我已将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

0

我想你的意思是:

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

你的代码将整个矢量z与所有层为输入到Activation这Keras不知道如何处理。

+0

实际上,我希望整个堆栈有一个ReLU激活,我想只调用'z'就足够了。我后来意识到我的错误,并在行out = Activation('relu')()之前添加了'z = keras.layers.concatenate([z [i] for i in range(0,k)],axis = 1)'( z)',它运作完美。 – Prabaha