2017-08-01 80 views
0

我想能夠幾層在一起,但指定如下面的輸入,東西之前:如何鏈/組成層中keras 2官能API,而不指定輸入(或輸入形狀)

# conv is just a layer, no application 
conv = Conv2D(64, (3,3), activation='relu', padding='same', name='conv') 
# this doesn't work: 
bn = BatchNormalization()(conv) 

請注意,如果可以避免,我不想指定輸入或其形狀,但我希望在稍後的時間將它用作多個輸入的共享層。

有沒有辦法做到這一點?上述提供了以下錯誤:

>>> conv = Conv2D(64, (3,3), activation='relu', padding='same', name='conv') 
>>> bn = BatchNormalization()(conv) 
Traceback (most recent call last): 
    File "/home/mitchus/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/topology.py", line 419, in assert_input_compatibility 
    K.is_keras_tensor(x) 
    File "/home/mitchus/anaconda3/envs/tf/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 393, in is_keras_tensor 
    raise ValueError('Unexpectedly found an instance of type `' + str(type(x)) + '`. ' 
ValueError: Unexpectedly found an instance of type `<class 'keras.layers.convolutional.Conv2D'>`. Expected a symbolic tensor instance. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/mitchus/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/topology.py", line 552, in __call__ 
    self.assert_input_compatibility(inputs) 
    File "/home/mitchus/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/topology.py", line 425, in assert_input_compatibility 
    str(inputs) + '. All inputs to the layer ' 
ValueError: Layer batch_normalization_4 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.convolutional.Conv2D'>. Full input: [<keras.layers.convolutional.Conv2D object at 0x7f3f6e54b748>]. All inputs to the layer should be tensors. 

拼搶卷積層的輸出不會做的伎倆之一:

>>> bn = BatchNormalization()(conv.output) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/mitchus/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/topology.py", line 941, in output 
    ' has no inbound nodes.') 
AttributeError: Layer conv has no inbound nodes. 

回答

1

試試這個:

def create_shared_layers(): 
    layers = [ 
     Conv2D(64, (3,3), activation='relu', padding='same', name='conv'), 
     BatchNormalization() 
    ] 
    def shared_layers(x): 
     for layer in layers: 
      x = layer(x) 
     return x 
    return shared_layers 

後來,你可以做類似:

shared_layers = create_shared_layers() 
... 
h1 = shared_layers(x1) 
h2 = shared_layers(x2) 
+0

聰明的解決方法! :)我想知道是否有更多的「慣用」方式,但似乎這應該是一種自然的功能。 – mitchus