2

我想用tf2.keras获取中间子模型层的输出。这里是一个由两个子模块组成的模型:

    input_shape = (100, 100, 3)



    def model1():
        input = tf.keras.layers.Input(input_shape)
        cov = tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=1,name='cov1')(input)
        embedding_model = tf.keras.Model(input,cov,name='model1')
        return embedding_model


    def model2(embedding_model):

        input_sequence = tf.keras.layers.Input((None,) + input_shape)

        sequence_embedding = tf.keras.layers.TimeDistributed(embedding_model,name='time_dis1')

        emb = sequence_embedding(input_sequence)
        att = tf.keras.layers.Attention()([emb,emb])
        dense1 = tf.keras.layers.Dense(64,name='dense1')(att)
        outputs = tf.keras.layers.Softmax()(dense1)

        final_model = tf.keras.Model(inputs=input_sequence, outputs=outputs,name='model2')
        return final_model

    embedding_model = model1()

    model2 = model2(embedding_model)
    print(model2.summary())

输出:

Model: "model2"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            [(None, None, 100, 1 0                                            
__________________________________________________________________________________________________
time_dis1 (TimeDistributed)     (None, None, 98, 98, 896         input_2[0][0]                    
__________________________________________________________________________________________________
attention (Attention)           (None, None, 98, 98, 0           time_dis1[0][0]                  
                                                                 time_dis1[0][0]                  
__________________________________________________________________________________________________
dense1 (Dense)                  (None, None, 98, 98, 2112        attention[0][0]                  
__________________________________________________________________________________________________
softmax (Softmax)               (None, None, 98, 98, 0           dense1[0][0]                     
==================================================================================================
Total params: 3,008
Trainable params: 3,008
Non-trainable params: 0

然后,我想得到model1和model2的输出中间层:

    model1_output_layer = model2.get_layer('time_dis1').layer.get_layer('cov1')
    output1 = model1_output_layer.get_output_at(0)
    output2 = model2.get_layer('dense1').get_output_at(0)

    output_tensors = [output1,output2]
    model2_input = model2.input
    submodel = tf.keras.Model([model2_input],output_tensors)
    input_data2 = np.zeros((1,10,100,100,3))

    result = submodel.predict([input_data2])
    print(result)

在 tf2.3 中运行,我得到的错误是:

  File "/Users/bouluoyu/anaconda/envs/tf2/lib/python3.6/site-packages/tensorflow/python/keras/engine/functional.py", line 115, in __init__
    self._init_graph_network(inputs, outputs)
  File "/Users/bouluoyu/anaconda/envs/tf2/lib/python3.6/site-packages/tensorflow/python/training/tracking/base.py", line 457, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "/Users/bouluoyu/anaconda/envs/tf2/lib/python3.6/site-packages/tensorflow/python/keras/engine/functional.py", line 191, in _init_graph_network
    self.inputs, self.outputs)
  File "/Users/bouluoyu/anaconda/envs/tf2/lib/python3.6/site-packages/tensorflow/python/keras/engine/functional.py", line 931, in _map_graph_network
    str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(None, 100, 100, 3), dtype=float32) at layer "cov1". The following previous layers were accessed without issue: ['time_dis1', 'attention', 'dense1']

但以下代码有效:

    model1_input = embedding_model.input
    model2_input = model2.input

    submodel = tf.keras.Model([model1_input,model2_input],output_tensors)

    input_data1 = np.zeros((1,100,100,3))
    input_data2 = np.zeros((1,10,100,100,3))

    result = submodel.predict([input_data1,input_data2])

    print(result)

但不是我想要的。这很奇怪,model1是model2的一部分,那么为什么我们需要输入一个额外的张量。有时,很难得到一个额外的张量,尤其是对于复杂的模型。

4

0 回答 0