ValueError:图已断开连接:无法获取喀拉拉石中的张量Tensor的值,如何解决?

时间:2020-09-20 10:13:42

标签: python tensorflow keras

我尝试构建一个看起来像编码器/解码器模型的模型,但是区别在于,我在两个for循环中都使用了相同的LSTM模型。

要合并t-1和t-2的隐藏状态,我建立了一个中间层MyLayer。但是总是会出现以下错误:

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']

我尝试了整个下午的调试,但找不到。

我发现大多数答案都是关于避免中间参数的输入层名称。但是这种方法对我不起作用。

我尝试打印出错误中的"lstm_layer_18/Identity_1:0",这是第二个for循环中的state_h。但是我无法解决。谁能帮我发现错误?我的代码如下所示。

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)

错误反馈

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 个答案:

没有答案