2017-05-24 5 views
1

forループを使用してkerasConv2Dレイヤーの出力をそれぞれ別々にして、Functional APIで別のレイヤーを追加しようとしましたが、タイプエラーが発生します。コードは次のとおりです。Keras: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のものと一致しません。これをどうすれば解決できますか?どんな助力も深く感謝します!

答えて

0

z[i] -sを別々の層として定義していたので、私はzが効果的にそれらのスタックであると考えました。しかし、私はdata_format='channels_first'を使用していたので、彼らは基本的に私が望んでいたスタックを作るために連結されなければならなかった、

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

、連結はaxis=1で行われていたが、data_format='channels_last'、より一般的なため、連結はして行う必要がありますaxis=3

0

私はあなたが意味を考える:

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

あなたのコードはKerasが処理方法を知らないActivationに入力するすべての層で全体のベクトルzを設定します。

+0

実際には、スタック全体がReLUのアクティブ化をしたかったので、 'z'を呼び出すだけで十分だと思っていました。私は後で間違いを認識し、 'out = Activation( 'relu')行の前に' z = keras.layers.concatenate([z(i、範囲)(0、k)]、axis = 1) z) '、それは完全に働いた。 – Prabaha