ValueError: Graph disconnected: cannot obtain value for tensor Tensor in keras, how can I fix it?

Viewed 155

I try to build a model that looks like a encoder-decoder model, but the difference is that I use the same LSTM model in both for loops.

To merge hidden states from t-1 and t-2, I built a middle layer called MyLayer. But following error always raises:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("lstm_layer_18/Identity_1:0", shape=(8, 128), dtype=float32) at layer "my_layer". The following previous layers were accessed without issue: ['input_1', 'embedding', 'input_3', 'input_2', 'lambda1', 'reshape1']

I tried whole afternoon debugging, but couldn't figured out.

I find most of answers is about avoiding Input layer names for intermediate parameters. But this method does not work for me.

I try to print out "lstm_layer_18/Identity_1:0" in the error, which is the state_h in the second for loop. But I can not fix it. Can anyone help me find error? My code is showed down below.

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        assert isinstance(input_shape, list)
        # 为该层创建一个可训练的权重
        self.kernel_1 = self.add_weight(name='kernel_1',
                                        shape=input_shape[0],
                                        initializer='uniform',
                                        trainable=True)

        self.kernel_2 = self.add_weight(name='kernel_2',
                                        shape=input_shape[1],
                                        initializer='uniform',
                                        trainable=True)

        super(MyLayer, self).build(input_shape)  # 一定要在最后调用它

    def call(self, v):
        assert isinstance(v, list)
        a, b = v
        return Add()([Multiply()([a, self.kernel_1]),
                      Multiply()([b, self.kernel_2])])

    def compute_output_shape(self, input_shape):
        assert isinstance(input_shape, list)
        shape_a, shape_b = input_shape
        assert shape_a == shape_b
        return shape_a


def cf_lstm_model(input_step, output_step, features=2, embed_dim=64, lstm_dim=128, batch_size=8):
    # input_shape:(batch_size, input_step, features)
    x = Input(batch_shape=(batch_size, input_step, features))
    h_1 = Input(batch_shape=(batch_size, lstm_dim))
    h_2 = Input(batch_shape=(batch_size, lstm_dim))
    c = Input(batch_shape=(batch_size, lstm_dim))
    state_c = c

    embedding = Dense(embed_dim, activation='relu', name='embedding')
    inverse_embedding = Dense(features, activation='relu', name='inverse_embedding')
    lstm_layer = LSTM(lstm_dim, activation='relu', return_state=True, name='lstm_layer')
    cascade = MyLayer(lstm_dim)
    # decoder = LSTM(lstm_dim, activation='relu', return_state=True, name='decoder')

    # embeding ---> (batch_size, input_step, embed_dim)
    emb_x = embedding(x)

    # cascade_input
    cascade_input = [h_2, h_1]

    # Observe
    for i in range(input_step - 1):
        h_star = cascade(cascade_input)
        m = Lambda(lambda xx: xx[:, i, :], name='lambda1')(emb_x)
        m1 = Reshape((1, embed_dim), name='reshape1')(m)
        lstm1, state_h, state_c = lstm_layer(m1, [h_star, state_c])
        cascade_input.pop()
        cascade_input.append(state_h)

    out = Lambda(lambda xx: xx[:, input_step - 1, :], name='lambda2')(emb_x)
    out = Reshape((1, embed_dim), name='reshape2')(out)
    # Predict
    for j in range(output_step):
        h_star = cascade(cascade_input)
        out, state_h, state_c = lstm_layer(out, [h_star, state_c])
        # print('state_h', state_h)
        print('state_c', state_c)

        out = inverse_embedding(out)
        if j == 0:
            all_outputs = Reshape((1, features), name='reshape3')(out)
        #             print('output shape:', out.shape, K.int_shape(out))
        else:
            # 注意axis的纬度
            all_outputs = K.concatenate([all_outputs, Reshape((1, features))(out)], axis=1)
        #             print('output shape:', K.int_shape(outputs))
        cascade_input.pop()
        cascade_input.append(state_h)
        out = embedding(out)
        out = Reshape((1, embed_dim), name='reshape4')(out)
    #         print('out', out.shape)

    return Model(inputs=[x, h_1, h_2, c], outputs=all_outputs)


cf_lstm = cf_lstm_model(input_step=8,
                        output_step=12,
                        embed_dim=64,
                        lstm_dim=128)

Error Feedback

state_c Tensor("lstm_layer_7/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_8/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_9/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_10/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_11/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_12/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_13/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_14/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_15/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_16/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_17/Identity_2:0", shape=(8, 128), dtype=float32)
state_c Tensor("lstm_layer_18/Identity_2:0", shape=(8, 128), dtype=float32)

Traceback (most recent call last):
  File "/Users/duoshaoshishi/Desktop/Pedestrian prediction/CF-lstm/model.py", line 105, in <module>
    cf_lstm = cf_lstm_model(input_step=8,
  File "/Users/duoshaoshishi/Desktop/Pedestrian prediction/CF-lstm/model.py", line 102, in cf_lstm_model
    return Model(inputs=[x, h_1, h_2, c], outputs=all_outputs)
  File "/Users/duoshaoshishi/opt/anaconda3/envs/tf2/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 167, in __init__
    super(Model, self).__init__(*args, **kwargs)
  File "/Users/duoshaoshishi/opt/anaconda3/envs/tf2/lib/python3.8/site-packages/tensorflow/python/keras/engine/network.py", line 173, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/Users/duoshaoshishi/opt/anaconda3/envs/tf2/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py", line 456, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "/Users/duoshaoshishi/opt/anaconda3/envs/tf2/lib/python3.8/site-packages/tensorflow/python/keras/engine/network.py", line 306, in _init_graph_network
    nodes, nodes_by_depth, layers, _ = _map_graph_network(
  File "/Users/duoshaoshishi/opt/anaconda3/envs/tf2/lib/python3.8/site-packages/tensorflow/python/keras/engine/network.py", line 1787, in _map_graph_network
    raise ValueError('Graph disconnected: '
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("lstm_layer_18/Identity_1:0", shape=(8, 128), dtype=float32) at layer "my_layer". The following previous layers were accessed without issue: ['input_1', 'embedding', 'input_3', 'input_2', 'lambda1', 'reshape1']
0 Answers
Related